T05 · Unauthorized Access and Privilege Escalation
- Location
scripts/parse-article.sh:44- Finding
Unrestricted URL Fetching Deliberately Bypasses SSRF Protections
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill has a coherent RSS-to-WeChat purpose, but it deliberately bypasses safer URL-fetching boundaries and includes automatic publishing paths that need careful review before use.
Install only if you are comfortable running shell scripts that fetch arbitrary URLs from your machine and may upload generated drafts to WeChat when configured. Use throwaway or least-privilege WeChat credentials, keep config.local.sh private, avoid unattended daily-featured automation until an approval gate is added, and do not process untrusted URLs unless URL validation and SSRF protections are added.
scripts/parse-article.sh:44Unrestricted URL Fetching Deliberately Bypasses SSRF Protections
references/html-template.md:17Hardcoded Branding Overrides the Documented User-Configurable Output
"All the AI News That's Fit to Read"
``` The executable formatter repeats the same fixed branding in `scripts/format-wechat.sh`: ```html AI晚知道"All the AI News That's Fit to Read"
``` Meanwhile, `SKILL.md` instructs the agent to use the template: ```markdown 2. **HTML 生成**(AI 辅助) - AI 助手生成微信兼容的 HTML - 使用品牌配置 - 遵循严格的格式要求(见 `references/html-template.md`) ``` ### Technical Analysis The Skill claims that branding is configurable through values such as `BRAND_NAME` and `BRAND_SLOGAN`. However, the canonical AI-facing template and the executable formatter contain fixed brand text instead of configuration placeholders. An agent following the Skill's instructions can therefore reproduce the embedded branding in generated articles even when the user configured a different brand. The direct formatter has the same behavior. This creates deterministic, persistent modification of user-facing output that is unrelated to the source article. The issue affects both instruction-driven generation and script-driven generation. It is not merely a harmless default because the fixed strings are not replaced by the documented configuration values. ### Attack Path 1. A user loads the Skill to convert an ar ...[truncated 847 chars]{{BRAND_SLOGAN}}
``` 2. Modify `scripts/format-wechat.sh` to HTML-escape and use `BRAND_NAME` and `BRAND_SLOGAN`. 3. Make branding opt-in where possible and omit it when the user has not configured a value. 4. Ensure the AI-facing template clearly instructs the agent not to invent, preserve, or promote a default brand. 5. Add automated tests verifying that customized branding appears and the fixed strings do not. 6. Keep the executable formatter and reference template synchronized. ]]>scripts/format-wechat.sh:37Untrusted Article Data Is Written to HTML Without Robust Sanitization
来源:$AUTHOR | 发布时间:$PUBLISHED
``` The body is processed with regular-expression substitutions rather than an HTML sanitizer: ```bash echo "$CONTENT_HTML" | sed \ -e 's|]*>||g' \ -e 's||
|g' \ -e 's|]*>||g' \ -e 's||
|g' \ -e 's|]*>||g' \ -e 's||
|g' \ -e 's|]*>||g' \ -e 's|
|||g' \ -e 's||g' \ -e 's|
||g' \
-e 's|||g' \
-e 's|||g' \ -e ...[truncated 2979 chars]
references/USER_GUIDE.md:24Documentation Installs an Unpinned Global npm Dependency
The skill claims a narrowly framed formatting/publishing purpose, but the documented workflow accepts arbitrary URLs and performs remote content fetching and parsing. In this context, broader web retrieval capability is more dangerous because it can enable unexpected network access, ingestion of untrusted content, and potentially SSRF-like abuse if downstream scripts are insufficiently constrained.
The skill claims a narrowly framed formatting/publishing purpose, but the documented workflow accepts arbitrary URLs and performs remote content fetching and parsing. In this context, broader web retrieval capability is more dangerous because it can enable unexpected network access, ingestion of untrusted content, and potentially SSRF-like abuse if downstream scripts are insufficiently constrained.
The skill claims a narrowly framed formatting/publishing purpose, but the documented workflow accepts arbitrary URLs and performs remote content fetching and parsing. In this context, broader web retrieval capability is more dangerous because it can enable unexpected network access, ingestion of untrusted content, and potentially SSRF-like abuse if downstream scripts are insufficiently constrained.
The README advertises optional automated publishing to a WeChat account but does not prominently warn that article content and account credentials may be transmitted to external services. This can lead users to enable publishing without understanding data-flow, credential sensitivity, or the consequences of sending drafts and metadata to third-party APIs.
The README says the assistant will automatically recognize and load the skill based on broad keywords, which creates scope ambiguity for activation. In an agent environment, generic auto-loading can cause the skill to run in conversations where the user did not intend content fetching or publishing behavior, increasing the risk of unintended external actions or prompt-surface expansion.
The listed triggers include generic phrases like "WeChat format" and "get article from RSS," which are likely to collide with ordinary user requests unrelated to this specific skill. In an auto-activation framework, such collisions can unexpectedly invoke parsing, content transformation, or publishing workflows and expose users to unintended external operations.
The README instructs users to place WeChat AppID and AppSecret into a local config file without prominent guidance on credential sensitivity, storage hygiene, or exclusion from version control. This increases the risk of accidental secret exposure through commits, backups, logs, or shared environments, especially for users following setup steps verbatim.
The README advertises optional automatic publishing to WeChat drafts using API credentials, but it does not clearly warn that content and metadata will be transmitted to an external third-party service. In an agent skill context, this omission can cause users to enable publishing without fully understanding that private, copyrighted, or sensitive article content may be uploaded outside their local environment.
An overly broad auto-activation trigger such as requests about publishing articles to a public account can cause the skill to activate in situations the user did not specifically intend. In an agent ecosystem, this raises the chance of unexpected processing, content transformation, or even downstream publication actions being initiated based on ambiguous prompts.
The skill advertises shell-based usage (bash scripts/...) but does not declare any explicit tool scope such as allowed tools or permissions. This creates an authorization and transparency gap: an agent may execute shell commands beyond what a reviewer expects, especially since the skill also references networked fetching and publishing workflows.
The skill mentions optional publishing via configured WeChat credentials, but it does not prominently warn that article content and credentials may be used in network API operations. This omission reduces informed consent and may cause operators to expose sensitive content or trigger publication actions without fully understanding the data-flow and external transmission risk.
This markdown file documents optional publishing using WeChat credentials and says drafts are automatically uploaded, but it does not explicitly warn users that article content and associated metadata will be transmitted to external services. Because this behavior can affect user data, privacy, and external account state, a user-facing warning is expected in the skill description.
The markdown template is written entirely as a Chinese-language output format, including Chinese labels such as the title, section headings, and content requirements. Because the file does not offer an opt-in language choice or explain that the skill is intentionally region-specific, it appears to impose a specific locale by default.
This script automatically publishes a selected article by invoking publish-article.sh with no interactive confirmation, approval gate, dry-run default, or other explicit safeguard in this code path. In the context of a content-publishing skill, that increases the risk of unintended or incorrect publication if upstream RSS input, filtering logic, or scheduling behaves unexpectedly.
This shell script presents its description, usage text, option help, examples, and runtime messages in Chinese only. Under the policy rule for natural-language violations, forcing a specific language without user opt-in is a locale policy issue unless the constraint is explicitly justified.
The generated date string is forced to Asia/Shanghai and rendered in Chinese weekday text, which imposes a specific locale on all users. This is a natural-language policy concern because the skill does not provide opt-in, configuration, or documentation justifying the locale restriction as region-specific.
The script's user-facing comments, usage text, and status messages are all in Chinese, which imposes a specific language on users. Under the policy, locale or language constraints should either be optional or clearly justified; this file provides no user choice or documented rationale for the language restriction.
The script explicitly documents that it uses curl to bypass SSRF protections and then fetches an attacker-controlled URL directly. In an agent skill context, this can be abused to access internal-only services, cloud metadata endpoints, or other network resources that higher-level platform safeguards were intended to block.
This script performs arbitrary outbound fetches against a user-supplied URL with curl, and the adjacent comment makes clear this is meant to evade SSRF restrictions. Because the skill is designed to ingest external articles, the dangerous behavior is directly on the main execution path, increasing the chance that a crafted URL could trigger internal network access or data exfiltration.
The script’s natural-language interface is written in Chinese and later forces Asia/Shanghai date formatting, but it does not provide any opt-in, locale selection, or justification that the skill is intentionally region-specific. This is a natural-language locale policy issue because users are required into a specific language/locale experience without choice.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
# 检查必需工具
echo "必需工具:"
for cmd in curl jq pandoc; do
if command -v "$cmd" &> /dev/null; then
echo " ✅ $cmd"
else
These lines explicitly set TZ=Asia/Shanghai and format dates in Chinese, enforcing a locale-specific output regardless of user preference. The file does not present this as a justified regional constraint or provide an option to choose another locale/timezone.
This shell script presents all user-facing messages in Chinese, including status output and usage examples, with no opt-in, fallback, or explanation that the skill is intended only for Chinese-speaking users. That creates a natural-language locale policy concern because the skill effectively enforces a specific language for interaction.
The changelog explicitly says SKILL.md was updated to Chinese and README was changed to prioritize Chinese. This is a natural-language locale policy concern because it signals a default language constraint without indicating user choice or a documented region-specific reason.
Natural-language policy requires avoiding forced language or locale constraints unless users are given a choice or the restriction is clearly justified. This guide presents all operational instructions in Chinese and sets no expectation that the skill is China-specific or Chinese-only.
No suspicious patterns detected.