T08 · Insecure Dependencies
- Location
scripts/install.py:30- Finding
Unpinned Third-Party CLI Execution Through npx
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill broadly matches a marketplace installer, but its install and sync flows run an unpinned external CLI and the security notes understate network, download, and file-write behavior.
Review this skill before installing in a sensitive workspace. Its marketplace functions are recognizable, but install and sync depend on an unpinned npx clawhub command and can download or install third-party skills into your OpenClaw skills directory. Prefer a pinned, trusted ClawHub CLI and inspect any skill before installation.
scripts/install.py:30Unpinned Third-Party CLI Execution Through npx
scripts/sync-from-clawhub.py:84Terminal Escape Injection Through Unsanitized Skill Metadata
README_EN.md:39Security Documentation Misrepresents Network, Download, and File-Write Behavior
The declared description presents a broad marketplace skill with sync, recommendation, advanced search, install, reviews, and leaderboard capabilities. The supplied code only implements browsing/listing behavior. It reads local directories and a local synced-skills JSON file, filters and sorts entries, and prints them. While this partially aligns with the 'browse' aspect of the description, the majority of the highlighted marketplace functionality is absent from this code chunk. Therefore the description materially overstates what this code actually does.
The declared description presents a broad marketplace/discovery product with recommendation, search, browsing, ranking, and social metadata features. The supplied code chunk only implements installation and local listing of installed skills, delegating installation to the external ClawHub CLI. While 'one-click install' is consistent with part of the description, the primary behavior of this code is much narrower than the declared purpose. There is no evidence here of recommendation logic, marketplace sync, search, Chinese keyword mapping, comments, ratings, or leaderboard functionality. Therefore the description materially overstates what this code chunk actually does.
The declared description promises a broad marketplace system with synchronization, recommendation, search, installation, review, and ranking features. The provided code chunk does not implement any of these capabilities; it only outputs two static lines related to rankings and explicitly says complete functionality would require additional statistics. This is a material mismatch in primary purpose and implemented functionality.
The description portrays a full marketplace with synchronization from ClawHub, discovery/search, installation, reviews, and Top100 rankings. The supplied code only implements a recommendation/display utility based on a local JSON file plus local installed-skill detection. While scenario/industry/role recommendation and fuzzy matching are consistent with part of the description, several headline capabilities are absent. The docstring mentions --keyword, but the actual argparse setup does not define it, so even the claimed keyword search is not implemented in this chunk. Therefore the declared description materially overstates and misrepresents the behavior of this code.
The supplied code only implements search functionality. It loads either a local skills directory or a previously synced JSON file and performs simple weighted substring matching across selected fields. There is no logic for syncing from ClawHub in this chunk, no recommendation engine, no scenario/industry/identity-based suggestions, no Chinese keyword mapping, and no true fuzzy search. It also does not browse marketplace listings, install skills, manage comments, or produce a Top100 leaderboard; it merely displays search results and prints a suggested install command. Since the declared description presents a broader marketplace with recommendation and enhanced discovery capabilities, while this code chunk is just a basic search tool, the description does not accurately represent the actual behavior of the supplied code chunk.
The supplied code only implements synchronization of a skill list from ClawHub into a local JSON file plus a console summary. It does support the broad declared theme of syncing skills from ClawHub and includes local installed-state detection and popularity display based on download counts. However, most of the declared marketplace functionality is absent from this code chunk: there is no recommendation engine, no scenario/industry/identity recommendation logic, no search implementation, no Chinese keyword mapping, no installation flow, and no rating/comment handling. Additionally, although --category is declared as an argument, it is not applied in the actual fetch command. Therefore the code chunk materially underdelivers relative to the description, so this should be flagged as a description-behavior mismatch.
The README is written entirely in Chinese and presents usage, safety notes, and examples only in Chinese, without indicating that another language is available or optional. This can violate a language/locale policy when a skill imposes a specific language on users without opt-in or documented justification.
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.
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.
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.
The security section explicitly tells users that install.py invokes npx clawhub install <skill>, again without pinning the package version. Unlike the earlier examples, this line describes actual runtime behavior of the skill's installer workflow, so a compromised or unexpected clawhub package version could affect users during installation through a supply-chain attack path.
The skill documents capabilities that include shell execution, file reads, and file writes, but it does not declare an explicit tool scope such as permissions or allowed-tools. This increases the chance that an agent or user will invoke higher-risk operations without clear consent boundaries, especially because the skill also includes installation workflows that modify the local skills directory and invoke external package tooling.
The display name and description are written in Chinese and emphasize Chinese keyword support, but the file does not state that the skill is China-specific or offer an opt-in or alternative language. Under the policy, imposing a specific language or locale without user choice is a natural-language policy concern.
Using npx clawhub without a pinned package version allows execution of whatever package version is current at install time. That creates a supply-chain risk: a compromised, typosquatted, or unexpectedly changed upstream package could execute arbitrary code on the user's system during installation.
The security section states that no external code is downloaded, but elsewhere in the same document it acknowledges that install.py causes npx clawhub install to fetch and install skills. This contradiction can mislead users into approving execution under false assumptions, weakening informed consent around remote code retrieval and execution.
This is another documented invocation of npx clawhub without version pinning, which exposes users to upstream package substitution or malicious updates. Because the command is tied to skill installation, a bad package could directly lead to arbitrary code execution and filesystem changes.
Referencing npx clawhub unpinned in the security/system-operation documentation normalizes execution of an unversioned remote package. In a marketplace/install context, this is especially risky because users are encouraged to run it as part of normal operation and may not recognize the supply-chain trust boundary.
Natural-language descriptions, keys, and category labels are presented only in Chinese, which can effectively impose a single language/locale on users or operators consuming this skill metadata. The file does not offer an alternative language, locale selection, or documentation that this is intentionally limited to a Chinese-speaking region.
This JSON manifest defines recommendation buckets such as "日常办公", "开发编程", and role/industry labels that are very broad, but provides no explicit trigger constraints, invocation context, or negative examples. In a skill-selection or auto-recommendation system, such generic labels can overlap with common user intents and cause unintended or overly aggressive skill recommendations.
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
def check_clawhub_installed():
"""检查 ClawHub CLI 是否已安装"""
try:
result = subprocess.run(['npx', 'clawhub', '--version'], capture_output=True, text=True)
return result.returncode == 0
except Exception:
return False
The code invokes 'npx clawhub install' on a user-supplied skill name, which causes retrieval and installation of remote content with local filesystem effects. Although shell injection is mitigated by passing a list to subprocess.run, this is still a supply-chain/trust-boundary issue because the script automates installation of external code or assets into the user's skill directory with no validation, pinning, signature check, or allowlist.
# 使用 ClawHub CLI 安装
try:
log_info("调用 ClawHub CLI 安装...")
result = subprocess.run(
['npx', 'clawhub', 'install', skill_name],
cwd=str(skills_dir),
timeout=120
The script recommends running 'npx clawhub install ' without pinning a specific version. Unpinned npx execution can fetch whatever version is current at execution time, exposing users to upstream compromise, typosquatting, or malicious updates in the package or its dependency chain.
This user guidance again instructs execution of an unpinned 'npx clawhub' command, repeating the same supply-chain risk. Because this skill is a marketplace installer whose purpose is to fetch third-party skills, the trust boundary is especially sensitive and the danger is increased by normalizing ad hoc remote installs.
The module description, CLI help examples, output strings, and comments are written for Chinese-language interaction, and the script presents its results and guidance in Chinese only. Because this code file does not offer user opt-in for language selection or explain a region-specific limitation, it conflicts with the language/locale policy requirement.
The module docstring and command-line help/output strings are written in Chinese, which effectively forces a specific language for users of the skill. The policy allows locale constraints only when users are given a choice or the restriction is clearly documented and justified, neither of which is present here.