T08 · Insecure Dependencies
Warning
- Location
- SKILL.md:12
- Finding
- Unpinned and Unnecessary Third-Party Dependencies Increase Supply-Chain Risk<![CDATA[ ## Vulnerability Details **File Location**: `SKILL.md`, lines 12–16 **Vulnerability Type**: Unpinned and unnecessary package installation **Risk Level**: Medium ### Vulnerable Code ```json {"id": "uv-pip", "kind": "pip", "formula": "uv", "bins": ["uv"], "label": "Install uv (pip)"}, {"id": "pip-aiohttp", "kind": "pip", "formula": "aiohttp", "label": "Install aiohttp (pip)"}, {"id": "pip-argparse", "kind": "pip", "formula": "argparse", "label": "Install argparse (pip)"}, {"id": "pip-PyYAML", "kind": "pip", "formula": "PyYAML", "label": "Install PyYAML (pip)"}, ``` ### Technical Analysis The Skill installs Python packages by mutable package names without pinning reviewed versions or validating package hashes. Consequently, future installations may resolve to package releases that differ from those available when the Skill was audited. The declared dependency set is also broader than the implementation requires: - `argparse` is part of Python's standard library and does not need to be installed from PyPI. - `PyYAML` is not imported or used by `scripts/route.py`. - Installing these unnecessary packages creates avoidable opportunities for package installation hooks or dependency code to execute. - `uv` and `aiohttp` are installed without exact versions or integrity hashes. No evidence in the audited project proves that the currently resolved packages are malicious. The vulnerability is the unsafe dependency-resolution policy and unnecessary expansion of the supply-chain trust boundary. ### Attack Path 1. A user installs or invokes the Skill in an environment where its declared installation instructions are processed. 2. The package manager resolves `uv`, `aiohttp`, `argparse`, or `PyYAML` from the configured package index without enforcing an audited version and hash. 3. An attacker compromises a package, its maintainer account, the configured package index, or another component in the dependency-resolution chain. 4. The package manager downloads ...[truncated 1074 chars]
- Remediation
- <![CDATA[ ## Remediation Suggestions 1. Remove the `pip-argparse` declaration because `argparse` is included in supported Python versions. 2. Remove `pip-PyYAML` because the audited script does not import or use it. 3. Pin `uv` and `aiohttp` to explicitly reviewed versions rather than resolving unconstrained latest releases. 4. Use a lockfile that records exact transitive dependency versions. 5. Require cryptographic hashes for downloaded distributions, such as through a hash-locked requirements file. 6. Prefer a trusted, controlled package index and enforce TLS certificate validation. 7. Regularly scan locked dependencies for known vulnerabilities and review updates before changing pinned versions. 8. Run dependency installation and the Skill itself as an unprivileged user in an isolated environment with only the filesystem and network access required for coupon retrieval. ]]>
