T09 · Insecure Skill Coding Practices
- Location
scripts/arxiv_html_static_builder.py:128- Finding
Unrestricted Asset Retrieval Enables Server-Side Request Forgery
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill has a coherent arXiv-to-local-HTML purpose, but its downloader and generated HTML handling expose users to avoidable network and active-content risks.
Review before installing. Run it only in an isolated virtual environment or container, avoid sensitive networks, and inspect generated HTML before opening or sharing it. Prefer a version that pins dependencies, restricts downloads to trusted arXiv HTTPS hosts with size limits, sanitizes embedded figure/table HTML, and uses local MathJax or an explicit CDN opt-in.
scripts/arxiv_html_static_builder.py:128Unrestricted Asset Retrieval Enables Server-Side Request Forgery
scripts/arxiv_html_static_builder.py:242Unsanitized Remote Figure and Table Markup Is Embedded into Generated HTML
scripts/requirements.txt:1Open-Ended Dependency Versions Produce Non-Reproducible and Unreviewed Installations
The skill clearly directs package installation, network fetching from arXiv, and creation of local output files, but it declares no explicit tool scope or permissions boundary. That increases the chance an agent will invoke network and filesystem actions without clear user awareness or policy gating, which is a real security and transparency problem even though it does not by itself prove malicious intent.
The skill description focuses on conversion functionality but does not prominently warn that it downloads remote content and writes a local directory tree containing HTML, assets, and metadata. In agent settings, missing disclosure of network and file-modifying behavior can lead to unexpected data transfer or filesystem changes without informed consent.
The documented commands instruct pip installation and execution of a downloader/builder script without an explicit warning that they will modify the local environment and access the network. Installing dependencies and running scripts are sensitive actions that can change the host state, introduce supply-chain risk, and surprise users if not clearly disclosed and consented to.
The skill promises a local/offline static HTML result but states that formula rendering uses the MathJax CDN by default. This creates a hidden remote dependency that can leak access metadata, break offline use, and undermine the trust model of a supposedly self-contained local artifact.
The document says external CDNs should not be a necessary dependency, yet earlier it makes a CDN the default for formula rendering. This inconsistency is dangerous because operators may believe output is offline-safe when it still depends on third-party infrastructure, creating avoidable privacy, integrity, and availability risks.
This markdown file repeatedly requires the generated artifact to be in Chinese, including the title and content requirements for a Chinese static HTML page and Chinese body text. Under the policy, forcing a specific language without user opt-in is a natural-language policy violation unless the locale restriction is clearly justified.
The file description states the script builds a Chinese static HTML page, and the implementation later hard-codes Chinese language output and labels rather than offering a language choice. This is a natural-language locale policy concern because the skill forces a specific language experience without explicit user opt-in or configurable alternatives.
The asset downloader follows whatever URLs appear in source HTML/CSS and fetches them without restricting hostnames or schemes beyond a few trivial skips. A malicious or unexpected paper page could cause requests to arbitrary external servers, leaking the operator's IP/network metadata and importing untrusted content into the local build.
The generated document sets lang="zh-CN" and includes fixed Chinese title/meta text such as '中文静态版' and '本地中文静态 HTML'. Because the skill does not provide a user-selectable locale, it enforces a specific language setting in generated output.
The generated 'static' HTML loads MathJax from jsDelivr at runtime, which means opening the page causes a network request to a third-party CDN and executes remote JavaScript. That breaks the local/offline trust model and creates a supply-chain/privacy risk if the CDN is unavailable, compromised, or blocked.
The dependency specification uses a minimum version bound instead of pinning to an exact version, which makes builds non-reproducible and can result in different environments installing different releases. In a supply-chain context, this increases exposure to accidentally pulling a vulnerable or incompatible version of requests, especially given the package's history of advisories.
requests>=2.28.0
beautifulsoup4>=4.11.0
The manifest includes requests without pinning a specific version, and the package has multiple known advisories across its release history. Because the installed version is not fixed, there is no assurance that deployments will avoid affected releases, which creates a real supply-chain risk for a network-facing HTML retrieval/conversion skill that likely fetches remote arXiv content.
beautifulsoup4 is also unpinned, so installations may resolve to different versions over time. While this is usually a hygiene and supply-chain hardening issue rather than an immediate exploit, it weakens reproducibility and makes it harder to verify exactly what code is being deployed.
requests>=2.28.0
beautifulsoup4>=4.11.0