Back to skill

Security audit

SEO Audit Pro

Security checks for vulnerabilities and agentic risk

Overview

The skill performs real SEO-audit work, but its unrestricted URL fetching and overstated capability claims make it something users should review carefully before installing.

Install only if you are comfortable with the skill making outbound requests to URLs supplied in prompts and with article topics being sent to Anthropic when generation is used. Avoid using it on internal, localhost, staging, cloud metadata, or credential-bearing URLs unless the runtime provides network egress controls, and treat the advertised crawl/50+ check/AI-analysis claims as overstated.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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
Findings (2)

T09 · Insecure Skill Coding Practices

Warning
Location
seo_audit_skill.py:147
Finding

Unrestricted User-Controlled URL Fetching Enables Server-Side Request Forgery

Content
View full analysis
dict: """Fetch URL and return {html, status_code, error}.""" try: import requests resp = requests.get(url, headers={ "User-Agent": "Mozilla/5.0 (compatible; OpenClawSEOBot/1.0)" }, timeout=15) return {"html": resp.text, "status_code": resp.status_code, "error": None} except Exception as e: return {"html": "", "status_code": 0, "error": str(e)} ``` The function is invoked with the user-controlled audit and competitor URLs: ```python # Full audit print(f"Fetching {args.url}...") fetch = fetch_page(args.url) if fetch["error"]: print(f"ERROR: {fetch['error']}") sys.exit(1) if fetch["status_code"] != 200: print(f"WARNING: HTTP {fetch['status_code']} — partial audit") result = run_checks(fetch["html"], args.url, args.keyword, args.industry) if args.competitor: print(f"Fetching competitor {args.competitor}...") comp_fetch = fetch_page(args.competitor) if not comp_fetch["error"] and comp_fetch["status_code"] == 200: comp_result = run_checks(comp_fetch["html"], args.competitor, args.keyword, args.industry) ``` ### Technical Analysis Both `--url` and `--competitor` are passed directly to `requests.get()` without validation of: - URL scheme - Destination hostname - Resolved IP address - Destination port - Redirect destinations - Whether the destination belongs to a loopback, private, link-local, reserved, or cloud metadata network The `requests` library follows redirects by default. Consequently, even validating only the original hostname would not be sufficient: an attacker-controlled public endpoint could redirect the request to an internal destinatio ...[truncated 1792 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Note
Location
SKILL.md:24
Finding

Unpinned Runtime Dependencies Reduce Supply-Chain Integrity

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
  • MCP Tool PoisoningHidden Instructions, Unicode Deception, Parameter Description Injection
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
Findings (8)

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding

There is a material description-behavior mismatch. The core SEO-audit theme is accurate: the code does perform an SEO-style audit, produce a score, identify issues/quick wins, compare against a competitor, generate articles, and run industry-specific compliance scans. However, several headline claims are overstated. Most importantly, it does not crawl a website; it fetches only a single page per URL. It also does not implement anything close to 50+ checks as advertised. These are central product claims, not minor implementation details, so they constitute a mismatch. No major undeclared malicious or unrelated capability is present.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill advertises executable behavior that uses environment secrets, network access, and likely file output, but it does not declare any explicit tool scope or permissions boundary in the skill manifest. This increases the chance that an agent runtime grants broader capabilities than users expect, reducing transparency and making misuse of network access or API keys harder to govern.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill states that premium analysis uses Claude Haiku, but it does not clearly warn users that crawled website content may be transmitted to a third-party AI service. This is dangerous because users may submit internal, staging, credential-bearing, or otherwise sensitive pages without understanding that page contents could leave the local environment and be processed by an external provider.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
87% confidence
Finding

Broad invocation examples with generic phrases like 'Audit https://example.com' can cause over-triggering in agent environments, leading the skill to activate when a user did not intend a networked website fetch or external analysis. In an automated workflow, ambiguous activation increases the risk of unexpected outbound requests, accidental processing of sensitive URLs, or unreviewed use of premium/API-backed actions.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The manifest describes broad SEO article generation alongside multiple industries, implying general-purpose article support. However, the prompt hard-codes 'Written for homebuyers / real estate audience', so article generation behavior is materially narrower and mismatched with the skill's broader stated scope.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
86% confidence
Finding

The skill sends user-supplied article topics to Anthropic without an explicit just-in-time disclosure at the point of transmission. In this context, users may provide proprietary keywords, client names, campaign plans, regulated-industry terms, or other sensitive business content, which is then transferred to a third-party service unexpectedly.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
97% confidence
Finding

The module docstring says the skill will 'run 50+ SEO checks', and the run_checks docstring repeats that claim. The actual implementation only performs a relatively small set of checks across technical, on-page, schema, social, and compliance categories, so the inline documentation overstates what the code does.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
71% confidence
Finding

The usage examples and manifest framing suggest meaningful 'competitor gaps' analysis, but the code only compares which named checks pass on one site and not the other. That is a much narrower capability than the documentation implies, creating an intent-versus-implementation mismatch in the documented behavior.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.