Skip to content

chore(security): target dependency lock for CVE fixes - #182

Merged
krisztianfekete merged 3 commits into
agentevals-dev:mainfrom
inFocus7:cve-refresh-deps
Aug 12, 2026
Merged

chore(security): target dependency lock for CVE fixes#182
krisztianfekete merged 3 commits into
agentevals-dev:mainfrom
inFocus7:cve-refresh-deps

Conversation

@inFocus7

@inFocus7 inFocus7 commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Resolves CVEs with targeted uv lock --upgrade-package bumps for dependencies with medium+ CVE fixes.

pkg old new fixes
litellm 1.76.3 1.85.7 CVE-2026-49468, CVE-2026-40217, CVE-2026-47101, CVE-2026-47102, CVE-2026-59822
authlib 1.6.8 1.7.2 CVE-2026-27962, CVE-2026-28490, CVE-2026-28498, CVE-2026-41425, CVE-2026-41479, CVE-2026-44681
pyjwt 2.11.0 2.13.0 CVE-2026-32597, CVE-2026-48522, CVE-2026-48523, CVE-2026-48525, CVE-2026-48526
cryptography 46.0.5 50.0.0 CVE-2026-69247, CVE-2026-69248, CVE-2026-69249, GHSA-537c-gmf6-5ccf
urllib3 2.6.3 2.7.0 CVE-2026-44431, CVE-2026-44432
aiohttp 3.14.1 3.14.3 CVE-2026-59881, CVE-2026-69243, CVE-2026-69244
nltk 3.9.2 3.10.2 CVE-2026-12061, CVE-2026-12072, CVE-2026-12074, CVE-2026-12075, CVE-2026-54293
mcp 1.26.0 1.29.0 CVE-2026-59950
pyasn1 0.6.2 0.6.4 CVE-2026-59884, CVE-2026-59885, CVE-2026-59886
python-multipart 0.0.22 0.0.32 CVE-2026-53539
requests 2.32.5 2.34.2 CVE-2026-25645
pydantic-settings 2.13.0 2.15.0 GHSA-4xgf-cpjx-pc3j
python-dotenv 1.2.1 1.2.2 CVE-2026-28684
idna 3.11 3.18 CVE-2026-45409

Dockerfile pip removal

Removed the base image's bundled pip (unused) as it resulted in CVEs being caught due to its vendored packages - at least using Trivy, which checks pip/_vendor/vendor.txt.

Resolved CVEs Summary

70 fixed

C H M Total
0.9.7 14 73 95 182
PR 9 33 70 112

Notes

Unresolved CVEs

The remaining CVEs are unresolvable (~96 Debian bookworm OS packages with no published fix, 4 starlette blocked by the google-adk<2.2 pin, python-interpreter CVEs fixed only in 3.15 line)

Debian OS packages — no fix shipped in bookworm:

CPython interpreter — fixes exist only in the 3.15 line (no 3.14 backport published): HIGH CVE-2026-11940, CVE-2026-11972, CVE-2026-15308; MEDIUM CVE-2025-15366, CVE-2025-15367, CVE-2026-0864, CVE-2026-12003; plus CVE-2026-4360 (no fix anywhere yet). Fixable only by migrating the base to python:3.15-slim. Do we want to / are we OK with upgrading to python 3.15?

starlette — fix exists but is unreachable: MEDIUM CVE-2026-48710 (fixed 1.0.1), CVE-2026-48817 + HIGH CVE-2026-48818 (1.1.0), HIGH CVE-2026-54283 (1.3.1) — all require starlette 1.x, blocked by agentevals' google-adk<2.2 pin (google-adk ≥2.6 is what allows starlette ≥1.3.1).

Local Verification

  • Unit Tests: 750 passed / 1 failed — the failure (test_mcp_server.py::test_evaluate_sessions_posts_builtin_evaluator_overrides) reproduced identically on main with the unmodified lock (expected payload predates the credentialRef/judgeBaseUrl fields), so it's pre-existing, not introduced here.
  • Integration Tests: 29 passed (18 e2e-marked deselected).
  • Docker image builds; trivy+grype scan of the built image confirms every CVE listed above is cleared and nothing new appears.

@inFocus7
inFocus7 marked this pull request as draft August 11, 2026 17:28
@inFocus7
inFocus7 marked this pull request as ready for review August 11, 2026 18:09
@inFocus7 inFocus7 changed the title chore(security): refresh dependency lock for CVE fixes chore(security): target dependency lock for CVE fixes Aug 11, 2026

@krisztianfekete krisztianfekete left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks! I'm doing the CI side separately on main (install extras so the mcp tests stop being skipped, plus a uv lock --check gate). Please rebase once this is in: #184.

Your questions:

  • 3.15 should be its own PR, wheel availability plus our matrix stops at 3.13.

  • The google-adk<2.2 pin is the more interesting one since it holds back a HIGH starlette CVE on the request path. Opening an issue for that.

Comment thread pyproject.toml
[project.optional-dependencies]
live = [
"mcp>=1.26.0",
"mcp>=1.28.1,<2",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

uv.lock isn't shipped in the wheel and we publish to PyPI, so pip install agentevals-cli still resolves the vulnerable versions.

Please floor both at the locked versions. python-multipart especially, it parses the upload endpoints.

Comment thread Dockerfile
# pip so its vendored packages (msgpack, pkg_resources) don't ship unused.
&& rm -rf /usr/local/lib/python*/site-packages/pip \
/usr/local/lib/python*/site-packages/pip-*.dist-info \
/usr/local/bin/pip* \

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good change, two things:

  1. This regresses silently. rm -rf on a non-matching glob exits 0, so a base image or Python minor change quietly restores pip and its vendored CVEs with nothing failing. Add to the same layer: && ! /usr/local/bin/python -c "import pip" 2>/dev/null \
  2. Please call out the pip removal in the PR body. The title says lock bumps only, so this image change is currently invisible in the release notes.

Qq: newer pip doesn't vendor pkg_resources, that comes from setuptools. Which path did the scanner actually flag?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pip 26.2.1 (which the image has) has a vendored copy of pkg_resources (/usr/local/lib/python3.14/site-packages/pip/_vendor/pkg_resources/), and it's recorded in pip/_vendor/vendor.txt as setuptools==70.3.0. That manifest line is what the scanner keyed on

Comment thread uv.lock
Comment on lines +1058 to +1069
resolution-markers = [
"python_full_version < '3.13' and sys_platform == 'win32'",
"python_full_version < '3.13' and sys_platform == 'emscripten'",
"python_full_version < '3.13' and sys_platform != 'emscripten' and sys_platform != 'win32'",
]
dependencies = [
{ name = "google-api-core" },
{ name = "google-auth" },
{ name = "google-cloud-core" },
{ name = "google-crc32c" },
{ name = "google-resumable-media" },
{ name = "requests" },
{ name = "google-api-core", marker = "python_full_version < '3.13'" },
{ name = "google-auth", marker = "python_full_version < '3.13'" },
{ name = "google-cloud-core", marker = "python_full_version < '3.13'" },
{ name = "google-crc32c", marker = "python_full_version < '3.13'" },
{ name = "google-resumable-media", marker = "python_full_version < '3.13'" },
{ name = "requests", marker = "python_full_version < '3.13'" },

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This forks the lock by Python version: google-cloud-storage only moves to 3.13.1 on 3.13+, and stays at 2.19.0 below that.

So if you scanned the built image, that's 3.14 and only covers one side of the fork. Do you know if anything scanned the 3.11/3.12 graph, which is what a pip install user gets?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah good call-out, i just scanned the image so it would have been 3.14!

I now did a trivy scan of 3.11 requirements (exported via uv export --frozen --no-dev --all-extras -p 3.11 ) which were just the known starlette cves.

Signed-off-by: Fabian Gonzalez <fabian.gonzalez@solo.io>
Signed-off-by: Fabian Gonzalez <fabian.gonzalez@solo.io>

@krisztianfekete krisztianfekete left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, two small things:

  1. Can you drop cryptography>=50.0.0? It's the floor most likely to make us unresolvable next to something else, it's compiled, and we never import it. The lock still pins 50.0.0 for the image.
  2. The comment says google-adk[eval] pulls all of these, which is not quite right. litellm comes via a google-cloud-aiplatform extra, aiohttp via litellm and kubernetes, idna via httpx and requests. Can you please reword these to not confuse future readers?

Signed-off-by: Fabian Gonzalez <fabian.gonzalez@solo.io>
@inFocus7

Copy link
Copy Markdown
Contributor Author

Dropped the cryptography floor and reworded the comment (made it generalized, i don't think specifics really matter there)

@krisztianfekete
krisztianfekete merged commit 5b4ad18 into agentevals-dev:main Aug 12, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants