T01 · Skill Instruction Hijacking
- Location
scripts/neovim_digest.py:108- Finding
Untrusted Reddit RSS Content Is Passed Into the Agent Context Without an Explicit Trust Boundary
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill fetches public r/neovim RSS feeds to build a digest, with some link-handling and untrusted-content hardening gaps but no evidence of hidden persistence, credential access, destructive behavior, or exfiltration.
Install only if you are comfortable with the skill contacting Reddit RSS feeds when invoked. Treat all Reddit-derived text and links as untrusted, do not follow instructions embedded in post content, and verify any generated GitHub links before opening them.
scripts/neovim_digest.py:108Untrusted Reddit RSS Content Is Passed Into the Agent Context Without an Explicit Trust Boundary
scripts/neovim_digest.py:127Substring-Based GitHub URL Validation Can Produce Deceptive Trusted Links
The skill instructs the agent to execute a local Python script that performs network access, but the manifest declares no explicit tool scope such as allowed-tools or permissions. This creates an authorization ambiguity where a broadly triggered skill could cause shell execution and external fetches without clear user-visible boundaries or least-privilege constraints.
The invocation text uses broad natural-language triggers such as requests for a roundup, highlights, recommendations, or a quick digest, which can cause the skill to activate in routine conversation without clear boundaries. In this skill, that matters because activation leads to shell execution of a local script and Reddit network access, increasing the chance of unintended external actions.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
except Exception:
# Reddit RSS occasionally trips Python's TLS stack in some environments;
# fall back to curl because it is usually more tolerant here.
result = subprocess.run(
["curl", "-L", "--silent", "--show-error", "--fail", "-A", USER_AGENT, url],
check=True,
capture_output=True,
The generated digest sentences and summary text are hard-coded in Chinese, which imposes a specific language on users without opt-in or configuration. This is a natural-language policy issue because the file does not provide any locale selection or document a justified region-specific constraint.
The manifest says the digest is built by combining the Reddit RSS feeds top/day, new, and hot, but the code also defines and can use top/week as a backfill source. That is a small but real behavior expansion beyond the described scope, even though it is closely related to the skill's purpose.
This code fetches Reddit RSS feeds over the network and, on failure, falls back to invoking curl to retrieve the same remote content. There is no confirmation prompt or user-facing disclosure in the script output or arguments explaining that it will contact external services and use a subprocess as part of normal execution.
The output text states that new/hot are used because top/day has limited visible items and to cover posts still developing in other time zones. In reality, the code always mixes new and hot regardless of whether top/day is limited, and may also include top_week when requested, so the explanatory text overstates a specific selection rationale the code does not actually enforce.