T09 · Insecure Skill Coding Practices
- Location
scripts/wechat_to_md/downloader.py:38- Finding
Article-Controlled Image URLs Enable Server-Side Request Forgery and Unbounded Downloads
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill mostly does what it claims, but its default image downloader can be steered by article content to fetch arbitrary URLs and save unbounded responses locally.
Review this skill before installing. It is not clearly malicious, but use it in a low-privilege virtual environment or container, prefer --no-images for untrusted articles, choose a dedicated output directory, and avoid running it where internal web services or sensitive network metadata are reachable until image URL allowlisting, size limits, and pinned dependencies are added.
scripts/wechat_to_md/downloader.py:38Article-Controlled Image URLs Enable Server-Side Request Forgery and Unbounded Downloads
scripts/requirements.txt:1Unpinned Third-Party Dependencies Create a Non-Reproducible Supply-Chain Boundary
The skill exposes capabilities that imply network access plus local file read/write, but the manifest does not declare any tool scope or permission boundaries. That makes the skill harder to review safely and may allow it to run with broader effective privileges than a user or platform reviewer expects, which is especially relevant here because the skill downloads remote content and writes files locally.
When parsing or CAPTCHA handling fails, the tool writes the full fetched HTML to a debug file on disk. WeChat article pages can contain personal data, account-specific tokens, tracking parameters, session-linked content, or other sensitive material; persisting this without clear user consent or retention controls increases the chance of unintended disclosure through local compromise, backups, shared workstations, or later exfiltration.
This markdown file documents that the tool writes converted articles and downloaded images into an output directory, and elsewhere notes that --force can overwrite existing output. While the behavior is described functionally, there is no clear warning callout that running the tool will create and potentially overwrite local files, which is a user-impacting operation.
The document includes a full Chinese-language section and presents bilingual navigation, but the file itself does not force a single language overall because English is also available. However, the Chinese section by itself is not a policy violation when considered in context, so no stronger finding is warranted; this is borderline and low confidence.
The dependency markdownify is unpinned, so installations may resolve to different versions over time, including versions with breaking changes or newly disclosed vulnerabilities. In a tool that fetches and converts untrusted web content, dependency drift increases supply-chain and reproducibility risk.
camoufox[geoip]
markdownify
beautifulsoup4
httpx
mcp
markdownify has known advisories, but because no version is pinned, it is impossible to determine whether the installed release is affected. This uncertainty is material here because the skill converts remote article HTML into Markdown, so vulnerable parsing/conversion behavior could be triggered by malicious content.
The dependency beautifulsoup4 is unpinned, which makes builds non-reproducible and can silently introduce vulnerable or incompatible releases. Because this skill parses attacker-controlled HTML from external articles, parser-related dependency changes could affect security and stability.
camoufox[geoip]
markdownify
beautifulsoup4
httpx
mcp
The dependency httpx is unpinned, allowing package resolution to vary across environments and over time. Since this tool performs network requests to fetch remote content, an unpinned HTTP client increases exposure to supply-chain issues and to inadvertently installing a version affected by known flaws.
camoufox[geoip]
markdownify
beautifulsoup4
httpx
mcp
httpx has known advisories, and the lack of version pinning prevents verification that a safe release will be installed. Because this skill retrieves external content over the network, uncertainty in the HTTP client version creates avoidable risk around request handling and input validation issues.
The dependency mcp is unpinned, which is especially risky given the package's broad functionality and history of multiple advisories. Unpinned SDK/framework dependencies can pull in vulnerable releases unexpectedly and make it difficult to verify the security posture of deployed builds.
markdownify
beautifulsoup4
httpx
mcp
mcp has numerous known advisories, but the manifest does not specify a version, so the deployment may resolve to a vulnerable release without visibility. Given that MCP components can expose protocol/server features, using an unverifiable version materially increases the chance of inheriting network-facing or access-control weaknesses.
No suspicious patterns detected.