Back to skill

Security audit

AI DeepNews

Security checks for vulnerabilities and agentic risk

Overview

This skill coherently fetches public AI news, translates it to Chinese, and writes a local digest, with no evidence of hidden persistence, credential access, destructive behavior, or deception.

Install only if you are comfortable with the skill contacting public RSS feeds and Google Translate, and treat generated article text and links as untrusted external content. For safer use, run it in an isolated virtual environment, review links before opening them, and consider pinning dependencies before repeated or automated use.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • 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

Warning
Location
fetch_ai_news_improved.py:153
Finding
Untrusted RSS Content Is Emitted Without Safe Markdown or URL Handling<![CDATA[ ## Vulnerability Details **File Location**: `fetch_ai_news_improved.py:153-157, 217-221, 256` **Vulnerability Type**: Untrusted content injection into Markdown and agent-facing output **Risk Level**: Medium ### Vulnerable Code ```python title = entry.get("title", "无标题") link = entry.get("link", "") summary = entry.get("summary", entry.get("description", "")) # 清理 HTML 标签 summary = re.sub(r"<[^>]+>", "", summary).strip() ``` ```python for orig, trans in items: lines.append(f"**{trans['title']}**") if trans["summary"]: lines.append(f"> {trans['summary'][:200]}") if orig["link"]: lines.append(f"🔗 [原文链接]({orig['link']})") lines.append("") ``` ```python # 输出到 stdout(供 OpenClaw 读取) print(digest) ``` ### Technical Analysis Article titles, summaries, and links originate from remote RSS feeds and must therefore be treated as attacker-controlled input. The implementation removes HTML-like tags from summaries using a regular expression, but it does not: - Escape Markdown metacharacters in titles or summaries. - Prevent crafted content from terminating or restructuring existing Markdown. - Validate the scheme or destination of article URLs. - Delimit remote content as untrusted data before printing it for OpenClaw consumption. - Neutralize instruction-like text that could influence a downstream AI agent. The HTML-removal expression is not a general-purpose sanitizer and does not address Markdown injection. A malicious feed entry could insert headings, links, images, misleading formatting, or instruction-like content into `latest_digest.md` and stdout. The original link is interpolated directly into Markdown, allowing arbitrary schemes or deceptive destinations if supplied by the feed. This is especially relevant because the comment explicitly identifies stdout as an interface consumed by OpenClaw. If the downstream agent interprets fetched article text as instructions rather than inert content, the flaw can become an ind ...[truncated 1588 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Escape Markdown metacharacters in all untrusted titles and summaries before interpolation. 2. Normalize or remove control characters and bidirectional text-control characters. 3. Parse article URLs and enforce an explicit allowlist of schemes, preferably only `https`. 4. Consider restricting links to expected feed domains or clearly displaying the normalized destination hostname. 5. Reject malformed URLs, embedded credentials, and dangerous schemes such as `javascript:`, `data:`, and `file:`. 6. Clearly delimit fetched material as untrusted external content. 7. Ensure the consuming agent is instructed to treat digest entries strictly as data and never as executable instructions. 8. Where practical, use a structured output format such as JSON between the fetcher and the agent, and render Markdown only at the final presentation boundary. 9. Add tests using titles, summaries, and URLs containing Markdown delimiters, fake headings, nested links, control characters, and instruction-like payloads. ]]>

T08 · Insecure Dependencies

Note
Location
SKILL.md:51
Finding
Dependency Installation Is Not Fully Pinned or Integrity-Verified<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:51` **Vulnerability Type**: Non-reproducible and integrity-unverified dependency installation **Risk Level**: Low ### Vulnerable Code ```bash cd skills/aipm-news-digest && python3 -m venv venv && ./venv/bin/pip install feedparser googletrans==4.0.0-rc1 ``` ### Technical Analysis The documented installation command installs `feedparser` without an exact version. Although `googletrans` is constrained to `4.0.0-rc1`, the project provides no lockfile, hashes, or constraints for transitive dependencies. Consequently, installation results can vary over time as package releases and dependency resolution change. Python package installation may execute package build or installation logic under the privileges of the user running `pip`. If an upstream package, release, distribution artifact, or transitive dependency is compromised, the documented installation process provides no cryptographic hash policy to detect the substitution. The evidence does not establish that either named package is malicious. The issue is the absence of reproducible version and artifact verification controls. ### Attack Path 1. A maintainer or attacker compromises an applicable upstream package release, distribution artifact, or transitive dependency, or an incompatible future `feedparser` version is published. 2. A user follows the setup instructions at a later date. 3. `pip` resolves the unpinned or transitively unconstrained dependencies from the configured package index. 4. The altered package is downloaded without validation against project-maintained hashes. 5. Package installation or later import executes the compromised dependency code under the installing or running user's account. ### Impact Assessment If a resolved dependency is compromised, code could execute with the privileges of the user installing or running the skill. Potential access would generally include that user's readable files, writable files, env ...[truncated 299 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin all direct dependencies to reviewed, exact versions. 2. Generate and commit a lockfile or fully resolved requirements file covering transitive dependencies. 3. Record approved artifact hashes and install with hash verification, such as `pip install --require-hashes`. 4. Prefer a stable, maintained release over a release candidate when functionality permits. 5. Regularly review pinned dependencies for security advisories and apply controlled updates. 6. Use an isolated virtual environment with only the permissions required by the skill. 7. In automated environments, install from a trusted package index or approved internal mirror. ]]>
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • 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
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (5)

Lp3

Medium
Category
MCP Least Privilege
Confidence
82% confidence
Finding
The skill advertises setup and execution of a local Python script and references stateful features like deduplication and cache cleanup, which strongly imply local file read/write behavior, yet the manifest does not declare any tool scope or permissions. This weakens transparency and can lead users or hosting systems to grant broader access than intended, increasing the chance of unauthorized file access or unsafe execution assumptions.

Natural-Language Policy Violations

Medium
Confidence
93% confidence
Finding
The skill is designed to translate and output content in Chinese by default without presenting language choice or opt-in. This is primarily a consent and product-safety issue rather than a direct exploit path, but it can cause unintended external processing, user surprise, and policy or localization mismatches in environments where content handling must be explicitly approved.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The skill states it performs free translation via Google Translate but does not clearly warn users that fetched content will be sent to an external third-party service for processing. Even if the content comes from public RSS feeds, article text, prompts, or user-supplied additions may be transmitted off-platform, creating privacy, compliance, and data handling risks.

Missing User Warnings

Medium
Confidence
92% confidence
Finding
The script sends fetched article titles and summaries to `googletrans` for translation, which transmits third-party content to an external service without any disclosure, consent flow, or configuration to disable translation. While the content is news-derived rather than obviously sensitive, RSS feeds can still contain proprietary, private, or unexpectedly sensitive text, and silent exfiltration to a remote service creates a real privacy and compliance risk.

Natural-Language Policy Violations

Medium
Confidence
97% confidence
Finding
The code hard-codes the translation destination to Simplified Chinese and the file description states it translates news into Chinese. This imposes a specific language/locale without any visible user opt-in or configurable alternative, which matches the locale policy violation criteria.

Static analysis

No suspicious patterns detected.