Repository navigation
fix(deps): bump filelock, litellm, msgpack, oauthlib, virtualenv for new CVEs - #240
Conversation
…new CVEs pip-audit now fails on main: CVE-2026-112907/112913/112940 (filelock 3.32.6), CVE-2026-114612 (litellm 1.102.0), CVE-2026-114613 (msgpack 1.2.1) and CVE-2026-49272 (oauthlib 3.3.1). osv-scanner also flags GHSA-cx6f-vjhg-g3cc / CVE-2026-115586 (virtualenv 21.14.12). - filelock 3.32.6 -> 4.2.4, msgpack 1.2.1 -> 1.2.3, oauthlib 3.3.1 -> 4.0.0, virtualenv 21.14.12 -> 21.14.13, held by new constraint-dependencies floors - litellm 1.102.0 -> 1.103.1, the litellm extra floor raised to >=1.103.1 - certifi, cryptography, requests, pip, pip-audit: patch/minor bumps - drop all four pip-audit --ignore-vuln flags and both osv-scanner ignores: neither scanner reports any of them now Every new version is older than the 24 h safe-chain package-age gate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Claude finished @uipreliga's task in 1m 29s —— View job PR Review in Progress
|
uipreliga
left a comment
There was a problem hiding this comment.
Review: coder_eval — pr:240 (4 files) axis:1,2,3,4,5,6,7,8
Scope: pr:240 (4 files) axis:1,2,3,4,5,6,7,8 · branch fix/deps-cve-bumps-2026-10 · 16f538d · 2026-10-27T18:55Z · workflow variant
Change class: trivial — dependency floor/lockfile bumps plus removal of now-unneeded CVE ignore entries; no code path changes
coder_eval is in very good health: seven of eight axes have no findings, and grading, resume, timing and the harness core show nothing that can change a task's score or final_status for the same agent output; the only real risk is one low-severity supply-chain gap, where the new CVE floors exist only in [tool.uv] constraint-dependencies and so do not reach PyPI consumers (oauthlib is on the base runtime chain); the bottom line is to merge after a one-line fix or a comment.
Summary
| Axis | Score | 🔴 | 🟠 | 🟡 | 🔵 | Top Issue |
|---|---|---|---|---|---|---|
| 1. Code Quality & Style | 10 / 10 | 0 | 0 | 0 | 0 | — |
| 2. Type Safety | 10 / 10 | 0 | 0 | 0 | 0 | — |
| 3. Test Health | 10 / 10 | 0 | 0 | 0 | 0 | — |
| 4. Security | 9.9 / 10 | 0 | 0 | 0 | 1 | The new CVE floors are only in [tool.uv] constraint-dependencies, so PyPI consumers of coder-eval do not get them. One of them, oauthlib, is on the base runtime dependency chain. |
| 5. Architecture & Design | 10 / 10 | 0 | 0 | 0 | 0 | — |
| 6. Error Handling & Resilience | 10 / 10 | 0 | 0 | 0 | 0 | — |
| 7. API Surface & Maintainability | 10 / 10 | 0 | 0 | 0 | 0 | — |
| 8. Evaluation Harness Quality | 10 / 10 | 0 | 0 | 0 | 0 | — |
Overall Score: 10 / 10 · Weakest Axis: Security at 9.9 / 10
Totals: 🔴 0 · 🟠 0 · 🟡 0 · 🔵 1 across 8 axes.
Blockers
None.
Non-blocking, but please consider before merge
None.
Nits
- [Axis 4] The new CVE floors are only in [tool.uv] constraint-dependencies, so PyPI consumers of coder-eval do not get them. One of them, oauthlib, is on the base runtime dependency chain. (
pyproject.toml:231) — The PR adds these lines underconstraint-dependencies = [(line 224, comment# Fix known CVEs in transitive dependencies):"filelock>=4.2.1",(227),"msgpack>=1.2.3",(230),"oauthlib>=4.0.0",(231) and"virtualenv>=21.14.13",(238). uv applies constraint-dependencies only when it resolves this project. They are not written to the published wheel's Requires-Dist. In uv.lock, oauthlib is reached from the BASE runtime deps: coder-eval ->"azure-monitor-opentelemetry-exporter>=1.0.0b30,<1.1.0"(line 58) -> msrest 0.7.1 -> requests-oauthlib 2.0.0 (Requires-Dist: oauthlib >=3.0.0) -> oauthlib. A downstream consumer with an existing lock, such as the coder-eval-uipath nightly runner, can therefore keep oauthlib 3.3.1, which has CVE-2026-49272, -49264 and -49265. filelock reaches users through theharborandlitellmextras (harborfilelock>=3.29.4, tokenizers -> huggingface-hubfilelock>=3.10.0), and msgpack through theuipathextra (uipath -> pysignalr). virtualenv is dev-only, so it does not matter downstream. The risk is low: the known oauthlib advisories are in server-side OAuth endpoints that coder-eval never runs, and a freshuv tool install coder-eval(action.yml) resolves to the newest versions anyway. The repo already has a precedent for putting a floor in the published metadata:"starlette>=1.3.1",is a base dependency at line 52 (src/ does not import starlette) and also appears in the constraint list. Do one of these: (a) for the runtime-path package (oauthlib), add the same floor to [project.dependencies] as the starlette precedent does, or (b) add one comment at line 225 that says these floors protect only this repo's lock and CI, not PyPI consumers. That tells downstream maintainers to bump in their own lock. The litellm floor change ("litellm>=1.103.1,<2.0.0", line 108) is in [project.optional-dependencies], so it already goes to consumers. Its placement is correct. CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:N/A:N
What's Missing
Tests:
- 🔵 No test imports the real telemetry exporter chain. The PR takes oauthlib from 3.3.1 to 4.0.0 (a major bump) on the base runtime path azure-monitor-opentelemetry-exporter -> msrest -> requests-oauthlib 2.0.0 -> oauthlib. Every telemetry test mocks the exporter: tests/test_telemetry.py:60 and :600 patch
AzureMonitorLogExporter, and :586 sets the module to None. src/coder_eval/telemetry.py:219 catches ImportError and logs it only at debug level. So if a later oauthlib or requests-oauthlib release breaks that import, telemetry turns off with no message and CI stays green. I imported the chain manually with oauthlib 4.0.0 and requests-oauthlib 2.0.0 and it works today, but nothing will catch the next break. Add one unmocked smoke test that importsazure.monitor.opentelemetry.exporterandmsrest.authentication. filelock 3.32.6 -> 4.2.4 is also a major bump, but the harbor-e2e workflow runs on pull requests and exercises it, so it is less exposed. (trigger: uv.lock)
Nightly pipeline:
- 🔵 The PR does not say what happens to the Docker image that the nightly
driver: dockerruns use. docker/Dockerfile:107 installs withuv export --frozen --extra codex --extra antigravity --extra litellm --extra harbor | uv pip install, so the next image published from this lock gets two major bumps (filelock 4.x, oauthlib 4.x) and litellm 1.103.1. The commit message covers CVEs and the package-age gate. It does not say that the image dependency set changes or that the nightly run was checked against it. Add one line to the PR body about the image and nightly impact. (trigger: uv.lock)
Downstream consumers:
- 🔵 Same root cause as the Axis 4 finding, so I am not reporting it twice. The new floors for filelock, msgpack and oauthlib hold only this repo's uv.lock and the Docker image built from it. A downstream consumer with its own lock, such as the coder-eval-uipath nightly runner, keeps the vulnerable versions until it bumps them itself, and the PR does not tell those maintainers to do so. (trigger: pyproject.toml) (restates: Axis 4: CVE floors only in [tool.uv] constraint-dependencies, not published to PyPI consumers)
Harness & Lint Improvements
Static checks (lint / type):
- [ce-lint] CE069 (next free number; CE067 was used and then removed, CE068 is taken). The rule: every
[tool.uv] constraint-dependenciesentry whose package uv.lock shows as reachable from coder-eval's BASE[project.dependencies]must also appear in[project.dependencies]with a floor that is equal or higher. The other path is an entry in an EXEMPT dict with a reason (for example 'advisory is in a server-side code path we never run; downstream bumps in their own lock'). For a package that is reachable only through a published extra (harbor,litellm,uipath, ...), the floor goes in that extra or gets an EXEMPT reason. Packages that only thedevextra or dependency group can reach are skipped, because they never reach a consumer. This is a doc-surface/whole-tree rule (it reads TOML and the lock, not a Python AST). So it goes intests/test_custom_lint.pyas a@pytest.mark.lintclassTestCE069ConstraintFloorsPublished, and not intests/lint/rules/+runner.py. The helper goes intests/lint/constraint_floor_parity.pyand usestomllibonpyproject.tomlanduv.lock, liketests/lint/agent_roster_parity.py. It does a BFS from thecoder-evalpackage'sdependencies(and, separately, from eachoptional-dependencieskey) through[[package]].dependenciesand compares the floors withpackaging.specifiers. The defect goes in.claude/notes/lint-rules.md. It would have caught"oauthlib>=4.0.0"at pyproject.toml:231, which is reachable through coder-eval -> azure-monitor-opentelemetry-exporter -> msrest -> requests-oauthlib -> oauthlib and is not in[project.dependencies]. It would also flagfilelock>=4.2.1(harbor/litellm extras) andmsgpack>=1.2.3(uipath extra) for an extra-floor or an EXEMPT decision.virtualenv(dev-only) andstarlette(already a base dependency at line 52, the precedent) pass. The rule turns 'does this CVE floor reach PyPI consumers?' into a recorded decision for each package. Today that decision is left out without anyone noticing. Prevents: [Axis 4 Security, low] CVE floors for oauthlib (base runtime chain), filelock and msgpack (published extras) are only in[tool.uv] constraint-dependencies(pyproject.toml:224-238). uv does not write them to the wheel's Requires-Dist, so a downstream lock such as coder-eval-uipath's can keep oauthlib 3.3.1 (CVE-2026-49272/-49264/-49265).
Harness improvements (not statically reachable):
- Add a release-time check of the published metadata. In the Release workflow, build the wheel, then check that the floors in the wheel METADATA Requires-Dist are a superset of the non-EXEMPT CE069 floors. Also run
pip-auditagainst the downstream consumer's lock (the coder-eval-uipath nightly runner) after each coder-eval release, so that a stale transitive version (oauthlib 3.3.1) is reported in the repo that actually installs it. Why not static: The consumer's lock is in a different repository. Its resolved versions and the advisory DB are network state that this repo's AST/TOML checks cannot see. CE069 can only check that this repo publishes the floor. It cannot check that a consumer has re-resolved. Prevents: [Axis 4 Security, low] Downstream installs with an existing lock keep vulnerable transitive versions (oauthlib on the base chain, filelock/msgpack through extras), because the constraint-dependencies floors protect only this repo's own uv.lock and CI pip-audit/osv-scanner scope.
Top 5 Priority Actions
- No action is needed on score or final_status integrity: no confirmed finding can make the same agent output grade differently, so the grading, criteria, early-stop and resume paths need no change in this PR.
- Add "oauthlib>=4.0.0" to [project.dependencies] in pyproject.toml (base list ending at line 59, next to the "starlette>=1.3.1" precedent at line 52), so PyPI consumers that reach it through azure-monitor-opentelemetry-exporter -> msrest -> requests-oauthlib get CVE-2026-49272/-49264/-49265 fixed and do not keep oauthlib 3.3.1.
- Add one comment at pyproject.toml:225, under
# Fix known CVEs in transitive dependencies, that says constraint-dependencies protect only this repo's lock and CI and are not written to the wheel's Requires-Dist, so downstream maintainers know they must bump in their own locks. - Bump oauthlib, filelock (harbor/litellm extras) and msgpack (uipath extra) in the lock files of downstream consumers such as the coder-eval-uipath nightly runner, because their existing locks keep the vulnerable versions whatever this repo sets in pyproject.toml:227-231.
- Think about a small CE-style lint check, or an entry in .claude/harness-candidates.md, that flags a constraint-dependencies CVE floor for a package reachable from base [project.dependencies] that has no matching floor there; this stops the next CVE bump from repeating the gap.
Stats: 0 🔴 · 0 🟠 · 0 🟡 · 1 🔵 across 8 axes reviewed.

What
Bumps the locked dependencies that fail
pip-auditonmain, and removes the vulnerability ignores that no longer match anything.[litellm]extra)filelock,msgpack,oauthlibandvirtualenvget floors in[tool.uv] constraint-dependencies. Thelitellmextra floor goes to>=1.103.1.uv.lockchanges. The lock stays atrevision = 5(locked with uv 0.13.6).--ignore-vulnflags on the pip-audit step and bothosv-scanner.tomlentries are removed. pip-audit with no ignores on the synced CI venv (pygments 2.20.0, pip 26.2.2, oauthlib 4.0.0) reportsNo known vulnerabilities found.Why
The Quality Gate fails at the pip-audit step on every PR, for example #237 and #239. When that step fails, the test suite, osv-scanner and bandit do not run.
mainpassed on 2026-10-22, before these advisories were published.Package age
Every new version is older than the 24 h safe-chain minimum package age. The newest is certifi 2026.10.23, uploaded 2026-10-23 11:36 UTC.
Tests
make verify: 6389 passed, 4 skipped, coverage 93.25%. This ran before the virtualenv bump; after it,tests/test_custom_lint.pypasses (735).pip-audit --desc --skip-editable(no ignores) on a venv synced with--extra dev --extra uipath --extra codex --extra litellm --extra harbor: no known vulnerabilities.uv.lock:No issues found. Onmainit reports 7 advisories in 5 packages.Supersedes Dependabot #208 (oauthlib 4.0.0).
🤖 Generated with Claude Code