T09 · Insecure Skill Coding Practices
- Location
scripts/fetch_article.js:85- Finding
Shell Command Injection in the Curl Fallback Fetcher
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill fits its WeChat-to-Obsidian note-taking purpose, but unsafe command execution and weak file/network boundaries require careful review before installation.
Install only if you are comfortable granting this skill network access, shell execution, and local file-write capability. Prefer providing an explicit vault path, avoid cookie-based fetching unless you understand the account/session risk, and do not process untrusted article links until the shell-command construction, URL validation, and vault path containment issues are fixed.
scripts/fetch_article.js:85Shell Command Injection in the Curl Fallback Fetcher
scripts/process_article.js:68Shell Command Injection in Child-Script Orchestration
scripts/fetch_article.js:38Server-Side Request Forgery Through Weak URL Validation and Redirect Following
scripts/save_to_vault.py:65Vault Directory Traversal Permits Writes Outside the Obsidian Vault
scripts/process_article.js:142Indirect Prompt Injection Through Untrusted Article Content
SKILL.md:12Unpinned Global NPM Dependency Installation
Here the issue is not the feature mismatch itself, but that the documented behavior masks local configuration access to discover the vault path. In context, a note-saving skill may reasonably write to a user-selected vault, but silently reading application config expands host-data access beyond the minimum necessary and could reveal local environment details.
Here the issue is not the feature mismatch itself, but that the documented behavior masks local configuration access to discover the vault path. In context, a note-saving skill may reasonably write to a user-selected vault, but silently reading application config expands host-data access beyond the minimum necessary and could reveal local environment details.
Here the issue is not the feature mismatch itself, but that the documented behavior masks local configuration access to discover the vault path. In context, a note-saving skill may reasonably write to a user-selected vault, but silently reading application config expands host-data access beyond the minimum necessary and could reveal local environment details.
Here the issue is not the feature mismatch itself, but that the documented behavior masks local configuration access to discover the vault path. In context, a note-saving skill may reasonably write to a user-selected vault, but silently reading application config expands host-data access beyond the minimum necessary and could reveal local environment details.
Here the issue is not the feature mismatch itself, but that the documented behavior masks local configuration access to discover the vault path. In context, a note-saving skill may reasonably write to a user-selected vault, but silently reading application config expands host-data access beyond the minimum necessary and could reveal local environment details.
Referenced artifact was not completely inspected
node scripts/process_article.js "https://mp.weixin.qq.com/s/xxxxx"
Referenced artifact was not completely inspected
node scripts/process_article.js "https://mp.weixin.qq.com/s/xxxxx"
Referenced artifact was not completely inspected
node scripts/process_article.js "https://mp.weixin.qq.com/s/xxxxx"
Referenced artifact was not completely inspected
node scripts/process_article.js "https://mp.weixin.qq.com/s/xxxxx"
Referenced artifact was not completely inspected
node scripts/process_article.js "https://mp.weixin.qq.com/s/xxxxx"
The privacy section claims all data remains local and is not sent to third parties, but the workflow explicitly retrieves content from remote WeChat URLs and even suggests using curl with cookies. This is a material privacy misrepresentation: users may provide authenticated cookies or sensitive links under false assumptions, enabling unintended disclosure to remote services and weakening informed consent.
The skill instructs reading a local Obsidian configuration file under the user's home directory to discover vault paths. That is broader host-data access than necessary for article conversion and can reveal sensitive filesystem structure, workspace names, and other personal metadata, especially if done automatically without explicit consent.
The HTTP request hard-codes an Accept-Language header of "zh-CN,zh;q=0.9,en;q=0.8", which imposes a locale preference regardless of user settings. The file does not provide any opt-in, configuration, or justification that this skill must operate only in a Chinese locale.
The manifest describes a skill for fetching WeChat article content and converting it into notes. While network access is expected, invoking a shell-accessing subprocess via execSync introduces command execution capability that is not necessary to the stated purpose and expands operational risk beyond simple HTTP retrieval.
The curl fallback explicitly sends "Accept-Language: zh-CN,zh;q=0.9", again enforcing a specific locale in natural-language-facing behavior. No user choice or documented regional limitation is present in the file.
The module docstring and usage examples describe the skill exclusively in Chinese and state that it generates Chinese-structured Obsidian notes. The file does not provide any opt-in, language-selection parameter, or justification that this skill is intended only for a Chinese-specific environment, which can violate a language/locale choice policy.
The script includes logic to read the local Obsidian configuration and enumerate vault paths, which reveals local filesystem information unrelated to the file's actual current behavior. Even if not exercised here, this is privacy-sensitive capability that expands access to user environment metadata without a clearly necessary purpose at this stage.
The script's advertised behavior says it will generate and store structured local notes, but the implemented behavior stops after fetching the article and printing the full content to stdout for an external agent to process. This creates a trust-boundary mismatch: users may believe processing is local when the data is actually exposed to another component, increasing risk of unintended disclosure.
The script prints the full article body and metadata to stdout for an external agent to consume, but does not clearly warn the user that content will leave the script's local processing boundary. If the article contains sensitive or copyrighted material, this can cause unintended disclosure to downstream tooling, logs, or remote services.
This Python file contains natural-language docstrings and CLI help text entirely in Chinese, and the script description gives no option for users to select another language or indication that the tool is intentionally region-specific. Under the stated policy, forcing a specific language without user opt-in is a natural-language policy violation.
The config sets "language": "zh", which hard-codes a specific language/locale preference. Under the policy, forcing a language without offering user choice or documenting a justified locale constraint is a natural-language policy violation.
This code makes an external curl request to a user-supplied URL, which is a network operation covered by the missing-warning rule for code files. While the script prints that it is fetching the URL, it does not disclose any privacy or network implications beyond progress output, and there is no accompanying docstring/comment warning about the outbound request.
The script's description, options, errors, and progress messages are all hard-coded in Chinese. This forces a specific language for all users without offering a locale choice or documenting a justified region-specific constraint.
Reading the user's Obsidian configuration without an explicit warning or consent at the access point is a privacy issue because it discloses local application state and filesystem paths. In this skill context, that access is especially questionable because the script does not complete the promised local save flow in this file.
The manifest says the skill converts WeChat articles into notes and stores them locally, which justifies writing notes into a vault. However, this implementation also inspects a user-specific application config file under '~/Library/Application Support/obsidian/obsidian.json' to enumerate/open vault metadata, which is an additional local data access capability not explicitly implied by article conversion itself.
Detected: suspicious.dangerous_exec