Repository navigation
fix(prd-262): clear the 4 blocking scan findings — litellm KEVs in agent-opt-worker, Go stdlib in media-render's esbuild - #1242
Conversation
…(1.80.0 -> 1.91.5) images.yml run 39399292631 on main (330439e) scanned agent-opt-worker (amd64) with 2 blocking rows, both KEV-listed, in /usr/local/lib/python3.11/site-packages/litellm-1.80.0.dist-info: - GHSA-7488-6r32-c95q (CVE-2026-59822, High, KEV): MCP auth bypass via the OAuth2 passthrough fallback; fixed in 1.84.0. - GHSA-v4p8-mg3p-g94g (CVE-2026-42271, High, KEV): command execution through the MCP stdio test endpoints; fixed in 1.83.7. litellm 1.84 and later require openai>=2.20.0,<3, and ai-evaluation 1.1.0 (the newest on PyPI) still caps openai<2, which is why the lock held 1.80.0. overrides.txt now lifts that cap (openai>=2.20.0,<3). openai 2.0.0's only breaking change is the type of a Responses API tool-call output; ai-evaluation and agent-opt call chat completions, embeddings and moderations, and the SDKs' source repository (now agent-learning-kit) allows openai<3 on main. litellm 1.91.5 is the newest release that still ships a pure-Python wheel (1.92 adds a Rust extension; 1.95.1's manylinux wheel is 26.3 MB against 16.7) and adds no package to the lock (1.96 adds pydantic-settings, 1.98 boto3). It is past every fixed litellm GHSA, GHSA-3cv6-jpf6-8222 included. The breaking changes listed for 1.84-1.95 are all in the proxy (tags, /key/list, admin permissions, budgets, /v1/messages timeouts); the worker only reaches litellm.completion through agent-opt's LiteLLMGenerator. Lock changes (uv pip compile, the command in requirements.in): litellm 1.80.0 -> 1.91.5, openai 1.109.1 -> 2.54.0, importlib-metadata 9.0.1 -> 8.9.0 (litellm caps <9). Nothing added or removed. With litellm fixed, the three Critical allowlist entries for litellm 1.80.0 (GHSA-6wvf-77m9-58rm, GHSA-4xpc-pv4p-pm3w, GHSA-jjhc-v7c2-5hh6) no longer match anything and come out of .grype.yaml; the static test that pinned them now asserts litellm >= 1.84.0 with no litellm entry, and the openai override. Signed-off-by: Gerard Kavanagh <gerard161@gmail.com>
….26.10 images.yml run 39399292631 on main (330439e) scanned media-render (amd64 and arm64) with 2 blocking rows each, fixable Criticals in the Go standard library go1.23.12 of esbuild's binary, at /opt/media-render/js/node_modules/esbuild/bin/esbuild and /opt/media-render/js/node_modules/@esbuild/linux-{x64,arm64}/bin/esbuild: - GO-2026-4337 (CVE-2025-68121, crypto/tls session resumption): fixed in Go 1.24.13, 1.25.7 and 1.26.0; - GO-2026-6612 (CVE-2026-78663, net/http HTTP/2 flow control): fixed in Go 1.26.9 (and 1.27.2). esbuild comes from Hyperframes (esbuild ^0.25.12, also in hyperframes 0.8.181, the newest), and npm's 0.25.12 binary is built with Go 1.23.12 (esbuild's go.version at v0.25.12). No esbuild release is built with Go 1.26.9 or later: 0.28.2, the newest, ships Go 1.26.5, and esbuild main is still on 1.26.5. So a new esbuild stage builds the locked 0.25.12 from source on golang:1.26.10-trixie (pinned by digest) with esbuild's release flags (CGO_ENABLED=0, -trimpath, -ldflags '-s -w -buildid=', -buildvcs=false); go install checks the modules against the Go checksum database. The js stage copies it over npm's platform binary, hard-links esbuild/bin/esbuild to it as esbuild's install script does, and fails the build unless esbuild's JavaScript API runs it (it refuses a binary whose version is not the package's). The Go toolchain never reaches the runtime; the node-stripped stage and js/prune.txt are unchanged. Tests: test_prd262_media_render_esbuild.py pins the Go image (>= 1.26.9), the built version against js/package-lock.json, the flags and the swap order; test_prd262_media_render_stages.py lists the new stage; the in-image test_image_esbuild.py reads each esbuild binary's Go build info (>= 1.26.9), checks the two paths are one hard-linked file and runs the JavaScript API. Local amd64 build (Docker Desktop, emulated): both paths are one inode, go1.26.10, 0.25.12; the in-image suite 355 passed; the module-traced render and snapshot pass the prune check; Grype 0.118.0 (DB 2026-10-20) plus scripts/ci/image_scan_policy.py in fail mode: 0 blocking. On disk 1,296,962,463 bytes against the 1,300 MB bar (main's media-render.yml run 39356406759: 1,295,709,649); the Go 1.26 binary is 11,382,910 bytes, npm's 10,358,936. Signed-off-by: Gerard Kavanagh <gerard161@gmail.com>
There was a problem hiding this comment.
If your organization's extra usage balance is empty, an organization admin can add extra usage credits at claude.ai/admin-settings/usage. If its monthly spend limit was reached, an admin can raise it on the same page. If neither applies, contact Anthropic support.
Once extra usage is available, someone with write access to this repository can comment @claude review on this pull request to trigger a review.
|
Warning Review limit reachedYou've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Next included review available in 53 minutes. View limit details
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
CI evidence for this PR's head:
|
…) into the nights 16–17 + socials fix wave — no conflicts; no new undefined names Signed-off-by: Gerard Kavanagh <gerard161@gmail.com>
What and why
PRD-262 §8 row 16, "fixable Critical / unallowlisted KEV in images we build: 0 / 0", fails on main. images.yml run 39399292631 shows 2 blocking findings in each of two images. The policy runs in report mode, as Gerard decided on 20 Oct (US-004), so nothing failed a build. This PR clears all four.
1. agent-opt-worker: litellm 1.80.0 → 1.91.5 (485ded7)
openai<2, and every litellm from 1.84 on needsopenai>=2.20.0,<3.overrides.txtnow lifts the cap. The SDK's upstream repo main already declaresopenai>=1.109.1,<3..grype.yaml, since nothing matches them now.LiteLLMGenerator.generate,litellm.completionand all four optimizers passes.pip checkshows the one expected mismatch: ai-evaluation'sopenai<2.2. media-render: esbuild 0.25.12 built from source on Go 1.26.10 (2094326)
esbuild ^0.25.12, including its newest release 0.8.181. The newest esbuild (0.28.2) and esbuild main both build with Go 1.26.5. GO-2026-6612 is fixed in Go 1.26.9 / 1.27.2. esbuild can't be pruned, because the render path callstransformSync.esbuildstage ongolang:1.26.10-trixie@sha256:9ba7dc6d…runsgo install …/cmd/esbuild@v0.25.12with esbuild's release flags. The js stage copies the binary over npm's platform binary and hard-linksesbuild/bin/esbuildto it, and the build fails unlessrequire("esbuild").transformSyncruns. The Go toolchain never reaches the runtime. The node-stripped stage andjs/prune.txtare unchanged.test_prd262_media_render_esbuild.py: Go ≥ 1.26.9, the built version matching package-lock, the flags and the order of the swap.tests/test_image_esbuild.py: every esbuild binary's Go build info is ≥ 1.26.9, the two paths are one inode, and the JS API runs. It fails on main's image.Local scan: Grype v0.118.0 (the 2026-10-20 database) plus
image_scan_policy.py check --mode failgives agent-opt-worker 0 blocking and media-render 0 blocking.Test plan
@esbuild/linux-arm64path and wasn't built locally.