Back to skill

Security audit

Multisource Intel Radar

Security checks for vulnerabilities and agentic risk

Overview

The skill is a disclosed RSS/news radar, but its feed fetcher accepts unvalidated feed URLs that could make it contact private network services or read local files from a crafted feed list.

Review this before installing if you plan to import OPML or feed lists from other people. Use only trusted feed URLs, avoid file:// or internal/private-network addresses, and consider adding URL validation or a domain allowlist before running the digest builder on untrusted inputs.

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

Error
Location
scripts/build_digest.py:100
Finding
Unrestricted Feed Fetching Enables Server-Side Request Forgery and Local File Access## Vulnerability Details **File Location**: `scripts/parse_opml.py:11-17`, `scripts/build_digest.py:10-18`, and `scripts/build_digest.py:100-103` **Vulnerability Type**: Server-Side Request Forgery (SSRF) and unsafe URL scheme handling **Risk Level**: High ### Vulnerable Code `scripts/parse_opml.py:11-17`: ```python for o in root.findall('.//outline'): url = o.attrib.get('xmlUrl') or o.attrib.get('url') if not url: continue title = o.attrib.get('text') or o.attrib.get('title') or url feeds.append((title.strip(), url.strip())) ``` `scripts/build_digest.py:10-18`: ```python def read_feeds(path): feeds = [] with open(path, 'r', encoding='utf-8') as f: for line in f: line = line.strip() if not line or '\t' not in line: continue title, url = line.split('\t', 1) feeds.append((title, url)) return feeds ``` `scripts/build_digest.py:100-103`: ```python req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'}) with urllib.request.urlopen(req, timeout=12) as r: xml_text = r.read().decode('utf-8', errors='ignore') feed_ok += 1 ``` ### Technical Analysis Feed URLs originate from user-supplied OPML or a feed-list file and are passed directly to `urllib.request.urlopen`. The implementation does not validate the URL scheme, hostname, resolved IP address, port, or redirect destination. Consequently, an attacker can supply URLs targeting loopback interfaces, private networks, link-local services, or cloud metadata endpoints. Because `urllib.request` supports URL schemes beyond HTTP and HTTPS, a `file://` URL may also read a locally accessible XML file. Automatic redirects can bypass a superficial hostname check unless every redirect target is independently validated. The 12-second timeout and `--max-feeds` limit constrain request duration and count but do not prevent access to prohibited destinations. Any retrieved content that is valid RSS, A ...[truncated 1817 chars]
Remediation
## Remediation Suggestions 1. **Restrict URL schemes** - Parse every URL with `urllib.parse.urlsplit`. - Permit only `https`, or `http` where explicitly required. - Reject `file`, `ftp`, `data`, and all other schemes. - Reject URLs containing embedded usernames or passwords. 2. **Block prohibited destinations** - Resolve the hostname before connecting. - Use Python's `ipaddress` module to reject loopback, private, link-local, multicast, reserved, and unspecified addresses. - Validate every returned DNS address rather than accepting the first safe-looking result. - Explicitly block known cloud metadata destinations. 3. **Control redirects** - Disable automatic redirects or use a custom redirect handler. - Reapply complete scheme, hostname, port, DNS, and IP validation to every redirect target. - Set a low maximum redirect count. 4. **Reduce DNS rebinding exposure** - Ensure the address validated is the address used for the connection. - Where the deployment permits it, enforce outbound network policy at the container, firewall, or proxy layer. 5. **Constrain response processing** - Enforce an allowlist of expected XML content types where practical. - Stream responses and stop after a configured maximum byte count rather than calling unbounded `read()`. - Apply strict connection and read timeouts. 6. **Prefer an explicit trust model** - Require user confirmation for newly imported domains. - Consider a domain allowlist for approved public feed providers. - Treat OPML and feed-list files as untrusted input. 7. **Add security tests** - Verify rejection of `file://`, loopback, private, link-local, IPv6-local, encoded-IP, credential-bearing, and nonstandard-port URLs. - Test public-to-private redirects and hostnames resolving to mixed public/private addresses.
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • 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
Findings (8)

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill describes capabilities that read local files, write output files, and fetch data from external sources, but it does not declare any explicit tool scope or permissions boundary. This is dangerous because an agent could perform broader file or network operations than the user expects, increasing the risk of unintended local data exposure or uncontrolled outbound requests.

Natural-Language Policy Violations

Medium
Confidence
86% confidence
Finding
The description and later workflow prescribe Chinese-language keywords and search combinations as defaults for operation, which effectively forces a specific language/locale behavior. Because no user opt-in, alternative locale, or justification for a region-specific constraint is provided, this is a natural-language language/locale policy concern.

Natural-Language Policy Violations

Medium
Confidence
90% confidence
Finding
These instructions hard-code Chinese search phrases for source discovery, which imposes a specific language/locale in the skill's operating instructions. The file does not explain that this is intended only for a China-market use case or provide a user-selectable alternative, so it qualifies as a policy issue.

Description-Behavior Mismatch

Medium
Confidence
93% confidence
Finding
The manifest describes a high-signal radar focused on C-end founders/operators across specific platforms with keyword-whitelist filtering around 创业, AI, 增长, and 金融. This feed file includes broad entertainment, gaming, consumer tech, science, photography, politics, and general news sources such as Epic Games, PlayStation, Vox, NASA, Magnum Photos, and multiple non-target personalities, which materially broadens the skill beyond the stated niche intelligence purpose.

Natural-Language Policy Violations

Medium
Confidence
97% confidence
Finding
The section titled "Digest format (CN)" requires output in Chinese, reinforced by Chinese-only bullet content. This is a natural-language locale constraint and the file does not indicate any user choice, opt-in, or justification for forcing that language.

Natural-Language Policy Violations

Medium
Confidence
96% confidence
Finding
The ranking heuristics explicitly boost content containing specific Chinese and English terms such as '模板', '步骤', '发布', '数据', 'framework', and 'playbook'. This imposes a language/locale preference in the skill's behavior without exposing a user choice or documenting it as a justified regional constraint.

Missing User Warnings

Low
Confidence
86% confidence
Finding
The skill instructs the agent to fetch from multiple third-party platforms and perform browser-based Xiaohongshu searches without warning the user that network access will occur or that query terms and browsing behavior may be transmitted externally. This reduces informed consent and can expose user interests, source lists, or operational research patterns to external services.

Natural-Language Policy Violations

Low
Confidence
83% confidence
Finding
This plain-text feed list includes a Chinese-language source name (量子位) alongside predominantly English feeds, but provides no natural-language context about language selection or locale expectations. Under the locale-policy rule, forcing or implicitly mixing a specific language without user choice can be a policy concern when no opt-in or justification is documented.

Static analysis

No suspicious patterns detected.