Back to skill

Security audit

Daily News Vnexpress

Security checks for vulnerabilities and agentic risk

Overview

The skill fetches VNExpress RSS news as described, but it also tells the agent to persist undefined user behavior in a local USERS.md file, which is broader than a news-fetching skill needs.

Review before installing. The news-fetching script itself is narrowly aimed at VNExpress RSS feeds, but the skill should remove or strictly gate the USERS.md behavior logging instruction, ask for explicit consent before storing preferences, and pin dependencies before routine use.

Vulnerability Patterns
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • 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)

T02 · Agent Memory Poisoning

Warning
Location
SKILL.md:42
Finding
Unscoped Persistent Storage of User Behavior<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md:42` **Vulnerability Type**: Persistent memory poisoning and privacy exposure **Risk Level**: Medium ### Vulnerable Code ```markdown 1. Ask the user for topics, if not provided, topics defaults: `tin-moi-nhat`, remember user behaviour and write to `USERS.md` ``` ### Technical Analysis The Skill directs the Agent to record unspecified “user behaviour” in a persistent `USERS.md` file. Persistent storage is not necessary to retrieve an RSS feed, and the instruction does not limit what may be recorded, require user consent, sanitize stored content, or define retention and deletion controls. Because “user behaviour” is undefined, an implementation may copy attacker-controlled or sensitive user content into durable Agent state. If that file is subsequently loaded as context or memory, stored text could influence later sessions. This crosses the least-privilege boundary of a stateless news-fetching operation and creates both privacy and memory-integrity risks. ### Attack Path 1. A user invokes the Skill and supplies a topic preference or related request containing crafted text. 2. Following `SKILL.md:42`, the Agent records the perceived behavior in `USERS.md`. 3. The content persists beyond the current news request. 4. If `USERS.md` is loaded in later sessions, the stored content may alter future Agent behavior or expose one user's preferences to another context. The exploitation path depends on the surrounding Agent actually implementing and later consuming `USERS.md`; the project does not itself contain code that performs this write. ### Impact Assessment The instruction may obtain persistent write access to Agent-managed memory even though only outbound RSS retrieval is required. Potential impact includes: - Retention of user preferences or other personal information without explicit consent. - Cross-session contamination of Agent behavior. - Persistent prompt or instruction injection if user- ...[truncated 258 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the instruction to record general user behavior; RSS retrieval should remain stateless by default. 2. If preference persistence is genuinely required, request explicit user consent before storing anything. 3. Store only a narrowly defined value, such as one allowlisted topic identifier, rather than free-form user text. 4. Validate stored values against the 18 supported topic names and reject instructions, markup, or arbitrary content. 5. Keep preference data separate from files interpreted as Agent instructions. 6. Define retention, access-control, and deletion mechanisms, including a way for users to inspect and erase saved preferences. 7. Avoid sharing a single preference file among unrelated users or sessions. ]]>

T08 · Insecure Dependencies

Note
Location
requirements.txt:1
Finding
Unpinned and Redundant Third-Party Dependencies<![CDATA[ ## Vulnerability Details **File Location**: `requirements.txt:1-4` **Vulnerability Type**: Uncontrolled dependency resolution **Risk Level**: Low ### Vulnerable Code ```text beautifulsoup4 bs4 requests feedparser ``` The installation instruction in `SKILL.md:21` consumes this file directly: ```bash pip install -r requirements.txt ``` ### Technical Analysis All dependencies are specified without exact versions or integrity hashes. Each installation can therefore resolve to a different package release from the configured package index. A future compromised, malicious, or incompatible release could execute code during installation or when imported by `main.py`. The dependency list also includes both `beautifulsoup4` and `bs4`. The `bs4` package is a compatibility package for Beautiful Soup rather than a separately required implementation, so installing both unnecessarily expands dependency resolution and supply-chain exposure. The audit did not establish that any currently resolved package is malicious. The confirmed issue is the absence of version and integrity controls, not a confirmed compromise. ### Attack Path 1. An operator follows `SKILL.md:21` and runs `pip install -r requirements.txt`. 2. The package installer queries its configured package index and resolves the latest versions available at that time. 3. If an upstream account, release, package index, or resolution path is compromised, an altered package can be installed. 4. Package installation hooks or imported package code execute with the privileges of the user running setup or invoking the Skill. 5. That code could access data and resources available to the Skill environment. This path requires a compromised dependency distribution channel or unsafe package-index configuration; no such compromise is present in the audited files. ### Impact Assessment Compromised dependency code would execute with the same privileges as the Skill process. Depending on its environment, that could ...[truncated 227 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Remove the redundant `bs4` dependency and retain only `beautifulsoup4`. 2. Pin every direct dependency to a reviewed exact version. 3. Generate a lock file containing resolved transitive dependencies and cryptographic hashes, for example with `pip-tools`. 4. Install with hash enforcement: ```bash python -m pip install --require-hashes -r requirements.lock ``` 5. Use a trusted, explicitly configured package index and prevent unintended fallback to untrusted indexes. 6. Periodically scan locked dependencies for known vulnerabilities and review updates before regenerating hashes. 7. Run installation and the Skill under a dedicated, non-privileged account with minimal filesystem and network access. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (15)

Missing User Warnings

High
Confidence
99% confidence
Finding
The markdown explicitly instructs the agent to write user behavior to USERS.md without warning, consent, or disclosure. Silent persistence of user-related data is a significant privacy issue because users requesting news would not reasonably expect local profiling or logging as part of that interaction.

Lp3

Medium
Category
MCP Least Privilege
Confidence
90% confidence
Finding
The skill invokes a Python script that performs network access, but the manifest does not declare any tool scope, permissions, or allowed-tools boundaries. This creates an authorization and transparency gap: an agent may execute network-capable code without explicit least-privilege controls or user-visible disclosure of that capability.

Natural-Language Policy Violations

Medium
Confidence
72% confidence
Finding
The description hard-codes VNExpress as the news source, and the instructions later restrict classification to a fixed Vietnamese topic list, which can impose a locale-specific source/taxonomy without user opt-in. The file does not explain this as a justified region-specific constraint or offer the user an alternative language/locale choice.

Vague Triggers

Medium
Confidence
94% confidence
Finding
The trigger 'latest news or trending global events' is broad and ambiguous relative to a single-source VNExpress RSS skill with a fixed topic taxonomy. Overbroad activation can cause the skill to run in contexts the user did not intend, leading to unnecessary network access and potentially invoking the unrelated logging instruction.

Description-Behavior Mismatch

Medium
Confidence
97% confidence
Finding
The instruction to 'remember user behaviour and write to USERS.md' exceeds the stated purpose of fetching news and introduces unnecessary persistence of user data. This is dangerous because it enables silent collection of behavioral information unrelated to the user’s request, increasing privacy and data-retention risk.

Context-Inappropriate Capability

Medium
Confidence
97% confidence
Finding
The skill contains an unrelated file-writing and user-tracking instruction that is not necessary for retrieving RSS headlines. Because it is embedded in operational steps, an agent may carry out covert data logging as part of a routine news task, violating user expectations and purpose limitation.

Ssd 3

Medium
Confidence
98% confidence
Finding
Retaining and recording user behavior in a file creates a natural-language data logging risk, especially in a skill whose purpose is only to fetch RSS headlines. The danger is amplified because the storage is framed as routine behavior, which can normalize unnecessary retention of potentially sensitive preference or interaction data.

Natural-Language Policy Violations

Low
Confidence
84% confidence
Finding
The code explicitly reconfigures standard output to UTF-8, imposing a specific encoding behavior. This is a natural-language policy concern because the file contains a human-readable instruction comment and implementation that force a locale/encoding choice without offering the user an option or documenting a justified regional constraint.

Intent-Code Divergence

Low
Confidence
98% confidence
Finding
The argparse description says 'Fetch latest news from BBC', while the implemented RSS template at L071 and overall logic clearly target https://vnexpress.net/rss/{topic}.rss. This is an active documentation contradiction about the source and intent of the skill.

Unpinned Dependencies

Low
Category
Supply Chain
Content
beautifulsoup4
bs4
requests
feedparser
Confidence
95% confidence
Finding
The dependency beautifulsoup4 is unpinned, which makes builds non-reproducible and can cause the environment to install a newer release containing breaking changes or a compromised version. While this file alone does not prove exploitation, leaving dependency versions unconstrained is a real supply-chain weakness.

Unpinned Dependencies

Low
Category
Supply Chain
Content
beautifulsoup4
bs4
requests
feedparser
Confidence
95% confidence
Finding
The bs4 package entry is unpinned, so installations may resolve to different versions over time, reducing reproducibility and increasing supply-chain risk. This is especially relevant for agent skills that may be deployed automatically across environments.

Unpinned Dependencies

Low
Category
Supply Chain
Content
beautifulsoup4
bs4
requests
feedparser
Confidence
98% confidence
Finding
The requests dependency is unpinned, and this package has multiple historical advisories; without a version pin, the deployment may install a vulnerable release. Because this skill fetches remote content over HTTP(S), a vulnerable HTTP client library increases the risk of credential leakage, TLS/verification issues, or other network-facing flaws.

Unverifiable Dependency: requests has 16 known advisory(ies) (CVE-2014-1830 (Exposure of Sensitive Information to an Unauthorized Actor in Requests); CVE-2024-47081 (Requests vulnerable to .netrc credentials leak via malicious URLs); CVE-2024-35195 (Requests `Session` object does not verify requests after making first request wi) +13 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
92% confidence
Finding
Requests has known advisories, and because no version is pinned, there is no way to verify whether the installed package is affected. In this skill's context, that uncertainty is more dangerous because requests is used for fetching external news content, so any client-side network weakness directly touches untrusted remote endpoints.

Unpinned Dependencies

Low
Category
Supply Chain
Content
beautifulsoup4
bs4
requests
feedparser
Confidence
97% confidence
Finding
The feedparser dependency is unpinned, and the package has a history of advisories; this creates uncertainty about whether deployments will receive a safe release. Since the skill consumes remote RSS data, parsing libraries are part of the attack surface, making version control more important than in a purely local utility.

Unverifiable Dependency: feedparser has 10 known advisory(ies) (CVE-2011-1157 (feedparser Cross-site Scripting vulnerability); CVE-2009-5065 (feedparser Cross-site Scripting vulnerability); CVE-2011-1158 (feedparser Cross-site Scripting vulnerability) +7 more), but the manifest does not pin a version, so it is unknown whether the installed release is affected

Low
Category
Supply Chain
Confidence
91% confidence
Finding
Feedparser has multiple known advisories, and the lack of version pinning prevents verification that a safe version will be installed. Because the skill parses external RSS feeds, parser vulnerabilities are particularly relevant and can expose the system to maliciously crafted feed content.

Static analysis

No suspicious patterns detected.