Skip to content

CVEs survive pip-audit fix across reboots // uv.lock pins vulnerable versions of packages #60841

Description

@Jagermaster2469

Bug Description

The Hermes Agent venv ships with a uv.lock file that explicitly pins three packages at versions with known security vulnerabilities. Any pip-based fix (pip-audit --fix or pip install --upgrade) is transient — the next time
uv sync runs (which happens on gateway restart, system reboot, or Hermes self-repair), the packages are downgraded back to the vulnerable pinned versions. This was verified across a full system reboot — packages reverted on gateway restart.

Steps to Reproduce

1. Install Hermes Agent v0.18.2 via git on a clean system
2. Run pip-audit inside the venv:
   .hermes/hermes-agent/venv/bin/pip-audit
3. Observe 8 vulnerabilities in 3 packages
4. Fix them: pip-audit --fix (or pip install --upgrade cryptography starlette python-multipart)
5. Verify zero vulns: pip-audit → clean
6. Reboot the system (or restart hermes-gateway which triggers uv sync)
7. Run pip-audit again → 8 vulnerabilities are back
8. Check uv.lock to confirm pinned versions:
   grep -A1 'name = "cryptography"' .hermes/hermes-agent/uv.lock | grep version
   → version = "46.0.7"

Expected Behavior

- uv.lock should pin secure versions of all dependencies 
- pip-audit should report zero known vulnerabilities in a fresh install
- Version pins in pyproject.toml should use compatible-release ranges instead of exact pins when possible, so security fixes can land without manual lock file updates

Actual Behavior

uv.lock hard-pins:
cryptography ==46.0.7
starlette ==1.0.1
python-multipart ==0.0.27

Pip-audit output after fresh sync:
Found 8 known vulnerabilities in 3 packages
Name              Version ID                  Fix Versions
cryptography      46.0.7  GHSA-537c-gmf6-5ccf  48.0.1
starlette                 1.0.1   PYSEC-2026-249         1.3.1
starlette                 1.0.1   PYSEC-2026-248         1.3.0
starlette                 1.0.1   CVE-2026-48818         1.1.0
starlette                 1.0.1   CVE-2026-48817         1.1.0
python-multipart  0.0.27  CVE-2026-53540      0.0.31
python-multipart  0.0.27  CVE-2026-53539      0.0.30
python-multipart  0.0.27  CVE-2026-53538      0.0.30

After pip install --upgrade cryptography starlette python-multipart:
ERROR: pip's dependency resolver: hermes-agent 0.18.2 requires cryptography==46.0.7,
but you have cryptography 49.0.0 which is incompatible.

Packages install at secure versions but conflict with declared dependency.
Next uv sync reverts to vulnerable versions.

Affected Component

Configuration (config.yaml, .env, hermes setup)

Messaging Platform (if gateway-related)

N/A (CLI only)

Debug Report

Vulnerable pins confirmed in uv.lock:
      cryptography ==46.0.7
      starlette ==1.0.1  
      python-multipart ==0.0.27

Operating System

Debian GNU/Linux 13 (trixie), aarch64

Python Version

Python 3.11.15 (Hermes venv) / Python 3.13.5 (system)

Hermes Version

Hermes Agent v0.18.2 (2026.7.7.2)

Additional Logs / Traceback (optional)

Root Cause Analysis (optional)

The fix requires:
- Bumping the locked versions in uv.lock (uv lock --upgrade-package cryptography --upgrade-package starlette --upgrade-package python-multipart)
- Relaxing exact pins in pyproject.toml to allow compatible security updates (e.g., cryptography>=46.0.7 instead of ==46.0.7)
- Adding pip-audit or a similar CVE scanner to CI to catch regressions

Proposed Fix (optional)

1. Run uv lock --upgrade-package cryptography --upgrade-package starlette --upgrade-package python-multipart to bump uv.lock
2. Relax exact pins in pyproject.toml where possible:
   - cryptography>=46.0.7 instead of ==46.0.7
   - starlette>=1.0.1 instead of ==1.0.1
   - python-multipart>=0.0.27 instead of ==0.0.27
3. Add pip-audit to CI workflow (e.g., .github/workflows/security.yml) to run on PRs and cron schedule
4. Consider adding a Dependabot or Renovate config to auto-bump security-critical packages

Are you willing to submit a PR for this?

  • I'd like to fix this myself and submit a PR

Metadata

Metadata

Assignees

No one assigned

    Labels

    P3Low — cosmetic, nice to havearea/configConfig system, migrations, profilesbugdependenciesPull requests that update a dependency filepython:uvPull requests that update python:uv codesweeper:risk-compatibilitySweeper risk: may break existing users, config, migrations, defaults, or upgradestype/securitySecurity vulnerability or hardening

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions