Back to skill

Security audit

SEO Analyzer by G0atbot

Security checks for vulnerabilities and agentic risk

Overview

This SEO skill is mostly purpose-aligned, but its bundled analyzer can fetch arbitrary URLs from the host running it, including internal or metadata endpoints.

Review before installing if your agent runs inside a private network or cloud environment. Use it only for public websites, and prefer network egress controls or code changes that block loopback, private, link-local, and metadata addresses and cap response size.

Vulnerability Patterns
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (1)

T09 · Insecure Skill Coding Practices

Error
Location
seo-analyzer.js:26
Finding

Unrestricted Server-Side URL Fetching Enables SSRF

Content
View full analysis
{ const parsedUrl = new URL(url); const client = parsedUrl.protocol === 'https:' ? https : http; const options = { hostname: parsedUrl.hostname, path: parsedUrl.pathname + parsedUrl.search, method: 'GET', headers: { 'User-Agent': 'Mozilla/5.0 (compatible; SEO-Analyzer/1.0)' }, timeout: 10000 }; const req = client.request(options, (res) => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => resolve(data)); }); req.on('error', reject); req.on('timeout', () => reject(new Error('Request timeout'))); req.end(); }); } ``` The request target originates directly from the command-line argument: ```js async function main() { const url = process.argv[2]; if (!url) { console.log('Usage: node seo-analyzer.js '); console.log('Example: node seo-analyzer.js https://example.com'); process.exit(1); } // Add protocol if missing const fullUrl = url.match(/^https?:\/\//) ? url : `https://${url}`; try { log(colors.blue, `🔍 Analyzing ${fullUrl}...`); const html = await fetchPage(fullUrl); const results = analyzeHTML(html, fullUrl); printResults(results); } catch (error) { log(colors.red, `Error: ${error.message}`); process.exit(1); } } ``` ### Technical Analysis The command-line argument controls the hostname, port through the parsed URL, request path, query string, and whether the request uses HTTP or HTTPS. The application performs the request from its own network context without applying: - An approved-host allowlist. - Public-address validation. - DNS resolution and resolve ...[truncated 2624 chars]
Remediation
View remediation
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep

Static analysis

No suspicious patterns detected.