T08 · Insecure Dependencies
- Location
SKILL.md:79- Finding
Installation Instructions Execute a Different, Unpinned Registry Package
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The local code is a simple proposal-template CLI, but the install docs point to a different npm package than the reviewed artifact.
Review before installing. Do not run the documented npm install or npx command unless the package name is corrected to the reviewed artifact and pinned to a specific version. Do not put real API keys in the suggested config file, and avoid saving proposals containing sensitive client details unless you know where the files are stored.
SKILL.md:79Installation Instructions Execute a Different, Unpinned Registry Package
README.md:172Documentation Encourages Unnecessary Plaintext API-Key Storage
The interactive flow states users may 'save or send' proposal content without any notice about data persistence or transmission. Because proposals can contain client details, pricing, timelines, and potentially confidential job information, users may unknowingly transmit or store sensitive content through unsafe channels.
npx commands without a version suffix (e.g. @1.0.0) create a rug-pull risk if the upstream server is compromised and publishes a malicious update.
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -X POST https://api.clawhub.ai/skills \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d @clawhub-publish-payload.json
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.
curl -X POST https://api.clawhub.ai/skills \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d @clawhub-publish-payload.json
The README presents the skill description, commands explanation, and usage guidance almost entirely in Chinese, with no indication that other languages are available or that Chinese is a region-specific requirement. This can constitute a language-policy issue when users are not given an explicit language or locale choice.
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.
示例:
freelance-proposal write \
--job "Need WordPress developer for custom theme" \
--skills "WordPress, PHP, CSS, JavaScript" \
--template premium \
The configuration enables statsTracking without any explanation of what data is collected, whether it is transmitted off-device, or how users can control retention and consent. In a tool processing client descriptions, budgets, and proposal text, undocumented telemetry can expose commercially sensitive or personal data and creates a meaningful privacy risk.
This markdown file contains user-facing instructions and descriptions exclusively in Chinese, with no indication that the user can choose another language. That creates a natural-language policy concern because it effectively forces a specific language without user opt-in.
This manifest includes user-facing feature text in Chinese, while the rest of the metadata is in English, but it does not document any language-selection behavior or indicate that the skill is intentionally limited to Chinese-speaking users. That creates a natural-language policy concern because the skill appears to impose a locale/language choice without user opt-in or justification.
This code hardcodes Chinese names/descriptions and later emits Chinese CLI messages, while also generating English proposal text. Because the skill does not provide any explicit language or locale selection, it effectively imposes a mixed language experience without user opt-in, which matches the language/locale policy concern.
This markdown template is primarily documented in Chinese, but the actual proposal body is hard-coded in English (for example, 'Dear {{clientName}}' and the full proposal text). That creates a language-policy concern because it prescribes a specific output language without offering the user a choice or explaining that the template is intended only for English-language clients.
The file is primarily written in Chinese, but the actual proposal template is fixed in English with phrases like "Hi {{clientName}}" and "Let's chat!". This imposes a specific language on the generated output without offering the user a language choice or stating that the skill is intentionally English-only.
This markdown template is introduced and documented in Chinese, but the actual proposal text is fixed in English. That effectively forces a specific output language without user opt-in or any documented justification, which matches the language/locale policy violation criteria.
This code requires SKILL.md to include the Chinese phrases 'AI 生成' and '客户分析', which operationally imposes a specific language/locale expectation. The file does not show any user choice or documented reason for this locale constraint, so it fits the policy category for forced language behavior.
The examples encourage saving generated proposals without warning that proposal content may include client names, budgets, project details, or other sensitive business information. Users may persist this data locally or in shared environments unintentionally, increasing the risk of privacy leakage or accidental exposure.
The markdown explicitly advertises the --save option and shows examples using it, but it does not warn users that generated proposals may contain client names, job descriptions, budgets, or other potentially sensitive marketplace information written to disk. For markdown files, the skill description should disclose behaviors that may affect user data or privacy.
The comment at L227 says 'Generate proposal using AI', and the module description at L005 describes an 'AI-powered proposal generator'. However, the implementation simply selects a hardcoded template and replaces placeholders from user-supplied options; there is no model invocation, inference, or external AI service. This is an intent/documentation contradiction rather than a mere omitted detail because the advertised mechanism ('AI-powered') is absent from the actual behavior.
The dependency uses a caret range, which allows npm to install newer compatible releases without explicit review. This weakens supply-chain integrity because a compromised or vulnerable upstream release could be pulled in during future installs, even if the manifest itself was not changed.
"author": "OpenClaw Skills Team",
"license": "MIT",
"dependencies": {
"commander": "^11.0.0",
"chalk": "^5.3.0",
"ora": "^7.0.0",
"inquirer": "^9.2.0"
The chalk dependency is unpinned and also has a referenced known advisory, so the actual installed version may drift into an affected release. In this context, an unpinned CLI dependency increases the chance of pulling a malicious or vulnerable package version during install, creating a realistic supply-chain risk.
"license": "MIT",
"dependencies": {
"commander": "^11.0.0",
"chalk": "^5.3.0",
"ora": "^7.0.0",
"inquirer": "^9.2.0"
},
The manifest does not pin chalk, and the package name is associated with a known advisory for malicious code in at least one release. Because the version is floating, it is impossible to verify from this file alone whether installations will resolve to a safe or affected version, making the risk materially higher than a generic unpinned dependency.
The ora dependency is specified with a version range rather than an exact version, allowing silent dependency changes over time. For a distributed skill/CLI package, this creates avoidable supply-chain exposure because users may install different code than the author originally tested.
"dependencies": {
"commander": "^11.0.0",
"chalk": "^5.3.0",
"ora": "^7.0.0",
"inquirer": "^9.2.0"
},
"engines": {
The inquirer dependency is not pinned, so future installations may resolve to different package contents than expected. This undermines reproducibility and increases the attack surface for dependency confusion, compromise, or newly introduced vulnerabilities in upstream releases.
"commander": "^11.0.0",
"chalk": "^5.3.0",
"ora": "^7.0.0",
"inquirer": "^9.2.0"
},
"engines": {
"node": ">=18.0.0"
The file presents its core instructional content in Chinese only, which imposes a specific language on users without offering a choice or explaining a locale-specific requirement. This matches the language/locale policy concern for natural-language content.
This markdown file contains natural-language content where the surrounding skill guidance is in Chinese, but the actual user-facing template is fixed in English. Because the file does not offer a language option or explain that English is required for a specific audience, it may violate language/locale policy expectations requiring user choice or opt-in.
The file’s surrounding instructions are in Chinese, but the actual client-facing template is hard-coded in English. This can amount to a language/locale policy issue because it implicitly forces a specific output language without documenting user choice or opt-in.
No suspicious patterns detected.