Back to skill

Security audit

Seo Audit

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent SEO audit tool, but its live URL auditor can be used to make the agent probe internal or private web services from the agent environment.

Review before installing. Use the local build-output audit normally, but only run the live audit against public websites you control or trust. Do not point audit-live.mjs at localhost, private IPs, cloud metadata addresses, or attacker-supplied URLs until it adds private-network blocking, redirect validation, request timeouts, and response-size limits. Treat the CSP unsafe-inline style advice as a tradeoff, not a blanket production recommendation.

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/audit-live.mjs:13
Finding

Unrestricted Live-URL Requests Permit SSRF-Style Access to Internal Services

Content
View full analysis

Vulnerability Details

File Location: scripts/audit-live.mjs, lines 13–19 and 24–31
Vulnerability Type: Server-Side Request Forgery (SSRF) through unrestricted URL input and redirect following
Risk Level: Medium

Vulnerable Code

js
const base = process.argv[2];
const JSON_OUT = process.argv.includes('--json');
if (!base || !/^https?:\/\//.test(base)) {
  console.error('usage: node audit-live.mjs https://www.example.com [--json]');
  process.exit(2);
}
const origin = new URL(base).origin;

async function get(path) {
  try {
    const r = await fetch(origin + path, {
      redirect: 'follow',
      headers: { 'user-agent': 'seo-audit/1.0' }
    });
    const text = await r.text();
    return { status: r.status, headers: r.headers, text };
  } catch (e) {
    return {
      status: 0,
      headers: new Headers(),
      text: '',
      error: String(e)
    };
  }
}

Technical Analysis

The live auditor accepts any syntactically valid HTTP or HTTPS URL. It does not verify that the destination is a public website or reject loopback, private, link-local, IPv6-local, or cloud instance-metadata addresses.

The use of redirect: 'follow' creates an additional bypass: an initially public URL can redirect requests to a prohibited internal address. Because redirect destinations are not manually inspected and validated, validating only the original hostname would not be sufficient.

The script issues GET requests for the following fixed paths:

  • /robots.txt
  • /sitemap.xml
  • /llms.txt
  • /

It reads complete response bodies and uses response status, headers, robots policies, sitemap contents, canonical tags, and JSON-LD data to produce its report. This provides an attacker with limited probing capability against services accessible from the Agent's network environment.

The network access itself is necessary for the declared live SEO audit. However, access to arbitrary internal destinations exceeds the minimum privileges needed to aud ...[truncated 1536 chars]

Remediation
View remediation

Remediation Suggestions

  1. Require HTTPS by default. Reject plain HTTP unless the user explicitly enables a documented local-development mode.

  2. Reject non-public destinations. Resolve the hostname and block all loopback, private, link-local, multicast, unspecified, and reserved IPv4 and IPv6 ranges. At minimum, cover:

    • 127.0.0.0/8
    • 10.0.0.0/8
    • 172.16.0.0/12
    • 192.168.0.0/16
    • 169.254.0.0/16
    • 0.0.0.0/8
    • IPv6 loopback ::1
    • IPv6 link-local fe80::/10
    • IPv6 unique-local fc00::/7
    • IPv4-mapped IPv6 equivalents
    • Known cloud metadata destinations
  3. Handle redirects manually. Set redirect: 'manual', impose a small redirect limit, resolve every Location header, and repeat scheme, hostname, port, and resolved-address validation before each request.

  4. Mitigate DNS rebinding. Validate all resolved addresses immediately before connecting. Where feasible, pin the validated address for the request rather than allowing a second uncontrolled DNS resolution.

  5. Restrict ports. Permit only standard public web ports such as 443 by default. Require explicit user confirmation for nonstandard ports.

  6. Limit resource consumption. Add request timeouts, maximum response-body sizes, and content-type checks before reading full bodies.

  7. Require explicit authorization for private audits. If auditing internal or local sites is a legitimate use case, place it behind an explicit flag such as --allow-private-network and display a warning describing the expanded network privilege.

  8. Add regression tests. Verify rejection of direct private addresses, alternative numeric IP representations, IPv4-mapped IPv6 addresses, and public-to-private redirect chains.

Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Memory PoisoningPersistent Context Injection, Context Window Stuffing, Memory Manipulation
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (18)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 67)May include surrounding context.

md
- `scripts/audit-seo.mjs` — **on-disk auditor.** Runs the 12 hard-gate checks over a directory of built HTML + its local CSS/JS/images. Framework-agnostic. Node

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 81)May include surrounding context.

md
- `scripts/audit-seo.mjs` — **on-disk auditor.** Runs the 12 hard-gate checks over a directory of built HTML + its local CSS/JS/images. Framework-agnostic. Node

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 128)May include surrounding context.

md
- `scripts/audit-seo.mjs` — **on-disk auditor.** Runs the 12 hard-gate checks over a directory of built HTML + its local CSS/JS/images. Framework-agnostic. Node

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 154)May include surrounding context.

md
- `scripts/audit-seo.mjs` — **on-disk auditor.** Runs the 12 hard-gate checks over a directory of built HTML + its local CSS/JS/images. Framework-agnostic. Node

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 198)May include surrounding context.

md
- `scripts/audit-seo.mjs` — **on-disk auditor.** Runs the 12 hard-gate checks over a directory of built HTML + its local CSS/JS/images. Framework-agnostic. Node

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 68)May include surrounding context.

md
- `scripts/audit-live.mjs` — **live-URL auditor.** Checks the things only visible on a deployed origin: robots.txt policy (incl. per-AI-bot allow/deny), sitemap

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 88)May include surrounding context.

md
- `scripts/audit-live.mjs` — **live-URL auditor.** Checks the things only visible on a deployed origin: robots.txt policy (incl. per-AI-bot allow/deny), sitemap

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 129)May include surrounding context.

md
- `scripts/audit-live.mjs` — **live-URL auditor.** Checks the things only visible on a deployed origin: robots.txt policy (incl. per-AI-bot allow/deny), sitemap

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 138)May include surrounding context.

md
- `scripts/audit-live.mjs` — **live-URL auditor.** Checks the things only visible on a deployed origin: robots.txt policy (incl. per-AI-bot allow/deny), sitemap

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 155)May include surrounding context.

md
- `scripts/audit-live.mjs` — **live-URL auditor.** Checks the things only visible on a deployed origin: robots.txt policy (incl. per-AI-bot allow/deny), sitemap

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 199)May include surrounding context.

md
- `scripts/audit-live.mjs` — **live-URL auditor.** Checks the things only visible on a deployed origin: robots.txt policy (incl. per-AI-bot allow/deny), sitemap

Memory Manipulation

High
Category
Memory Poisoning
Confidence
80% confidence
Finding

Skill manipulates agent memory, state, or stored context. Memory corruption can alter personality, override safety rules, or cause unpredictable behavior.

Content

Scanner excerpt · references/geo-ai-visibility.md (reported line 93)May include surrounding context.

md
## 5. Content shape for AI extraction
Beyond infra, LLMs preferentially quote content that is:
- **Direct and factual** — lead with the answer, then elaborate (inverted pyramid). LLMs extract the first clear statement.
- **Well-structured** — real headings, lists, tables, definitions. A glossary/FAQ page is highly quotable.
- **Self-contained** — each page answers one question fully; don't require reading three pages to get the point.
- **Entity-explicit** — name the product/brand/category in text, not just images, so retrieval and attribution work.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill advertises trigger phrases such as '审计一下这个站的 SEO', '帮我把 SEO 分提上去', and similar generic requests that are common in normal assistant usage. Because these phrases are broad and map to routine website-help requests, the platform may invoke this skill unexpectedly, causing it to run in contexts the user did not explicitly intend and increasing the chance of unnecessary file inspection or network-facing audit actions.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
70% confidence
Finding

Without declared permissions the skill's intent is opaque and cannot be validated.

Content

No source excerpt is available for this finding.

Sudo/Root Execution

Medium
Category
Privilege Escalation
Confidence
70% confidence
Finding

Commands invoke sudo or root privileges. Verify this elevated access is necessary and justified.

Content

Scanner excerpt · SKILL.md (reported line 177)May include surrounding context.

md
- No shell-config or credential files
- No cron jobs or background processes

**Privilege:** runs as the current user, no sudo or elevated permission. Requires only Node ≥18 (global `fetch`).

**Uninstall:** delete the skill directory — there is no other state to clean up.

External Transmission

Medium
Category
Data Exfiltration
Confidence
50% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · references/geo-ai-visibility.md (reported line 83)May include surrounding context.

4. IndexNow — push freshness on deploy

IndexNow tells Bing/Yandex (and via Bing, Copilot) about new/changed URLs instantly instead of waiting for a crawl. One-time: host a key file at /{key}.txt. On each deploy, POST changed URLs:

text
POST https://api.indexnow.org/indexnow
Content-Type: application/json; charset=utf-8
{ "host": "www.example.com", "key": "<key>",
  "keyLocation": "https://www.example.com/<key>.txt",

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The playbook explicitly recommends loosening CSP with style-src 'unsafe-inline' to support inline critical CSS, while downplaying the trade-off as 'low risk'. Allowing unsafe inline styles weakens a defense-in-depth control and can make style injection attacks easier if any HTML injection or templating flaw exists elsewhere. In a broadly reusable SEO/performance skill, this guidance is more dangerous because users may copy it verbatim into production security policies without understanding safer CSP alternatives.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
92% confidence
Finding

This markdown file contains natural-language guidance solely in Chinese from title through body, and there is no indication that users may select another language or that the skill is intentionally limited to a Chinese-speaking audience. Under the policy, forcing a specific language without user opt-in is a natural-language policy concern.

Content

No source excerpt is available for this finding.