Back to skill

Security audit

Awesome Repo Builder

Security checks for vulnerabilities and agentic risk

Overview

The skill is mostly coherent, but its generated URL checker can make unrestricted outbound requests from the user's environment without clear warning or network safeguards.

Install only if you are comfortable with a scaffold generator that creates a live URL-checking script. Avoid running the generated verifier on untrusted README content or in CI/corporate networks unless you sandbox network access or add controls for private addresses, redirects, and explicit consent.

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

Warning
Location
scripts/create_awesome_repo.py:43
Finding

Server-Side Request Forgery in Generated URL Verifier

Content
View full analysis
list[str]: text = path.read_text(encoding="utf-8") urls = set() for match in re.finditer(r"\[([^\]]*)\]\(([^)\s]+)\)", text): url = match.group(2).strip() if url.startswith(("http://", "https://")): urls.add(url) for match in re.finditer(r"https?://[^\s>)]+", text): urls.add(match.group(0).rstrip(".,")) return sorted(urls) def check_url(url: str, timeout: int) -> dict[str, object]: request = urllib.request.Request( url, headers={"User-Agent": "Mozilla/5.0 (compatible; awesome-url-checker/1.0)"}, ) started = time.time() try: with urllib.request.urlopen(request, timeout=timeout) as response: status = int(response.status) final_url = response.geturl() ``` The extracted URLs are subsequently requested without destination validation: ```python urls = extract_urls(readme) if args.limit: urls = urls[: args.limit] print(f"Found {len(urls)} URLs") results = [] for index, url in enumerate(urls, 1): result = check_url(url, args.timeout) results.append(result) ``` ### Technical Analysis The generator embeds this code into the generated repository as `verify_urls.py`. The verifier treats every string beginning with `http://` or `https://` as safe and passes it directly to `urllib.request.urlopen()`. No controls prevent requests to: - Loopback addresses such as `127.0.0.1` or `[::1]` - Private network ranges - Link-local addresses - Cloud instance metadata endpoints - Reserved or multicast addresses - Internal DNS names - Nonstandard HTTP ports - Public URLs that redirect to an internal destination `urllib.request.urlopen()` follows HTTP redirects by defau ...[truncated 2230 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
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (5)

Credential Access

High
Category
Privilege Escalation
Confidence
60% confidence
Finding

Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Content

Scanner excerpt · scripts/create_awesome_repo.py (reported line 379)May include surrounding context.

python
return """url_verification_results.json
__pycache__/
.DS_Store
.env
"""

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill instructs the agent to research topics, run a local Python script, read generated files, and create repository content, which implies network access plus filesystem read/write operations. Because the skill does not declare any explicit tool scope or permission boundaries, an agent may over-assume allowed capabilities and perform broader actions than intended, increasing the risk of unintended file modification, data exposure, or unreviewed network access.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The instruction "Keep all content in the repository's chosen language" imposes a language constraint in natural-language guidance. Under the policy, forcing a specific language without user opt-in or an explicit justified locale constraint is a reportable violation.

Content

No source excerpt is available for this finding.

Autonomous Decision Making

Medium
Category
Excessive Agency
Confidence
75% confidence
Finding

Skill enables autonomous high-impact decisions without human-in-the-loop verification. Critical operations (destructive commands, financial transactions, data deletion) should require explicit user confirmation.

Content

Scanner excerpt · scripts/create_awesome_repo.py (reported line 22)May include surrounding context.

python
allowed by law.

You can copy, modify, distribute and perform the work, even for commercial
purposes, all without asking permission.

https://creativecommons.org/publicdomain/zero/1.0/
"""

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The generator writes a helper script that makes outbound HTTP(S) requests to every URL found in README.md, but the scaffolded repository does not provide an explicit privacy/network warning or consent prompt before those requests occur. This can surprise users, leak IP/network metadata to third-party sites, and be risky in restricted or sensitive environments where external connectivity is monitored or prohibited.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.