Back to skill

Security audit

Ket News Fetcher

Security checks for vulnerabilities and agentic risk

Overview

The skill is a news-to-PDF learning tool with no evidence of malicious behavior, but it has disclosure and quality gaps around translation, output paths, and dependencies.

Reasonable to install if you are comfortable with it fetching public BBC pages, sending extracted vocabulary words to Google Translate, and writing a generated PDF to a fixed workspace path. Do not rely on it for full article translations unless the implementation is updated, and prefer pinned dependencies for reproducible installs.

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

T08 · Insecure Dependencies

Warning
Location
SKILL.md:16
Finding

Unpinned Third-Party Python Dependencies

Content
View full analysis

Vulnerability Details

File Location: SKILL.md, lines 16–41
Vulnerability Type: Supply-chain risk caused by unpinned dependencies
Risk Level: Medium

Vulnerable Code

json
"install":
  [
    {
      "id": "pip",
      "kind": "pip",
      "package": "requests-html",
      "label": "Install requests-html (for JavaScript rendering)"
    },
    {
      "id": "pip",
      "kind": "pip",
      "package": "beautifulsoup4",
      "label": "Install beautifulsoup4"
    },
    {
      "id": "pip",
      "kind": "pip",
      "package": "fpdf2",
      "label": "Install fpdf2 (for PDF generation with Chinese support)"
    },
    {
      "id": "pip",
      "kind": "pip",
      "package": "reportlab",
      "label": "Install reportlab (fallback PDF generation)"
    }
  ]

Technical Analysis

The installation metadata specifies package names without exact versions or integrity hashes. Consequently, installation results depend on whichever package releases the configured Python package index serves at installation time.

This creates a supply-chain exposure because the code reviewed during this audit does not fully define the code that will ultimately be installed and executed. If a dependency release, maintainer account, distribution artifact, or package index is compromised, malicious package installation hooks or import-time code could execute within the Skill's runtime environment.

No evidence was found that the listed package names are typosquatted or currently malicious. The finding concerns the absence of reproducible version and integrity controls.

Attack Path

  1. An attacker compromises a listed dependency's publishing account, release process, distribution artifact, or package index.
  2. The attacker publishes a malicious release under the legitimate package name.
  3. A user installs the Skill dependencies from the unconstrained package declarations. 4 ...[truncated 887 chars]
Remediation
View remediation

Remediation Suggestions

  1. Pin every dependency to an exact, reviewed version rather than allowing unconstrained resolution.
  2. Maintain a lock file generated from a controlled environment and review dependency changes before updating it.
  3. Require cryptographic hashes for downloaded distributions, such as with pip install --require-hashes.
  4. Configure an explicit trusted package index or an internally controlled package mirror.
  5. Prefer reviewed wheel artifacts and disable source builds where operationally feasible.
  6. Add automated dependency vulnerability and provenance scanning to the release process.
  7. Remove reportlab from the installation list if it is not actually used as a fallback, thereby reducing supply-chain exposure.
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 (18)

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

This mismatch specifically hides external calls to Google Translate and an extra file-copy/write action to a fixed local path, while also overstating that full-text translations are included in the PDF. Undisclosed third-party transmission and hidden filesystem effects can expose scraped content or local data and violate operator trust, making this more serious than a simple documentation bug.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

This mismatch specifically hides external calls to Google Translate and an extra file-copy/write action to a fixed local path, while also overstating that full-text translations are included in the PDF. Undisclosed third-party transmission and hidden filesystem effects can expose scraped content or local data and violate operator trust, making this more serious than a simple documentation bug.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
89% confidence
Finding

The skill advertises capabilities that imply network access, shell execution, and file writing, but it does not declare any explicit tool scope or permissions. That increases the risk of overbroad execution in agent environments, because operators and users cannot accurately constrain what the skill is allowed to do before running it.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The description specifies that the PDF includes "全文翻译" and the rest of the document repeatedly defines the translation output as Chinese, but it does not offer users a language choice or explain why Chinese-only output is required. This is a natural-language locale policy concern because the skill appears to enforce a specific output language by default.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill states that it uses Google Translate API for real-time translation but does not warn users that article text or vocabulary may be transmitted to an external service. In a content-processing skill, undisclosed third-party data transfer is a real privacy and compliance risk, especially if the fetched or user-supplied text contains sensitive information.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

The module description states the skill purpose in Chinese, and the user-facing CLI strings throughout the file are also hard-coded in Chinese. This imposes a specific language/locale on users without offering a choice or documenting that the skill is intended only for a Chinese-speaking context.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest says the skill '抓取BBC News并生成Daily English News PDF,包含完整文章、全文翻译和80个词汇', implying BBC-focused retrieval and production of a PDF containing full articles, full translation, and a vocabulary list. In code, the SOURCES table includes News in Levels, BBC, and VOA, and later execution writes .txt files only; there is no PDF generation, translation, or 80-word vocabulary export implemented.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The parsing functions only collect link titles and URLs from listing pages and construct article records from anchor text. No subsequent logic visits each article URL to retrieve and save the full article content, so the output cannot contain the '完整文章' claimed in the manifest.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
99% confidence
Finding

The save_article function writes a .txt file containing title, source, level, URL, date, and article content/title fallback. There is no PDF renderer, no translation step, and no logic to produce the promised 80-word vocabulary list, so the delivered artifact materially differs from the advertised output.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

Per-word vocabulary terms are transmitted to a third-party translation service without warning or consent. While individual words seem low sensitivity, bulk vocabulary extracted from content can still reveal the subject matter of processed documents and may violate user expectations or policy requirements.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The translation target is fixed to zh-CN, and the file overall is designed around Chinese-language output. This enforces a specific locale without any visible user selection mechanism or documented justification for the constraint.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The manifest says the skill generates a PDF containing '完整文章、全文翻译和80个词汇' (full articles, full translation, and 80 words). Although a translate_text function exists, it is never used when assembling article data or writing the PDF; create_pdf only writes the English paragraphs and vocabulary translations.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script sends article text to Google Translate endpoints without explicit disclosure, consent, or configuration controls. Even though BBC content is public, silently transmitting fetched content to a third party creates a privacy, compliance, and data-governance risk, especially if the source or future inputs change to non-public text.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The paragraph translation request fixes the target language to zh-CN. This is a natural-language locale restriction applied automatically, with no apparent user choice or opt-in flow.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The script writes output to fixed paths in /tmp and then copies it into a hard-coded workspace directory without user confirmation or path validation. In an agent environment, automatic writes to predetermined locations can overwrite existing files, leak generated content across contexts, or violate least-astonishment and sandboxing expectations.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The skill description and main documentation state that the generated PDF includes '全文中文翻译' for each article, but the v6.4 changelog says '移除全文翻译部分' before v6.3 later says it was added. This creates active documentation-level contradiction about whether full-text translation is present, which can mislead users about the skill's actual output and intent.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
81% confidence
Finding

The comment says 'Remove any remaining non-ASCII except Chinese', but the logic ord(c) < 128 or ord(c) > 0x4e00 preserves all characters above 0x4e00, not specifically Chinese characters, and the else branch also keeps the character anyway. The documentation therefore does not match what the code actually filters.

Content

No source excerpt is available for this finding.

Intent-Code Divergence

Low
Category
Not specified by scanner
Confidence
95% confidence
Finding

The comment '翻译文章' indicates article translation should happen at this point, but the code immediately proceeds to append the article without calling translate_text or storing any translated content. This is an active contradiction between code documentation and actual behavior.

Content

No source excerpt is available for this finding.

Static analysis

No suspicious patterns detected.