Back to skill

Security audit

IndexLift SEO Auditor

Security checks for vulnerabilities and agentic risk

Overview

The skill is a coherent SEO auditor, but it needs review because its crawler can fetch arbitrary network locations without enough safeguards.

Install only if you are comfortable running a local crawler against URLs you trust. Avoid auditing untrusted sites from a network that can reach internal services or cloud metadata endpoints, and consider adding URL allowlists, private-IP blocking, same-origin sitemap limits, timeouts, body-size limits, and dependency updates before use.

Vulnerability Patterns
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
  • 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 (3)

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/lib/utils.js:4
Finding

Unrestricted URL Fetching Enables Server-Side Request Forgery

Content
View full analysis
a.localeCompare(b)); url.search = ''; for (const [key, value] of sorted) { url.searchParams.append(key, value); } if (url.pathname.length > 1 && url.pathname.endsWith('/')) { url.pathname = url.pathname.slice(0, -1); } return url.toString(); } catch { return null; } } ``` ```js // scripts/lib/fetchers/http-fetcher.js:12-17 async function fetchOnce(url, { method = 'GET', headers = {}, body = undefined } = {}) { return fetch(url, { method, headers: buildHeaders(headers), body, redirect: 'manual', }); } ``` ```js // scripts/lib/fetchers/http-fetcher.js:19-58 export async function fetchWithRedirects(inputUrl, options = {}) { const redirectChain = []; let currentUrl = normalizeUrl(inputUrl); let redirects = 0; const method = options.method || 'GET'; const startedAt = Date.now(); if (!currentUrl) { throw new Error(`Invalid URL: ${inputUrl}`); } while (redirects <= (options.maxRedirects || MAX_REDIRECTS)) { const response = await fetchOnce(currentUrl, options); const headers = Object.fromEntries(response.headers.entries()); const locat ...[truncated 4711 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/lib/reporters/markdown.js:182
Finding

Untrusted Website Content Can Become Indirect Prompt Injection in Generated Reports

Content
View full analysis
extractText($(element))) .get(); } ``` ```js // scripts/lib/parsers/html-parser.js:436-469 const headingTexts = Object.values(headings).flat(); const questionHeadingCount = countQuestionLikeHeadings(headingTexts); const headingFrequency = headingTexts.reduce((acc, heading) => { const key = normalizedTextKey(heading); if (!key) return acc; acc[key] = (acc[key] || 0) + 1; return acc; }, {}); const repeatedHeadings = Object.entries(headingFrequency) .filter(([, count]) => count > 1) .map(([text, count]) => ({ text, count })); const trustMentions = [ ...new Set( bodyText .split(/(?<=[.!?])\s+/) .filter((line) => TRUST_PATTERN.test(line)) .map((line) => truncate(line, 120)) ), ]; const forms = $('form').length; const imageSignals = { missingDimensionsCount: images.filter((image) => !image.width || !image.height).length, modernFormatCount: images.filter((image) => ['webp', 'avif', 'svg'].includes(imageFormat(image.src))).length, }; const microdata = { itemtypeCount: $('[itemtype]').length, itempropCount: $('[itemprop]').length, }; const mainWordCount = wordCount(mainText); const bodyWordCount = wordCount(bodyText); const shortParagraphCount = paragraphs.filter((paragraph) => wordCount(paragraph) > 0 && wordCount(paragraph) < 8).l ...[truncated 8818 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/lib/fetchers/http-fetcher.js:12
Finding

Missing Request Timeouts and Response-Size Limits Permit Resource Exhaustion

Content
View full analysis
= 300 && response.status < 400 && location; redirectChain.push({ url: currentUrl, status: response.status, location, }); if (!isRedirect) { const text = method === 'HEAD' ? '' : await response.text(); return { url: inputUrl, finalUrl: currentUrl, status: response.status, ok: response.ok, headers, body: text, redirectChain, timingMs: Date.now() - startedAt, }; } currentUrl = location; redirects += 1; } throw new Error(`Too many redirects while fetching ${inputUrl}`); } ``` ### Technical Analysis The HTTP client does not pass an `AbortSignal` or apply a per-request deadline. A server may therefore delay headers or stream a response slow ...[truncated 1572 chars]
Remediation
View remediation
Vulnerability Patterns
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • System Prompt LeakageDirect Leakage, Indirect Extraction, Tool-Based Exfiltration
  • 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 (17)

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding

The declared description promises a comprehensive SEO auditing skill with technical SEO coverage and specific capabilities like robots.txt, sitemap, canonical, indexability, and separate Google/Yandex analysis. This code chunk does something materially narrower: it generates GEO-oriented content findings for AI-friendliness/answerability on a fetched page. While this could be a supporting part of an SEO audit, the supplied code does not implement the majority of the declared core capabilities and instead has a distinct primary focus on AI-oriented content structure rather than traditional technical SEO.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The description promises a comprehensive SEO auditing skill covering multiple technical SEO domains and search-engine-specific analysis. In contrast, this code chunk is narrowly focused on generating lightweight performance findings from parsed page HTML and resource counts. It does not implement robots.txt or sitemap validation, canonical/indexability analysis, search engine specific breakdowns, or report generation. While performance checks can be a supporting part of an SEO audit, the actual code shown has a much narrower purpose than the declared description, so this is a material description-behavior mismatch.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The declared description promises a broad SEO audit capability with detailed page analysis and reporting. The actual code chunk does not perform any SEO analysis or fetching of rendered content; it simply returns a hardcoded 'supported: false' response stating that browser rendering is not configured. This is a material mismatch in primary purpose and implemented capability, not merely an incomplete supporting detail.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: fast-xml-builder==1.1.0 — 1 advisory(ies): CVE-2026-44665 (fast-xml-builder allows attribute values with unwanted quotes to bypass maliciou)

High
Category
Supply Chain
Confidence
94% confidence
Finding

The lockfile pins fast-xml-builder 1.1.0, and the referenced advisory indicates improper escaping/handling of attribute values during XML generation. In an SEO auditor context, XML sitemap generation or rewriting is plausible, so attacker-controlled page metadata or URLs could become malformed or injected XML, potentially corrupting outputs or enabling downstream parser abuse.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: fast-xml-parser==5.5.1 — 3 advisory(ies): CVE-2026-33036 (fast-xml-parser affected by numeric entity expansion bypassing all entity expans); CVE-2026-41650 (fast-xml-parser XMLBuilder: XML Comment and CDATA Injection via Unescaped Delimi); CVE-2026-33349 (Entity Expansion Limits Bypassed When Set to Zero Due to JavaScript Falsy Evalua)

High
Category
Supply Chain
Confidence
97% confidence
Finding

The project directly depends on fast-xml-parser 5.5.1, which is flagged for entity expansion limit bypasses and XMLBuilder comment/CDATA injection. This skill’s purpose explicitly includes sitemap and robots-related validation, making untrusted XML input and generated XML outputs core functionality; that increases exploitability and makes parser/resource-exhaustion or output-injection issues operationally relevant.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: undici==7.22.0 — 16 advisory(ies): CVE-2026-1525 (Undici has an HTTP Request/Response Smuggling issue); CVE-2026-6733 (undici vulnerable to HTTP response queue poisoning via keep-alive socket reuse); CVE-2026-1527 (Undici has CRLF Injection in undici via `upgrade` option) +13 more

High
Category
Supply Chain
Confidence
86% confidence
Finding

Undici 7.22.0 is present transitively via cheerio and carries multiple HTTP parsing/request smuggling style advisories. Because an SEO auditor is likely to fetch remote pages, sitemaps, and robots.txt from arbitrary hosts, vulnerable HTTP client behavior can matter; however, exploitability depends on the runtime actually using the affected code paths and network patterns, so this is somewhat less direct than the XML issues.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: fast-xml-parser==5.5.1 — 3 advisory(ies): CVE-2026-33036 (fast-xml-parser affected by numeric entity expansion bypassing all entity expans); CVE-2026-41650 (fast-xml-parser XMLBuilder: XML Comment and CDATA Injection via Unescaped Delimi); CVE-2026-33349 (Entity Expansion Limits Bypassed When Set to Zero Due to JavaScript Falsy Evalua)

High
Category
Supply Chain
Confidence
98% confidence
Finding

The manifest includes fast-xml-parser version 5.5.1, which is flagged with multiple known advisories involving entity expansion limit bypasses and XML comment/CDATA injection. In an SEO auditor skill, parsing untrusted XML such as sitemaps, feeds, or robots-related XML inputs is core functionality, so a vulnerable XML parser is more dangerous because attacker-controlled XML could trigger denial of service or produce unsafe output corruption.

Content

No source excerpt is available for this finding.

Direct Prompt Extraction

High
Category
System Prompt Leakage
Confidence
85% confidence
Finding

Skill contains instructions that could directly expose system prompts, internal rules, or hidden instructions to users or external parties.

Content

Scanner excerpt · scripts/lib/crawler.js (reported line 50)May include surrounding context.

js
function robotsRuleApplies(rule, userAgent = '*') {
  const target = userAgent.toLowerCase();
  return rule.userAgents.some((agent) => agent === '*' || target.includes(agent));
}

function allowedByRobots(robots, urlPath, userAgent = '*') {

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
85% confidence
Finding

The skill instructs the agent to run a Node-based audit against arbitrary user-supplied URLs, which implies outbound network access, but the manifest declares no explicit tool scope or permissions. That creates an authorization and review gap: operators cannot clearly see or constrain that the skill will make network requests, increasing the chance of unintended access patterns or misuse.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

This code includes user-facing recommendation text that pushes a specific language/locale choice: lang="ru" for Russian-targeted pages. Under the policy, forcing a specific language without opt-in or explicit documented regional justification is a natural-language locale policy concern.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
81% confidence
Finding

The parser embeds many Russian- and English-specific regex patterns for anchors, calls to action, addresses, legal terms, regions, and related signals. This imposes implicit locale behavior on parsing outcomes for all inputs, but the file does not indicate that the skill is limited to RU/EN pages or that language selection is configurable.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 11)May include surrounding context.

json
"audit": "node scripts/run-audit.js"
  },
  "dependencies": {
    "chalk": "^5.0.0",
    "cheerio": "^1.2.0",
    "dayjs": "^1.11.0",
    "fast-xml-parser": "^5.5.1",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 12)May include surrounding context.

json
},
  "dependencies": {
    "chalk": "^5.0.0",
    "cheerio": "^1.2.0",
    "dayjs": "^1.11.0",
    "fast-xml-parser": "^5.5.1",
    "fs-extra": "^11.0.0"

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 13)May include surrounding context.

json
"dependencies": {
    "chalk": "^5.0.0",
    "cheerio": "^1.2.0",
    "dayjs": "^1.11.0",
    "fast-xml-parser": "^5.5.1",
    "fs-extra": "^11.0.0"
  },

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 14)May include surrounding context.

json
"chalk": "^5.0.0",
    "cheerio": "^1.2.0",
    "dayjs": "^1.11.0",
    "fast-xml-parser": "^5.5.1",
    "fs-extra": "^11.0.0"
  },
  "license": "MIT"

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
40% confidence
Finding

Dependencies lack version pinning, allowing potential malicious package updates. Consider pinning versions.

Content

Scanner excerpt · package.json (reported line 15)May include surrounding context.

json
"cheerio": "^1.2.0",
    "dayjs": "^1.11.0",
    "fast-xml-parser": "^5.5.1",
    "fs-extra": "^11.0.0"
  },
  "license": "MIT"
}

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
78% confidence
Finding

The string literal names generic anchors as examples using English and Russian ("read more" or "подробнее"), which embeds a specific locale into user-facing analysis text without any opt-in or locale-selection mechanism. This can conflict with language/locale policy expectations for neutral or user-selected output.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.