T09 · Insecure Skill Coding Practices
- Location
scripts/summarize_url.py:63- Finding
Arbitrary URL fetching permits SSRF and local resource access
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This is a coherent AI news skill, but it needs Review because one helper can fetch arbitrary URLs and automatically disclose URLs to a third-party parser without clear scoping.
Install only if you are comfortable with a Chinese-language news skill that contacts many external sources. Avoid giving it private, signed, localhost, internal-network, or file URLs, because the URL summarizer is not safely restricted and may forward URLs to Jina Reader. Prefer running it in a network-restricted environment and review the RSS source list before use.
scripts/summarize_url.py:63Arbitrary URL fetching permits SSRF and local resource access
scripts/summarize_url.py:103Automatic Jina Reader fallback discloses user-supplied URLs to a third party
scripts/arxiv_papers.py:36arXiv search terms and results are transmitted over plaintext HTTP
scripts/rss_aggregator.py:102Unbounded network response reads permit memory and disk exhaustion
INSTALL.md:23Installation instructions recommend an unused and unpinned third-party dependency
The code substantially matches part of the description: it is indeed an RSS aggregation tool with concurrent fetching, category filtering, and local caching/prefetch-like behavior. However, the declared description promises several higher-level assistant features that are not present in this code chunk, including interest scoring, deduplication across days, report generation, keyword filtering, and subscription features. The script is a feed fetch/parse aggregator only, not a full AI news reading assistant with the described intelligence and workflow features. There is no obvious undeclared harmful behavior, but there is a clear description-to-behavior overstatement, so this should be flagged as a mismatch.
The supplied code chunk does not implement the described AI news aggregation assistant. Its behavior is narrowly scoped to fetching and extracting content from one provided URL, with optional use of Jina Reader as a parsing fallback. While article prefetch/extraction could be a supporting component within a larger news assistant, this chunk by itself lacks the core declared functionality: RSS ingestion, aggregation across many sources, ranking/scoring, deduplication, report generation, and subscription/filtering features. Additionally, it contacts an external parsing endpoint (r.jina.ai), which is not reflected in the declared description. Therefore the description does not accurately represent what this code chunk actually does.
The description presents a feature-rich AI news assistant, but the provided code chunk only contains unit tests around low-level RSS aggregator behaviors: source loading, caching, fetching, conditional HTTP requests, proxy handling, and XML parsing. Those behaviors partially align with the RSS fetching portion of the description, but the primary declared value proposition includes many higher-level product features that are absent from the code shown. There is no evidence here of recommendation/interest scoring, deduplication across days, report generation, source breadth (100+), or specialized aggregation from arXiv/GitHub/company feeds. This is therefore a material description-behavior mismatch, though there is no sign of hidden malicious or unrelated sensitive capability.
This markdown file consistently presents the skill's output format, headings, examples, and command context in Chinese, beginning with the title '输出示例' and continuing throughout all sample outputs. Under the policy rule for natural-language violations, this appears to enforce a specific language/locale without documenting user opt-in or offering a language choice.
The README advertises broad aggregation from 100+ RSS and other external sources, plus tracking-oriented features like interest scoring and subscriptions, but does not warn users that the skill performs extensive network access or explain resulting privacy and metadata exposure. In an agent setting, this can cause users to unknowingly trigger outbound requests that reveal IP, timing, queried topics, or subscription interests to many third parties.
The skill advertises network fetching, caching, and script execution but does not declare any explicit tool scope such as allowed network or file capabilities. Missing permission boundaries increases the risk of over-broad runtime access and makes it harder for a host system or user to understand what the skill may do when invoked.
The description forces Chinese output/instructions without indicating that users may choose another language. Under the language/locale policy, a skill should not impose a specific language unless it offers opt-in or clearly documents a justified region-specific constraint.
Overly broad trigger phrases can cause unintended invocation of a skill that performs large-scale external fetching. That can lead to unexpected network activity, privacy issues, or unnecessary resource consumption when ordinary conversation text accidentally matches activation terms.
Generic trigger terms like broad AI or ML topics can activate the skill outside the user's intent, especially because the skill then performs network requests across many sources. In context, unintended activation is more concerning because it can initiate external data access and produce outputs the user did not request.
The manifest trigger list contains generic phrases such as "今天新闻", "技术新闻", and "行业动态" that are broad enough to match ordinary user speech outside the intended skill scope. The manifest does not provide narrowing context, exclusion conditions, or negative examples to clarify when the skill should and should not activate.
This code file contains natural-language strings such as the module docstring and command descriptions entirely in Chinese, and the CLI output later follows the same pattern. Because the skill forces a specific language for interaction without any user opt-in or justification that it is region-specific, it violates the language/locale policy criteria.
When Jina Reader is used, the target URL and potentially the full article retrieval request are sent to a third-party service (r.jina.ai) without any explicit user-facing warning or consent in the script output/interface. In a news aggregation context, this can leak users’ reading targets, internal links, or non-public URLs to an external provider, creating a privacy and data-handling risk even if no code execution occurs.
This markdown file uses Chinese throughout, including headings and feature descriptions, with no indication that the skill is region-specific or that users can choose another language. Under the language/locale policy, forcing a specific language without opt-in is a natural-language policy concern.
This markdown file documents commands for RSS aggregation, arXiv search, and GitHub Trending retrieval, all of which inherently make outbound network requests. The guide describes usage and performance but does not warn users that running these commands contacts external services and may expose IP address, user agent, or access patterns.
The markdown encourages users to add custom RSS URLs in scripts/rss_sources.json, which changes external data sources the skill will contact. There is no accompanying warning about trusting feed URLs, network access implications, or verifying the safety and ownership of added endpoints.
The primary skill description is presented in Chinese and the README consistently uses Chinese user-facing examples, but it does not offer an opt-in language choice or explain that the skill is intentionally region- or locale-specific. This can violate language/locale policy where user-facing skills should not force a language without user choice or justification.
The skill description does not clearly warn users that invoking it may trigger extensive outbound requests to many third-party sources. Lack of disclosure weakens informed consent and can surprise users in environments where network access, privacy, or rate limits matter.
The manifest declares a single language value of "zh-CN", which can be interpreted as forcing a specific language/locale for the skill. There is no accompanying note that the skill is region-specific or that users may opt into another language.
The script's docstrings, CLI help text, progress messages, and normal output are written in Chinese throughout, which imposes a specific language on users. The file does not provide an option to select another language or explain that the skill is intentionally limited to a Chinese-speaking audience.
The script reads HTTP_PROXY/http_proxy from the environment and uses that proxy for outbound requests, which can route request metadata through infrastructure the user may not expect. Although the file has general docstrings and error output, it does not disclose this proxy behavior to the user at the point of execution or in user-facing output.
The request header forces an English locale preference via Accept-Language: en-US,en;q=0.9. This is a natural-language/locale policy concern because the script imposes a specific language setting without offering the user a choice or documenting a justified locale restriction.
This JSON manifest mixes English and Chinese content sources, including entries such as 机器之心, 36氪快讯, 少数派, InfoQ 中文, and 量子位, but provides no natural-language indication that users can choose or opt into a non-English locale. Under the language/locale policy, forcing or silently including a specific language without user opt-in can be a policy concern.
The request header sets Accept-Language to zh-CN,zh;q=0.9,en;q=0.8, which imposes a language/locale preference regardless of user choice. This is a natural-language policy concern because the skill biases fetched content toward Chinese without exposing a language option or documenting a justified locale restriction.
This code file contains natural-language documentation exclusively in Chinese, including the module docstring and test descriptions. Under the language/locale policy, forcing a single language without user opt-in or a documented regional justification is a policy concern.
No suspicious patterns detected.