T09 · Insecure Skill Coding Practices
- Location
scripts/save_paper.py:96- Finding
Insufficient URL Validation Enables Server-Side Request Forgery and Unintended Data Upload
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill mostly matches its Zotero-saving purpose, but it needs review because it can automatically download a PDF from a loosely checked URL and upload it to your Zotero account.
Install only if you trust the workflow and are comfortable giving it Zotero API access. Use a minimally scoped Zotero key, avoid passing untrusted or copied URLs into the tool, and review the PDF attachment behavior before use because malformed URLs could trigger unintended downloads and uploads. A safer version should strictly validate arxiv.org HTTPS URLs, add size and timeout limits, and make PDF attachment explicit.
scripts/save_paper.py:96Insufficient URL Validation Enables Server-Side Request Forgery and Unintended Data Upload
scripts/save_paper.py:4Unpinned Third-Party Dependency Creates a Mutable Supply-Chain Risk
The skill appears to require access to environment variables and network capabilities, but it does not explicitly declare a tool scope such as permissions or allowed-tools. This creates a governance and containment gap: a user or platform cannot easily see or restrict what the skill is expected to access, increasing the chance of over-privileged execution or unnoticed credential/network use.
The skill instructs users to place Zotero API credentials in an environment variable but provides no warning about keeping the secret private, avoiding logging, and limiting reuse. In a skill that invokes scripts and networked API access, this omission increases the risk of accidental credential disclosure through shell history, debugging output, screenshots, shared terminal sessions, or unsafe downstream code.
The argument parser description and help strings are all written in Chinese, and all user-facing status/error messages in the script are likewise Chinese. This creates a natural-language locale constraint for the skill without offering a language choice or documenting that the tool is intentionally region-specific.
The skill description says it saves papers to Zotero, but the implementation also downloads PDFs from arXiv and uploads them as attachments. This is a real capability expansion beyond the declared purpose, which increases data transfer, storage, and network-side effects without clear user disclosure or explicit opt-in.
The code performs external network retrieval based on user-supplied URL content and then uploads the fetched file into Zotero. Although it is restricted to URLs containing 'arxiv.org', the capability is still under-disclosed and creates unexpected outbound network access and content ingestion, which can be abused for unwanted downloads or policy bypass in constrained environments.
The natural-language instructions and examples are presented entirely in Chinese, which effectively forces a specific language for users without any opt-in or explanation of a region-specific requirement. Under the stated policy, a skill should either offer language choice or clearly document why a locale constraint is necessary.
No suspicious patterns detected.