T08 · Insecure Dependencies
- Location
scripts/install_bundle.py:286- Finding
Unpinned Remote Skill Installation Without Integrity Verification
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
The skill is coherent, but its installer can add multiple unverified remote skills into the active agent skills folder without per-package confirmation, so it should be reviewed before use.
Install only if you trust the listed skill sources and are comfortable with remote skills being added to your active agent environment. Prefer the default restricted mode, review the skill list first, avoid custom registry or --dir values, and be aware that mirror misses can trigger an automatic fallback to another registry.
scripts/install_bundle.py:286Unpinned Remote Skill Installation Without Integrity Verification
scripts/install_bundle.py:174Installation Directory Traversal Outside the Configured Work Directory
This is a true tool-parameter abuse risk because the helper passes a dynamically constructed string into a shell. In a skill installer context, arbitrary command execution is especially dangerous: an attacker who can influence the command parameter or trigger unsafe reuse could execute OS commands, tamper with installed skills, or compromise the user's workspace.
return resolved
probe_cmd = f"where {command}" if os.name == "nt" else f"command -v {command}"
probe = subprocess.run(
probe_cmd,
shell=True,
text=True,
The skill directs the agent to read local files and execute shell commands for search, installation, and verification, but it does not declare any explicit tool scope such as permissions or allowed-tools. This creates an authorization gap where the runtime may permit broader file and shell access than users expect, increasing the chance of unintended command execution or filesystem modification during skill use.
The trigger description includes broad natural-language phrases like finding, recommending, or installing skills for multiple research tasks, which can cause the skill to activate in many loosely related conversations. Over-triggering is dangerous here because the skill is capable of invoking shell commands and performing installations, so accidental activation could lead to unneeded external queries or package installs.
The documentation states that the skill installs into the user's home directory and may automatically fall back from a mirror to an external official source, but it does not prominently warn the user about local writes, network access, trust boundaries, or supply-chain risk. In context, this is more dangerous because the skill is specifically designed to fetch and install third-party content, so silent fallback behavior can expose users to unexpected remote sources and persistent local changes.
This code file contains natural-language strings in Chinese for bundle names, purposes, and mode descriptions, which effectively forces a specific language for users interacting with the tool. The file does not provide an opt-in, locale selection, or documented justification for this language constraint.
The code builds a shell command string with an unquoted variable (probe_cmd = f"... {command}") and executes it with shell=True. Although current call sites pass fixed command names, this helper accepts arbitrary input and would allow shell metacharacter injection if reused with attacker-controlled data, leading to arbitrary command execution in the installer context.
return resolved
probe_cmd = f"where {command}" if os.name == "nt" else f"command -v {command}"
probe = subprocess.run(
probe_cmd,
shell=True,
text=True,
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
sys.exit(1)
command_expr = "& " + " ".join(powershell_quote(part) for part in [command, *args])
return subprocess.run(
[shell_path, "-NoProfile", "-Command", command_expr],
text=True,
encoding="utf-8",
subprocess module calls execute external commands. Without careful input validation, this enables command injection.
import shlex
command_expr = " ".join(shlex.quote(part) for part in [command, *args])
return subprocess.run(
[shell_path, "-lc", command_expr],
text=True,
encoding="utf-8",
This file is a plain-text CSV, so SQP-3 applies. The title "Market Analysis CN" on L39 signals a locale-specific constraint, but the row does not provide any indication that the language/locale is optional, user-selected, or otherwise justified as a region-specific compliance need.
The title and entire maintenance document are written in Chinese, which constitutes a language-specific instruction/documentation choice. Under the policy, language constraints should either offer a user choice or be clearly documented as justified for a specific locale or region; no such opt-in or justification appears here.
L099-L104 明确要求结果中的“简短描述(中文)”,这构成了对输出语言的固定要求。文档没有说明这是可选项,也没有提供依据用户偏好切换语言的机制,因此存在语言/locale 策略约束风险。