Back to skill

Security audit

RSS Sitemap

Security checks for vulnerabilities and agentic risk

Overview

The skill performs RSS and sitemap discovery, but it recommends broad reusable host execution that can fetch arbitrary URLs and read or overwrite user-chosen local files.

Review before installing. Use allow-once rather than allow-always, avoid exposing this to untrusted chat contexts, and only run it for domains and local files you intentionally choose. Do not grant persistent approval unless the execution policy can restrict arguments, network destinations, and output paths.

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 (2)

T09 · Insecure Skill Coding Practices

Error
Location
scripts/preprocess-rss-sitemap.js:97
Finding

Unrestricted URL Fetching Enables Server-Side Request Forgery

Content
View full analysis
controller.abort(), timeoutMs); try { const response = await fetch(url, { redirect: "follow", signal: controller.signal, headers: { "accept": "application/xml,text/xml,application/rss+xml,application/atom+xml,text/plain;q=0.8,*/*;q=0.2", "user-agent": "rss-sitemap-skill/1.0", }, }); const body = await response.text(); return { url, finalUrl: response.url || url, status: response.status, ok: response.ok, contentType: response.headers.get("content-type") || "", body, }; } finally { clearTimeout(timer); } } ``` Attacker-controlled sitemap directives in `robots.txt` are accepted as additional targets: ```js async function discoverRobotsSitemaps(origin, timeoutMs) { const robotsUrl = `${origin}/robots.txt`; const response = await fetchText(robotsUrl, timeoutMs); if (!response.ok) { return { resource: responseSummary(response, "robots"), urls: [] }; } const urls = []; for (const line of response.body.split(/\r?\n/)) { const match = line.match(/^\s*sitemap\s*:\s*(\S+)\s*$/i); if (match) { urls.push(normalizeUrl(match[1], origin)); } } return { resource: responseSummary(response, "robots"), urls: unique(urls) }; } ``` Nested sitemap locations are recursively fetched without restricting them to the original host: ```js async function processResource(url ...[truncated 3149 chars]
Remediation
View remediation

T05 · Unauthorized Access and Privilege Escalation

Error
Location
scripts/preprocess-rss-sitemap.js:62
Finding

Persistent Script Approval Permits Arbitrary Local File Reads and Overwrites

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • 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
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
Findings (5)

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

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

md
Use `scripts/preprocess-rss-sitemap.js` for deterministic pre-crawl discovery. It has no npm dependencies and uses Node's built-in `fetch`, so it requires Node.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The README’s instructional content is entirely in Portuguese, including operational and approval steps, and does not indicate that the user may choose another language. The policy for this audit flags forced language or locale usage when no opt-in or justification is provided.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding

The skill invokes a bundled Node.js script that performs outbound HTTP requests via built-in fetch, but the manifest does not declare any explicit tool scope such as allowed-tools or permissions. This creates a capability/visibility mismatch: the skill can drive network-enabled execution without clearly constraining or documenting that access, increasing the risk of unintended site access, overbroad scraping, or abuse if the skill is auto-selected.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
92% confidence
Finding

The skill description is broadly phrased to trigger on many site-targeted tasks such as search, crawl, scrape, monitor, or enumerate content for a named domain. Overly broad activation can cause the agent to invoke this skill in situations where network enumeration is unnecessary or more sensitive than intended, expanding attack surface and increasing the chance of unauthorized or policy-violating collection.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

The manifest describes checking sitemap.xml, sitemaps.xml, atom.xml, and rss.xml before crawling a site. In addition to those sources, the code explicitly fetches robots.txt and extracts Sitemap: directives, broadening discovery behavior beyond what the manifest claims.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.