T02 · Agent Memory Poisoning
- Location
SKILL.md:42- Finding
Unscoped Persistent Storage of User Behavior
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
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.
SKILL.md:42Unscoped Persistent Storage of User Behavior
requirements.txt:1Unpinned and Redundant Third-Party Dependencies
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
beautifulsoup4
bs4
requests
feedparser
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.
beautifulsoup4
bs4
requests
feedparser
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.
beautifulsoup4
bs4
requests
feedparser
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.
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.
beautifulsoup4
bs4
requests
feedparser
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.