Back to skill

Security audit

Karpathy Curated RSS Brief

Security checks for vulnerabilities and agentic risk

Overview

This skill appears to generate the promised RSS newsletter, but it should be reviewed carefully because it runs unpinned dependencies and follows mutable remote feed URLs without tight safeguards.

Install only if you are comfortable with the skill making outbound requests to GitHub Pages, RSS feeds, and article sites, running a local Python script through uv, installing unresolved Python dependencies, and creating a markdown file in your current working directory. Prefer running it in a restricted workspace or container, pinning dependencies, and reviewing or pinning the OPML/feed sources before 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
scripts/fetch_feeds.py:21
Finding

Remote-Controlled Feed and Article URLs Permit Unrestricted Network Requests

Content
View full analysis
list[dict]: """Fetch OPML from URL and return list of {text, xmlUrl, htmlUrl}.""" async with session.get(_OPML_URL, timeout=aiohttp.ClientTimeout(total=30)) as resp: resp.raise_for_status() body = await resp.text() root = ET.fromstring(body) feeds = [] for outline in root.iter("outline"): url = outline.get("xmlUrl") if url: feeds.append({ "text": outline.get("text", ""), "xmlUrl": url, "htmlUrl": outline.get("htmlUrl", ""), }) return feeds async def fetch_feed(session: aiohttp.ClientSession, feed: dict, sem: asyncio.Semaphore, cutoff: datetime) -> list[dict]: """Fetch and parse a single RSS/Atom feed, returning articles newer than cutoff.""" url = feed["xmlUrl"] try: async with sem: async with session.get(url, timeout=aiohttp.ClientTimeout(total=30)) as resp: body = await resp.text() ``` The subsequent agent workflow also directs the agent to retrieve feed-supplied article links: ```markdown ### Step 3: Get the full article text For every selected article, use WebFetch to read the full text. The editorial observation must be based on the full text and not only on the RSS summary. ``` ### Technical Analysis The feed-fetching script trusts a mutable OPML document hosted on an external domain. Every `xmlUrl` attribute in that document is passed directly to `aiohttp.ClientSession.get()` without validating: - The URL scheme - The destination hostname - The resolved IP address - L ...[truncated 2739 chars]
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
scripts/fetch_feeds.py:1
Finding

Runtime and Installation Dependencies Are Not Version or Integrity Pinned

Content
View full analysis
=3.10" # dependencies = ["feedparser", "aiohttp"] # /// ``` The Skill directs users to execute the script through `uv`, which automatically resolves and installs the unconstrained dependencies: ```bash uv run --script /scripts/fetch_feeds.py --hours 24 ``` ```markdown The script uses PEP 723 inline metadata. `uv run --script` automatically installs dependencies, so manual `pip install` is unnecessary. ``` The README additionally recommends mutable global or latest npm-based installation paths: ```bash npm install -g clawhub clawhub install karpathy-curated-rss-brief ``` ```bash npx skills@latest install karpathy-curated-rss-brief ``` The alternative documented command also executes an unpinned package version: ```bash npx skills add https://github.com/MESevenJourney/eric-awesome-skills.git --skill karpathy-curated-rss-brief ``` ### Technical Analysis Neither `feedparser` nor `aiohttp` is constrained to a reviewed version. No lockfile or package hash is present in the audited project. As a result, each environment may resolve a different dependency release, and future invocations can execute code that was not part of the reviewed artifact. The documented npm installation commands similarly omit exact versions. The use of `@latest` expressly selects a mutable release, while `npm install -g` can install a package globally with the invoking user's permissions. Package installation can execute package lifecycle scripts, so compromise of a package publisher, registry record, transitive dependency, or newly released package version can affect the installation host. No ...[truncated 1870 chars]
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Behavioral ASTexec() Call, eval() Call, Dynamic Import
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (16)

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The manifest says the skill fetches RSS feeds and generates a newsletter, but the documented behavior also depends on a specific remote OPML source and local execution steps that are not transparently disclosed in the description. Description-behavior mismatch is dangerous because users and orchestrators may grant trust based on the stated purpose while the skill performs broader networked and filesystem-affecting actions.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README states the skill generates a Chinese tech daily newsletter, and later reiterates that it follows a template to produce Chinese output. This is a natural-language locale policy concern because the skill appears to force a specific language rather than offering language selection or documenting that the user explicitly opts into Chinese output.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Rp1

Medium
Category
MCP Rug Pull
Confidence
70% confidence
Finding

npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
92% confidence
Finding

The skill instructs network access and script execution but does not declare any explicit tool scope or permission boundaries. That creates an overbroad trust model where an agent may fetch remote content and run code without the manifest clearly constraining those behaviors, increasing the chance of unintended external access or execution.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The description requires generating a “Chinese tech daily newsletter,” and later steps repeatedly mandate Chinese output. There is no user opt-in, language selection, or explanation that this skill is intentionally limited to Chinese for a documented regional purpose.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The listed triggers include generic phrases such as “生成日报”, “今日资讯”, and “每日简报”, which are common requests not uniquely tied to this specific skill. Because the description does not provide scope limits or negative examples, these triggers may overlap with ordinary conversation and invoke the skill unintentionally.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
90% confidence
Finding

The workflow directs the agent to fetch a remote OPML file and later retrieve article content from external sites, but it does not disclose the privacy and network implications. This matters because external requests may leak usage patterns, environment metadata, or user interest data to third parties without informed consent.

Content

No source excerpt is available for this finding.

Skill Enumeration

Medium
Category
Agent Snooping
Confidence
87% confidence
Finding

The skill explicitly instructs the agent to infer the on-disk skill directory from system context, which is a form of environment/path enumeration. While framed as convenience, this can expose internal filesystem layout and encourages use of contextual metadata to discover local paths that may not otherwise need to be revealed or processed.

Content

Scanner excerpt · SKILL.md (reported line 37)May include surrounding context.

md
本 SKILL.md 的路径会出现在对话上下文中(`ide_opened_file` 标签、Skill 系统加载记录、或 Read 工具的调用路径)。找到包含 `karpathy-curated-rss-brief/SKILL.md` 的那条记录,去掉末尾的 `/SKILL.md`,即为 **`SKILL_DIR`**。

示例:若上下文中路径为 `/path/to/skills/karpathy-curated-rss-brief/SKILL.md`,则 `SKILL_DIR=/path/to/skills/karpathy-curated-rss-brief`。

后续所有文件均基于此路径推导,无需再次搜索:

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The skill requires executing local shell and Python commands, including dependency-resolving uv run --script, which expands the attack surface beyond simple content summarization. Running local commands tied to remote content or remote dependency resolution can expose the environment to supply-chain risk, unintended code execution, and policy bypass if not tightly scoped.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
93% confidence
Finding

The skill instructs the agent to save a file into the current working directory without warning the user that local files will be created. Unannounced filesystem modification is risky because it can surprise users, overwrite expected workspace contents, or be abused in sensitive directories if invocation context is not obvious.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The template explicitly requires summaries to be written in Chinese ("2-3 段中文摘要"), which imposes a language choice in the skill output. This is a natural-language policy concern because the file does not indicate user choice, opt-in, or a documented region-specific reason for enforcing Chinese.

Content

No source excerpt is available for this finding.

Missing User Warnings

Low
Category
Not specified by scanner
Confidence
89% confidence
Finding

This markdown file explains that the skill fetches articles from 93 feeds, reads articles in full via WebFetch, and saves output to a dated markdown file. The description does not include any explicit user-facing warning that invoking the skill will perform external network requests and create a local file, which are behaviors that can affect privacy or the working directory.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
77% confidence
Finding

The English usage section instructs users to type the Chinese phrase 'RSS 日报' to invoke the skill. This may constitute a language policy issue because it requires a specific language for activation without indicating that other languages are accepted or that the user can choose their preferred locale.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Low
Category
Not specified by scanner
Confidence
88% confidence
Finding

The manifest description frames the skill as fetching articles and generating a Chinese daily newsletter, which suggests content retrieval and synthesis. The instructions in the skill file go further by persisting output as a file in the user's current working directory, an additional side effect not stated in the manifest.

Content

No source excerpt is available for this finding.

Dynamic attribute access via getattr()

Low
Category
Dangerous Code Execution
Confidence
50% confidence
Finding

Dynamic getattr() with a non-literal attribute name can access arbitrary object attributes, potentially bypassing access controls.

Content

Scanner excerpt · scripts/fetch_feeds.py (reported line 64)May include surrounding context.

python
for entry in d.entries:
        published = None
        for attr in ("published_parsed", "updated_parsed"):
            t = getattr(entry, attr, None)
            if t:
                try:
                    published = datetime.fromtimestamp(mktime(t), tz=timezone.utc)

Static analysis

No suspicious patterns detected.