T09 · Insecure Skill Coding Practices
- Location
scripts/geo_audit.py:24- Finding
Unrestricted Server-Side Request Forgery Through User-Controlled Audit Targets
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a legitimate website audit tool, but it can make unvalidated requests to any user-supplied host, including internal network targets, so it should be reviewed before installation.
Install only if you are comfortable with the skill making outbound HTTP requests. Use it for domains you own or are authorized to test, avoid internal IPs or localhost targets, and run it in an environment with egress controls. Review the CI examples before copying them, especially quoting user-controlled variables.
scripts/geo_audit.py:24Unrestricted Server-Side Request Forgery Through User-Controlled Audit Targets
references/integrations.md:15Shell Command Injection in GitHub Actions Integration Example
scripts/geo_audit.py:10Unpinned Third-Party Dependency Installation Guidance
The skill documentation advertises executable scripts that perform network access and write output files, but it declares no explicit tool scope or permissions. In an agent environment, this can lead to overbroad execution where the skill is invoked with more capability than users or reviewers expect, increasing the chance of unintended external requests or local file modifications.
The description contains broad trigger phrases like 'use whenever the user mentions' several related topics, which can cause the skill to activate in contexts that do not require it. Over-triggering is risky because this skill performs website auditing actions, potentially causing unsolicited network access, scans of third-party domains, or report generation based on ambiguous user intent.
The docstring says this function checks whether core content is present in raw HTML, implying it analyzes the fetched response body. However, the code uses html.lower() even though no html variable exists, so it cannot perform the documented check and will fail at runtime rather than auditing page content.
The script performs HTTP requests to a fully user-controlled target (self.domain) without validation, allowing the runtime environment to be used as a network proxy to reach arbitrary hosts. In an agent or server context, an attacker could target internal IPs, localhost, cloud metadata endpoints, or other restricted services, turning a GEO audit into an SSRF primitive.
def check_https(self):
"""Check 4.2: HTTPS enforced."""
try:
http_resp = requests.get(f"http://{self.domain}", timeout=self.timeout, allow_redirects=False)
if http_resp.status_code in [301, 302] and 'https' in http_resp.headers.get('Location', ''):
return {"check": "HTTPS enforced", "status": "pass", "notes": "HTTP redirects to HTTPS"}
except:
This code performs HTTP requests to the target domain provided by the user, which is a network operation covered by the missing-warning rule for code files. Although the script's purpose is auditing websites, the code itself provides no confirmation prompt or user-facing disclosure at the point of access about contacting external systems and transmitting headers such as the User-Agent.