T08 · Insecure Dependencies
- Location
pyproject.toml:6- Finding
Unpinned dependencies and missing lockfile permit supply-chain drift
- Content
View full analysis
=0.86.0", "httpx>=0.28.1", "keyring>=25.0.0", "mcp>=1.26.0", "pydantic>=2.12.5", "pytest>=9.0.2", "pytest-asyncio>=1.0.0", "python-dotenv>=1.2.2", ] ``` The documentation additionally states: ```markdown - `uv sync` installs pinned dependencies from the included `uv.lock` lockfile. It does not run arbitrary code or hooks. - All dependencies are declared in `pyproject.toml` and pinned in `uv.lock`. ``` No `uv.lock` file is present in the audited package. ### Technical Analysis Every dependency is specified with an open-ended minimum version using `>=`. Consequently, installation can resolve to future releases that were not present during review. This contradicts the documentation's claim that dependencies are pinned by an included lockfile. The application handles high-value secrets and data, including provider API keys, exchange API secrets, cloud service-account credentials, billing records, bank transaction descriptions, and cryptocurrency account information. A compromised dependency would execute in the same Python process and security context as the Skill, potentially gaining access to imported data, environment variables, filesystem state, and keyring APIs. Development-only packages such as `pytest` and `pytest-asyncio` are also included in production dependencies, unnecessarily increasing the dependency surface. ### Attack Path 1. An existing dependency account or distribution channel is compromised, or a malicious future release is published. 2. A user installs or updates the Skill using `uv sync`. 3. Because no packaged lockfile constrains resolution, the resolver selects the newer compromised version. 4. Malicious dependenc ...[truncated 770 chars]- Remediation
View remediation
