T09 · Insecure Skill Coding Practices
- Location
scripts/weread_call.py:29- Finding
Unrestricted Authenticated WeRead Gateway Caller
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This WeRead helper is coherent, but it needs Review because it can use your WeRead API key for broad authenticated API calls and exports private reading data with limited guardrails.
Install only if you are comfortable giving the skill access to your WeRead API key, reading history, bookshelf metadata, private highlights, and thoughts. Avoid using the generic weread_call.py helper unless you know the endpoint is safe, review export paths carefully, and verify the external weread-skills ZIP through a trusted channel before installing it.
scripts/weread_call.py:29Unrestricted Authenticated WeRead Gateway Caller
SKILL.md:13Unpinned and Unverified Remote Skill Dependency
Skill modifies its own code, configuration, or behavior at runtime. Self-modification enables an agent to escalate privileges, disable safety constraints, or install persistent backdoors.
- `weread-skills`: official API documentation and endpoint semantics. Required dependency, installed from `https://cdn.weread.qq.com/skills/weread-skills.zip`.
- `weread-plus`: orchestration, analysis, exports, recommendations, and privacy-safe presentation.
Do not edit `weread-skills`. If official docs and this skill conflict, trust the official skill for endpoint fields and update this skill later.
## Decision Tree
The skill instructs use of local scripts, environment variables, file reads/writes, and network access, but it does not declare any explicit tool scope or permission boundaries. This creates an authorization ambiguity where an agent may invoke broader capabilities than users expect, increasing the risk of unintended access to local files, secrets such as WEREAD_API_KEY, or remote endpoints during normal skill execution.
The skill enables implicit invocation without any trigger phrases or scope constraints, which can cause the agent to activate this skill in response to broad or ambiguous user requests. Because this skill chains enhanced workflows on top of another installed skill and may access reading-history-related functions, unintended invocation could expose user data, perform unwanted actions, or influence responses when the user did not explicitly request this skill.
The workflow allows exporting personal notes to an arbitrary user-specified file path without any privacy or path-safety guidance. Because the exported content contains personal highlights and thoughts, this can lead to accidental disclosure, overwriting sensitive files, or writing data into shared/synced locations if the surrounding agent executes the command naively.
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.
GATEWAY_URL = "https://i.weread.qq.com/api/agent/gateway"
DEFAULT_OFFICIAL_SKILL_DIR = Path("~/.codex/skills/weread-skills").expanduser()
FALLBACK_SKILL_VERSION = "1.0.3"
The generated natural-language output strings in the analysis and markdown rendering are consistently fixed to Chinese, including summaries, headings, warnings, and reading prompts. This forces a specific language/locale on users without any opt-in or configuration path, which matches the policy-violation criterion for language constraints.
The script calls remote WeRead API endpoints to retrieve bookmarks and personal reviews, which necessarily transmits identifiers and accesses private user data. The file contains no confirmation prompt, user-facing log, or warning comment explaining that it will contact a remote service and process personal account data.
This script exports a user's personal WeRead highlights and thoughts either to stdout or to a file, but it does not provide any explicit warning, confirmation, or privacy notice before disclosing potentially sensitive reading history and annotations. In the context of a note-export skill, this creates a real privacy risk because users may unknowingly print private content into shared terminals, logs, chat transcripts, or insecure files.
The markdown report includes sensitive bookshelf metadata such as whether books are marked private, counts of private items, recent reading activity, and titles/authors of recently read books. In a reporting/export skill, this can leak intimate reading habits if the output is shown, logged, or shared without an explicit warning or consent step, especially because the skill description includes personal note export and reading reports where disclosure is plausible.
The generated markdown headings and labels are hard-coded in Chinese, which imposes a specific language on all users regardless of preference. This is a natural-language policy concern unless the tool is explicitly documented as Chinese-only or offers opt-in locale selection.
The generated markdown headings and labels are fixed in Chinese, and the script provides no option for users to select another language or opt into this locale. This is a natural-language policy concern because the skill forces a specific language in user-facing output without offering a choice or documenting a justified locale restriction.
The generated markdown output uses fixed Chinese headings and labels such as '公开书评', '概览', '评论', '作者', and '日期'. Because the script does not provide any user opt-in or locale selection, it imposes a specific language on all users, which matches the language/locale policy violation criterion.
No suspicious patterns detected.