T08 · Insecure Dependencies
- Location
scripts/download_model.py:34- Finding
Automatic Installation and Upgrade of Unpinned Python Packages
- Content
View full analysis
- Remediation
View remediation
Security audit
Security checks for vulnerabilities and agentic risk
This skill is mostly a MiniCPM-o deployment guide, but it directs users or agents to run privileged and mutable remote install code without strong integrity controls.
Install only if you are comfortable with deployment tooling that changes the host environment and runs upstream installer code. Prefer a disposable VM, container, or dedicated virtual environment; review and pin the Git commit, installer checksum, and Python package versions before running the commands; and require explicit approval before any sudo or install step.
scripts/download_model.py:34Automatic Installation and Upgrade of Unpinned Python Packages
SKILL.md:99Execution of Remotely Retrieved Installers and Repository Scripts Without Integrity Pinning
The declared purpose centers on deployment and operation of MiniCPM-o 4.5 services, but the supplied code is a model acquisition utility. Its primary functions are probing Hugging Face vs. ModelScope, downloading the model snapshot, and validating config metadata. There is no code to launch a web demo, run vLLM, configure llamacpp-omni, expose inference endpoints, or troubleshoot runtime services. The package auto-install behavior is secondary but also absent from the description. This is a material description-behavior mismatch because the primary purpose differs.
Tool calls are chained to bypass individual safety checks or escalate capabilities beyond what any single tool call would allow.
1.2 FFmpeg
sudo apt update && sudo apt install -y ffmpeg
1.3 Clone Repository and Install Dependencies
Using curl with -k disables TLS certificate verification, training the agent or user to bypass transport security checks. Even though the target is localhost with a self-signed certificate, normalizing insecure flags can enable man-in-the-middle acceptance patterns and reduce trust guarantees if reused in other contexts.
Verify with curl:
curl -k https://localhost:8006/health
Four interaction modes:
The skill includes shell and file-read capabilities through explicit command sequences, but it does not declare any tool scope or allowed-tools boundaries. That creates an authorization gap: an agent may execute package installs, downloads, repository cloning, and process control without an explicit least-privilege contract, increasing the chance of unintended or overbroad system modification.
The trigger description is broad enough to activate on many generic 'deploy/start/configure/troubleshoot' requests, which can cause the skill to be invoked outside its narrow intended context. In an agent framework, overbroad matching increases the risk of unnecessary shell guidance, downloads, package installation, or repo-cloning instructions being surfaced in unrelated situations.
The agent guideline says only NVIDIA GPUs with at least 12GB VRAM are currently supported and instructs the agent not to provide deployment steps for Apple Silicon or CPU-only devices. Later, the hardware requirements table lists GGUF/llama.cpp as recommended for Apple M3+ and CPU-only environments, creating an active contradiction in the document about what platforms are supported.
The skill instructs the agent to run a sudo package installation command, which performs privileged system-wide changes. In an automated or semi-automated agent setting, privilege escalation without explicit scoping or confirmation can modify the host unexpectedly and increases the blast radius if the instruction is misapplied or combined with compromised package sources.
1.2 FFmpeg
sudo apt update && sudo apt install -y ffmpeg
1.3 Clone Repository and Install Dependencies
Runtime package installation is broader than the script's stated purpose of downloading and verifying a model, and it implicitly modifies the host Python environment. Because deployment tooling often runs with elevated privileges in servers or containers, this behavior increases supply-chain risk and can lead to environment takeover or unstable, non-reproducible deployments.
Dynamic import() can load arbitrary modules at runtime, bypassing static analysis and potentially importing malicious code.
def _ensure_package(package: str, pip_name: Optional[str] = None):
"""Import a package, installing it via pip if missing."""
try:
__import__(package)
except ImportError:
install_name = pip_name or package
print(f"[*] Installing {install_name}...")
The script automatically runs pip install -U at runtime, causing execution of unpinned third-party package installation code in the user's environment. In a deployment skill, this is especially dangerous because it expands trust to remote package indexes and can introduce supply-chain compromise, unexpected upgrades, or arbitrary code execution during install hooks.
except ImportError:
install_name = pip_name or package
print(f"[*] Installing {install_name}...")
subprocess.check_call(
[sys.executable, "-m", "pip", "install", "-U", install_name],
stdout=subprocess.DEVNULL,
)
No suspicious patterns detected.