T08 · Insecure Dependencies
Warning
- Location
- SKILL.md:10
- Finding
- Unpinned Third-Party Python Dependencies## Vulnerability Details **File Location**: `SKILL.md:10-28` **Vulnerability Type**: Unpinned dependencies and non-reproducible package resolution **Risk Level**: Medium ### Vulnerable Code ```yaml "install": [ { "id": "python", "kind": "pip", "package": "streamlit", "label": "Install Streamlit (pip)", }, { "id": "pandas", "kind": "pip", "package": "pandas", "label": "Install Pandas (pip)", }, { "id": "plotly", "kind": "pip", "package": "plotly", "label": "Install Plotly (pip)", }, ], ``` ### Technical Analysis The installation metadata identifies `streamlit`, `pandas`, and `plotly` only by package name, without exact versions or integrity hashes. Consequently, installation resolves whichever compatible releases are available from the configured Python package index at installation time. This makes installations non-reproducible and leaves the Skill exposed to supply-chain risks. If an upstream package, one of its transitive dependencies, the configured package index, or the dependency-resolution environment is compromised, installation may retrieve and execute code that was not present during this audit. Ordinary incompatible future releases could also unexpectedly alter application behavior. No evidence was found that these package names are intentionally malicious or that the project uses dependency confusion or typosquatting. The risk arises from unconstrained dependency resolution rather than from a confirmed compromise of the named packages. ### Attack Path 1. An attacker compromises an upstream package release, a transitive dependency, or the package index used by pip. 2. The attacker publishes a malicious version that satisfies the unconstrained package specification. 3. A user or automation framework installs the Skill dependencies after that version becomes available. 4. Pip ...[truncated 988 chars]
- Remediation
- ## Remediation Suggestions 1. Pin every direct dependency to an exact, reviewed version, for example `streamlit==X.Y.Z`. 2. Generate and commit a lock file that records all transitive dependency versions. 3. Require cryptographic hashes during installation, such as through a hash-locked requirements file installed with `pip install --require-hashes`. 4. Obtain packages only from an explicitly configured, trusted package index. Avoid silently inheriting untrusted extra indexes or mirrors. 5. Perform dependency vulnerability and provenance checks in CI before approving lock-file updates. 6. Apply dependency updates through a controlled review process rather than automatically resolving the newest available releases. 7. Install and run the application in an isolated virtual environment or container under a non-privileged account with access limited to the required log directories.
