T09 · Insecure Skill Coding Practices
- Location
scripts/main.py:426- Finding
Arbitrary Browser Navigation Enables Server-Side Request Forgery
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill mostly matches its WeChat archiving purpose, but it can open and save arbitrary URLs despite being framed as WeChat-only, which needs review before use.
Install only if you are comfortable with a Python/Playwright tool that opens URLs and writes local snapshots. Use it only with trusted WeChat article URLs, avoid passing arbitrary or third-party supplied links, consider running it in an isolated environment, and prefer pinned dependency versions before regular use.
scripts/main.py:426Arbitrary Browser Navigation Enables Server-Side Request Forgery
requirements.txt:1Unpinned Third-Party Dependencies Create Supply-Chain Exposure
The comment documents a feature that reuses browser Cookie/Referer values to download WeChat images, which can cause authenticated session data or request metadata to be forwarded to additional endpoints without explicit user awareness or consent. In an agent skill context, borrowing browser credentials for secondary requests increases the risk of unintended authenticated access, privacy leakage, and SSRF-like abuse against resources reachable with the user's session.
This code's user-facing description and CLI messages are written in Chinese throughout, starting with the module docstring and continuing across prompts and warnings. Under the policy for natural-language violations, forcing a specific language without user opt-in or justification is in scope.
The dependency specifier uses a lower bound only, so installations may resolve to different upstream versions over time, including newly introduced vulnerable or breaking releases. For a security-sensitive automation skill, unpinned dependencies reduce reproducibility and make it difficult to verify exactly what code will execute.
playwright>=1.40.0
beautifulsoup4>=4.12.0
python-frontmatter>=1.0.0
markdownify>=0.11.0
The dependency specifier uses a lower bound only, so installations may resolve to different upstream versions over time, including newly introduced vulnerable or breaking releases. For a security-sensitive automation skill, unpinned dependencies reduce reproducibility and make it difficult to verify exactly what code will execute.
playwright>=1.40.0
beautifulsoup4>=4.12.0
python-frontmatter>=1.0.0
markdownify>=0.11.0
# `--download-images` 依赖 requests,并会复用浏览器 Cookie/Referer 下载微信图片
The dependency specifier uses a lower bound only, so installations may resolve to different upstream versions over time, including newly introduced vulnerable or breaking releases. For a security-sensitive automation skill, unpinned dependencies reduce reproducibility and make it difficult to verify exactly what code will execute.
playwright>=1.40.0
beautifulsoup4>=4.12.0
python-frontmatter>=1.0.0
markdownify>=0.11.0
# `--download-images` 依赖 requests,并会复用浏览器 Cookie/Referer 下载微信图片
requests>=2.28.0
The dependency specifier uses a lower bound only, so installations may resolve to different upstream versions over time, including newly introduced vulnerable or breaking releases. For a security-sensitive automation skill, unpinned dependencies reduce reproducibility and make it difficult to verify exactly what code will execute.
playwright>=1.40.0
beautifulsoup4>=4.12.0
python-frontmatter>=1.0.0
markdownify>=0.11.0
# `--download-images` 依赖 requests,并会复用浏览器 Cookie/Referer 下载微信图片
requests>=2.28.0
The manifest does not pin the markdownify version, while advisories exist for the package, so the deployed installation could resolve to an affected release without visibility. Although this file alone does not prove exploitation, the inability to verify a safe version is a real supply-chain hygiene weakness.
The dependency specifier uses a lower bound only, so installations may resolve to different upstream versions over time, including newly introduced vulnerable or breaking releases. This is slightly more concerning here because requests is used alongside a documented feature that may reuse browser auth context, making exact version control more important.
python-frontmatter>=1.0.0
markdownify>=0.11.0
# `--download-images` 依赖 requests,并会复用浏览器 Cookie/Referer 下载微信图片
requests>=2.28.0
The manifest does not pin requests to a known safe version despite multiple published advisories, so installations may select a vulnerable build. Because this skill may perform authenticated HTTP downloads and reuse browser-derived request context, a vulnerable HTTP client could amplify credential leakage, SSRF, or redirect-handling issues.
No suspicious patterns detected.