Back to skill

Security audit

Content Watcher

Security checks for vulnerabilities and agentic risk

Overview

This RSS digest tool mostly matches its purpose, but it needs review because it fetches untrusted feed and article URLs without clear network safeguards.

Review this before installing if you may monitor internal, private, or sensitive feeds. Only add trusted public feed URLs, avoid rendering generated Markdown in permissive viewers, and ask the publisher to add URL allowlisting, private-network blocking, output escaping, dependency updates, and accurate documentation for unsupported delivery features.

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

T09 · Insecure Skill Coding Practices

Error
Location
bin/content-watcher.js:115
Finding

Unrestricted URL Fetching Enables Server-Side Request Forgery

Content
View full analysis
') .description('Add a source to monitor') .option('-n, --name ', 'Source name') .option('-t, --type ', 'Source type (rss|url)', 'rss') .action(async (url, options) => { const config = await loadConfig(); const source = { id: Date.now().toString(), url, name: options.name || url, type: options.type, addedAt: new Date().toISOString() }; ``` `bin/content-watcher.js:115-130` ```js const allArticles = []; for (const source of config.sources) { try { console.log(chalk.gray(`Fetching: ${source.name}`)); const articles = await rss.parse(source.url, config.maxItemsPerSource); for (const article of articles) { if (!options.all && config.seenUrls.includes(article.link)) { continue; } try { const content = await fetcher.extract(article.link); const summary = await summarizer.summarize(content || article.contentSnippet || ''); allArticles.push({ ``` `lib/rss.js:12-25` ```js async parse(url, limit = 10) { try { const feed = await this.parser.parseURL(url); return (feed.items || []).slice(0, limit).map(item => ({ title: item.title || 'Untitled', link: item.link || item.guid || '', contentSnippet: item.contentSnippet || item.content || '', pubDate: item.pubDate || item.isoDate || new Date().toISOString(), author: item.author || item.creator || 'Unknown' })); } catch (error) { throw new Error(`RSS parse failed: ${error.message}`); } } ``` `lib/fetch.j ...[truncated 3045 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
lib/digest.js:22
Finding

Untrusted Feed and Article Content Is Embedded into Markdown Without Escaping

Content
View full analysis
{ md += `## 📡 ${source}\n\n`; items.forEach((article, idx) => { md += `### ${idx + 1}. ${article.title}\n\n`; md += `**链接**: [阅读原文](${article.link}) \n`; md += `**作者**: ${article.author} \n`; md += `**时间**: ${this.formatDate(article.pubDate)} \n\n`; if (article.summary) { md += `**摘要**:\n${article.summary}\n\n`; } md += `---\n\n`; }); }); ``` ### Technical Analysis The digest generator directly interpolates source names, article titles, links, authors, and summaries into Markdown. These values are either supplied by the user or obtained from remote feeds and article pages. No Markdown escaping, HTML sanitization, control-character filtering, or output URL validation is performed. An attacker can therefore insert Markdown delimiters, raw HTML, headings, links, images, or line breaks that alter the structure and meaning of the generated digest. The article URL is placed directly inside a Markdown link destination. A crafted destination can break out of the expected syntax or use a dangerous scheme if the downstream renderer permits it. Raw HTML and remote images may also result in active content or tracking requests, depending on the Markdown renderer and its security policy. ### Attack Path 1. A victim monitors an attacker-controlled or compromised feed. 2. The attacker places crafted Markdown or HTML in an RSS title, author, article link, or article body. 3. Content Watcher retrieves the feed and article without treating these fields as untrusted output data. 4. The summarizer preserves selected attacker-controlled sentences, while metadata is used directly. 5. `Digest.generate()` concatenates the ...[truncated 1240 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • 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
96% confidence
Finding

The skill advertises RSS monitoring, AI summarization, and digest generation capabilities that static analysis indicates are not actually implemented. This can mislead users into trusting the tool with monitoring or automation tasks it does not perform, creating operational and security blind spots if users assume coverage, delivery, or local-only processing that is not real.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: axios==1.13.5 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
94% confidence
Finding

The lockfile pins axios 1.13.5, which the supplied advisory set flags for multiple high-severity issues including SSRF-related NO_PROXY bypasses and prototype-pollution-driven MITM/credential-theft scenarios. This skill fetches external RSS feeds, blogs, and news content, so an HTTP client vulnerability is directly relevant because it processes untrusted remote endpoints and redirects in normal operation.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: form-data==4.0.5 — 1 advisory(ies): CVE-2026-12143 (form-data: CRLF injection in form-data via unescaped multipart field names and f)

High
Category
Supply Chain
Confidence
81% confidence
Finding

form-data 4.0.5 is flagged for CRLF injection through unescaped multipart field names and filenames. This package is brought in through axios; if the skill ever submits multipart requests using attacker-influenced values, header or body structure manipulation could become possible, though the current skill description emphasizes fetching and summarization rather than uploads.

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
88% confidence
Finding

undici 7.22.0 is flagged for multiple high-severity HTTP parsing and request/response smuggling style issues. Because this skill ingests data from arbitrary external news, blog, and RSS sources, an HTTP client weakness in a content-fetching dependency materially increases risk of SSRF-adjacent abuse, cache poisoning, or malformed-response handling issues.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: axios==1.13.5 — 16 advisory(ies): CVE-2026-44494 (axios Vulnerable to Full Man-in-the-Middle via Prototype Pollution Gadget in `co); CVE-2026-44495 (axios Vulnerable to Credential Theft and Response Hijacking via Prototype Pollut); CVE-2025-62718 (Axios has a NO_PROXY Hostname Normalization Bypass that Leads to SSRF) +13 more

High
Category
Supply Chain
Confidence
99% confidence
Finding

A known-vulnerable axios dependency is a real security issue, especially in a content monitoring tool that retrieves attacker-controlled remote resources. The cited advisory set includes SSRF- and request-handling-related issues, which are particularly relevant here because feed URLs, redirects, proxy rules, or fetched content may be influenced by untrusted external sources.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
84% confidence
Finding

The documentation promotes writing digests to files and integrating with Feishu webhooks, email delivery, and cron scheduling without warning about sensitive content handling, persistence, or outbound transmission. In a content aggregation tool, summaries may include proprietary, personal, or sensitive material, so silent storage or auto-posting increases the risk of unintended disclosure.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
89% confidence
Finding

Fetched article bodies are sent directly to the summarizer with no user-visible disclosure or consent about outbound data flow. If the summarizer uses a remote AI API, this can leak contents from monitored sources, including internal or sensitive URLs a user may add, creating confidentiality and compliance risks.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The skill formats dates with the fixed 'zh-CN' locale and emits Chinese headings such as '每日资讯摘要', which forces a specific language/locale in generated output. This matches the policy-violation category because the file provides no user opt-in, configuration, or justification for restricting output to Chinese.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
86% confidence
Finding

The description says the skill is an "AI-powered content monitoring and summarization tool" that monitors feeds, blogs, and news sources, but it does not define any concrete trigger phrases, scope limits, or exclusion conditions. In a manifest/markdown context, this broad natural-language description could overlap with many generic monitoring or summarization requests and lead to unintended invocation.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
76% confidence
Finding

This code initializes a persistent config file under the user's home directory and writes monitored sources and seen URLs to it, but there is no user-facing disclosure at the point of first creation. Although the CLI later exposes the config path, the write itself is not accompanied by a prompt, log, comment, or other warning explaining that local state will be stored.

Content

No source excerpt is available for this finding.

Known Vulnerable Dependency: follow-redirects==1.15.11 — 1 advisory(ies): CVE-2026-40895 (follow-redirects leaks Custom Authentication Headers to Cross-Domain Redirect Ta)

Low
Category
Supply Chain
Confidence
84% confidence
Finding

follow-redirects 1.15.11 is flagged for leaking custom authentication headers across cross-domain redirects. In a content-watching tool that retrieves remote feeds and pages, redirected requests are expected behavior, so any use of Authorization or similar headers could expose secrets to attacker-controlled domains.

Content

No source excerpt is available for this finding.

Vague Triggers

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

This is a manifest file, so vague-trigger review applies. The description "AI-powered content monitoring and summarization" is very general and does not indicate what user intent, context, or trigger phrases should activate the skill, increasing the chance of unintended invocation from broad content-related requests.

Content

No source excerpt is available for this finding.

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
84% confidence
Finding

Using a caret version for rss-parser permits automatic upgrades to newer minor/patch releases, which can introduce supply-chain risk or unexpected behavior changes. In a tool that ingests remote content, dependency drift can become security-relevant if an upstream release is compromised or introduces parsing flaws.

Content

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

json
"author": "Claw",
  "license": "MIT",
  "dependencies": {
    "rss-parser": "^3.13.0",
    "axios": "^1.6.0",
    "cheerio": "^1.0.0-rc.12",
    "commander": "^11.1.0",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
98% confidence
Finding

The axios dependency is both unpinned and separately flagged as having known advisories, which makes version drift especially dangerous. Because this skill fetches remote RSS, blog, and news content, a vulnerable HTTP client can increase exposure to SSRF, proxy bypass, request manipulation, or response handling attacks.

Content

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

json
"license": "MIT",
  "dependencies": {
    "rss-parser": "^3.13.0",
    "axios": "^1.6.0",
    "cheerio": "^1.0.0-rc.12",
    "commander": "^11.1.0",
    "chalk": "^4.1.2",

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
80% confidence
Finding

Using a caret version for commander allows silent dependency changes over time, creating a modest supply-chain risk. While commander is not obviously high-risk in this metadata alone, CLI entry points are security-sensitive because argument parsing bugs or malicious upstream releases can affect execution behavior.

Content

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

json
"rss-parser": "^3.13.0",
    "axios": "^1.6.0",
    "cheerio": "^1.0.0-rc.12",
    "commander": "^11.1.0",
    "chalk": "^4.1.2",
    "ora": "^5.4.1"
  }

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
78% confidence
Finding

The chalk dependency is unpinned, which creates unnecessary supply-chain exposure even though it is primarily a terminal formatting library. The direct impact is limited, but any package executed in the runtime can become a compromise vector if a malicious or flawed release is pulled in.

Content

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

json
"axios": "^1.6.0",
    "cheerio": "^1.0.0-rc.12",
    "commander": "^11.1.0",
    "chalk": "^4.1.2",
    "ora": "^5.4.1"
  }
}

Unpinned Dependencies

Low
Category
Supply Chain
Confidence
79% confidence
Finding

The ora dependency is unpinned, allowing unreviewed minor or patch updates to be installed later. Although it is a UI/helper dependency, it still executes within the process and therefore contributes to the overall supply-chain attack surface.

Content

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

json
"cheerio": "^1.0.0-rc.12",
    "commander": "^11.1.0",
    "chalk": "^4.1.2",
    "ora": "^5.4.1"
  }
}

Static analysis

No suspicious patterns detected.