T09 · Insecure Skill Coding Practices
- Location
wechat_article_to_markdown.py:92- Finding
Unrestricted Article-Controlled Image Fetching Enables SSRF
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is a real WeChat-to-Markdown converter, but article content can cause it to fetch arbitrary image URLs and save unbounded remote content locally, so it needs review before installation.
Install only if you are comfortable running a headless browser and a network-fetching converter on WeChat article URLs you trust. Avoid using it in environments with access to private internal services or sensitive local networks, and watch disk usage because downloaded image responses are not bounded. A safer release would restrict image hosts to WeChat-controlled CDNs, validate redirects and private IP ranges, enforce download size limits, and pin dependencies.
wechat_article_to_markdown.py:92Unrestricted Article-Controlled Image Fetching Enables SSRF
wechat_article_to_markdown.py:101Unbounded Image Downloads Permit Memory, Disk, and Bandwidth Exhaustion
pyproject.toml:9Unpinned Third-Party Dependencies Create Supply-Chain Exposure
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.
- Anti-detection fetching with Camoufox
- Extract article metadata (title, account name, publish time, source URL)
- Convert WeChat article HTML to Markdown
- Download article images to local `images/` and rewrite links
- Handle WeChat `code-snippet` blocks with language fences
## Installation
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
.agents/skills/wechat-article-to-markdown
curl -o .agents/skills/wechat-article-to-markdown/SKILL.md
https://raw.githubusercontent.com/jackwener/wechat-article-to-markdown/main/SKILL.md
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
.agents/skills/wechat-article-to-markdown
curl -o .agents/skills/wechat-article-to-markdown/SKILL.md
https://raw.githubusercontent.com/jackwener/wechat-article-to-markdown/main/SKILL.md
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
.agents/skills/wechat-article-to-markdown
curl -o .agents/skills/wechat-article-to-markdown/SKILL.md
https://raw.githubusercontent.com/jackwener/wechat-article-to-markdown/main/SKILL.md
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
# Claude Code user-level skills directory (global)
mkdir -p ~/.claude/skills/wechat-article-to-markdown
curl -o ~/.claude/skills/wechat-article-to-markdown/SKILL.md \
https://raw.githubusercontent.com/jackwener/wechat-article-to-markdown/main/SKILL.md
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.
# Claude Code user-level skills directory (global)
mkdir -p ~/.claude/skills/wechat-article-to-markdown
curl -o ~/.claude/skills/wechat-article-to-markdown/SKILL.md \
https://raw.githubusercontent.com/jackwener/wechat-article-to-markdown/main/SKILL.md
The skill explicitly instructs installation and execution of a CLI that fetches remote content from the network and writes Markdown and images to local disk, yet the manifest declares no permissions or allowed-tools scope. That creates a real security transparency and containment issue: operators cannot easily review or restrict the skill's expected network and file-write behavior before use.
The README shows the output directory structure and earlier states that article images are downloaded locally, but it does not explicitly warn users that running the tool will create local directories and save fetched content from a remote URL. For a markdown skill description, file writes affecting user workspace should be clearly disclosed as behavior that may affect local data or filesystem state.
The skill states the output paths, but it does not clearly warn users in the description/usage flow that running it will persist full article content and downloaded images to local storage. This can lead to accidental retention of copyrighted, sensitive, or unexpected content on disk, especially in automated workflows.
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
Dependency has known vulnerabilities (CVEs). Using packages with unpatched security flaws exposes the environment to known exploits.
The dependency 'markdownify' is unpinned, so installs may resolve to different versions over time, including newly introduced vulnerable or breaking releases. In a tool that fetches remote WeChat article content and transforms HTML to Markdown, supply-chain unpredictability increases risk because parsing behavior directly affects untrusted input handling.
camoufox[geoip]
markdownify
beautifulsoup4
httpx
'markdownify' has known advisories, and because no version is pinned, it is impossible to verify whether the deployed environment avoids the vulnerable releases. This matters more in this skill than in a generic utility because the package processes attacker-controlled HTML content from remote WeChat articles, so parser/transformer denial-of-service bugs are realistically reachable.
The dependency 'beautifulsoup4' is unpinned, which makes builds non-reproducible and can silently introduce insecure or incompatible versions. Because this skill parses externally sourced HTML from mp.weixin.qq.com, parser dependency drift can materially change security posture and robustness.
camoufox[geoip]
markdownify
beautifulsoup4
httpx
The dependency 'httpx' is unpinned, allowing future installs to pull arbitrary newer or older resolver-selected versions, some of which may contain known flaws. Since this package is responsible for network fetching of remote content, version uncertainty directly affects transport and input-validation security.
camoufox[geoip]
markdownify
beautifulsoup4
httpx
'httpx' has known advisories and the manifest does not constrain the installed version, so vulnerable builds may be selected without visibility. Because this skill retrieves remote web content, any input-validation weakness in the HTTP client is more relevant than in an offline-only tool and could expose the agent to malformed response or request-handling issues.
The module description and subsequent user-facing messages indicate the skill is designed to interact in Chinese, and the runtime prints throughout the file are also Chinese-only. This creates a language/locale constraint without any documented user choice or opt-in, which matches the policy-violation category for forced language behavior.