fix: patch 18 of 24 CVEs in pdp-v2 image (PER-15358) - #318
Conversation
…PER-15358) Docker Scout flagged cryptography 46.0.7 (1 High) in the pdp-v2 image. Bump the pin from >=46.0.5,<47 to >=48.0.1,<49; resolves cleanly against the rest of the tree (fastapi 0.125.0, opal 0.9.6). Also documents that the two starlette High CVEs (CVE-2026-54283, CVE-2026-48818; fixed in starlette 1.1.0/1.3.1) are blocked upstream: opal-common/opal-client 0.9.6 (latest) hard-cap starlette<1. The 18 Go CVEs (all Criticals) are fixed in permit-opa#38. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
CI pytests started failing with: TypeError: ClientResponse.__init__() missing 1 required keyword-only argument: 'stream_writer' aiohttp 3.14 made stream_writer a required kwarg of ClientResponse.__init__, which the latest released aioresponses (0.7.9) does not pass. aiohttp/ aioresponses are unpinned so CI installs the latest, and this surfaced once aiohttp 3.14 shipped -- unrelated to this PR's dependency bumps. We stay on aiohttp 3.14.x on purpose: the June 2026 aiohttp security fixes landed in 3.14 and were not backported to 3.13.x, so pinning aiohttp down to satisfy aioresponses would reintroduce those CVEs into the image. Instead add a test-only conftest shim (mirrors upstream aioresponses PR #288, unreleased) that injects a dummy stream_writer. No-op on aiohttp < 3.14. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
🔍 Vulnerabilities of
|
| digest | sha256:bab83ded2e9540857e25a50ab5ff6b0b64886ea4dabf623fa9f1d765f39df145 |
| vulnerabilities | |
| platform | linux/amd64 |
| size | 218 MB |
| packages | 250 |
📦 Base Image python:3.10-alpine3.22
| also known as |
|
| digest | sha256:c8f94b3bb77e6ea9015ccd091b7f8aec1b1fcbca95159675235d9a93788797cd |
| vulnerabilities |
Description
Description
Description
Description
Description
Description
Description
Description
Description
Description
Description
Description
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
Description
Description
Description
Description
Description
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
Description
Description
Description
Description
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
Description
Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
Description
Description
Description
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
Description
Description
Description
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
|
🔍 Vulnerabilities of
|
| digest | sha256:bab83ded2e9540857e25a50ab5ff6b0b64886ea4dabf623fa9f1d765f39df145 |
| vulnerabilities | |
| platform | linux/amd64 |
| size | 218 MB |
| packages | 250 |
📦 Base Image python:3.10-alpine3.22
| also known as |
|
| digest | sha256:c8f94b3bb77e6ea9015ccd091b7f8aec1b1fcbca95159675235d9a93788797cd |
| vulnerabilities |
Description
Description
Description
Description
Description
Description
Description
Description
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
Description
Description
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
Description
Description | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
Description
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Description
|
There was a problem hiding this comment.
Pull request overview
Updates Python dependencies and test setup to address security findings in the pdp-v2 image while documenting remaining upstream-blocked CVEs.
Changes:
- Bump
cryptographyto>=48.0.1,<49to address the referenced advisory/CVE. - Add inline documentation explaining why
starletteHigh CVEs can’t be resolved yet due to OPAL’s dependency cap. - Add a pytest
conftest.pyshim to keepaioresponsesworking withaiohttpversions whereClientResponserequiresstream_writer.
Reviewed changes
Copilot reviewed 1 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| requirements.txt | Updates cryptography constraint and documents upstream-blocked starlette CVEs. |
| horizon/tests/conftest.py | Adds a test-only compatibility patch for aioresponses with aiohttp 3.14+ API changes. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| We intentionally stay on the aiohttp 3.14.x line: the June 2026 security fixes | ||
| (e.g. GHSA-63hw-fmq6-xxg2 and the other advisories in that batch) landed in | ||
| 3.14 and were not backported to 3.13.x, so pinning aiohttp down just to satisfy | ||
| aioresponses would reintroduce those CVEs into the shipped image. Instead we |
The pdp-tester job failed at the "Start k3d cluster" step: Downloading k3d@v5.4.6 ... curl: (22) ... error: 404 Failed to install k3d AbsaOSS/k3d-action@v2.4.0 defaults to k3d v5.4.6, whose GitHub release has no checksums.txt; k3d's install.sh now SHA256-verifies the binary against that file, so the download 404s. This is environmental (passed on main in May) and unrelated to this PR. Per the pdp-tester maintainers, switch the job to the tester's new Docker runtime backend (aiodocker), which launches the PDP as a local container with no k3d/Helm/kubectl -- mirroring pdp-tester's own `pdp-tester-docker` CI job. LOCAL_IMAGE pins it to the locally built permitio/pdp-v2:next image (loaded from the build artifact) so nothing is pulled from Docker Hub. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
zeevmoney
left a comment
There was a problem hiding this comment.
Automated review — PER-15358 (pdp-v2 CVE patch)
What this PR does: Reduces Docker Scout-flagged CVEs on permitio/pdp-v2:next from the PDP (Python) side. It bumps cryptography >=46.0.5,<47 -> >=48.0.1,<49 (patches GHSA-537c-gmf6-5ccf, a statically-linked-OpenSSL issue in the wheels), documents inline that the two starlette High CVEs are upstream-blocked by opal's starlette<1 cap, and adds horizon/tests/conftest.py — an aioresponses / aiohttp-3.14 compatibility shim so the test suite stays green without downgrading aiohttp. It also carries an unrelated migration of the pdp-tester CI job from k3d to the aiodocker Docker runtime (see finding 1).
Verdict: APPROVE. No Postable finding is HIGH or CRITICAL (severity rule: only MEDIUM/LOW postable -> approve). The security claims verify out: cryptography 48.0.1 is the fixed version for GHSA-537c-gmf6-5ccf (advisory published 2026-06-09); opal-common / opal-client 0.9.6 (latest) do cap starlette<1,>=0.40.0 and leave cryptography unconstrained, so the bump resolves cleanly; and the bump reaches the shipped image via pip install -r requirements.txt in the Dockerfile. CI on the head shows pytests and pdp-tester green (the shim works, and the Docker-runtime path is actually exercised against the locally-built permitio/pdp-v2:next), docker-scout red (expected — 6 residual upstream-blocked Highs), and security/snyk failed on a quota limit ("used your limit of private tests"), not a finding.
Findings
Postable
| # | Sev | File:Line | Category | Description |
|---|---|---|---|---|
| 1 | MEDIUM | .github/workflows/tests.yml:112 | Isolation / scope | Unrelated pdp-tester k3d->Docker migration bundled into a CVE PR; duplicates and diverges from open PR #319 (PER-15361). Guaranteed merge conflict, and #319's timeout-minutes / pip-cache / non-zero-exit hardening is absent in this copy. |
Informational (not on a postable line, out-of-scope, or already-raised dupe)
| # | Sev | Ref | Category | Description |
|---|---|---|---|---|
| I1 | LOW | horizon/tests/conftest.py:15 | Doc / dep accuracy | Docstring says they "intentionally stay on the aiohttp 3.14.x line" for the June-2026 security fixes, but requirements.txt floors aiohttp>=3.13.3,<4 (opal only needs >=3.9.2), so nothing enforces the 3.14 floor the security reasoning depends on — a clean resolve is only guaranteed >=3.13.3 (Docker Scout is the only current safety net). Already raised by copilot on conftest.py:15 (unresolved); skipped inline as a dupe. Stronger fix than rewording: floor aiohttp>=3.14.x,<4 in requirements.txt. |
| I2 | MEDIUM | PR description | Doc accuracy | The "Note (unrelated, pre-existing): pytest shows 34 failures on both this branch and clean main" paragraph is stale — this PR's own conftest.py fixes exactly that failure, and pytests is green on the head. The note contradicts the change; remove or update it. |
| I3 | INFO | docker-scout (CI) | Mergeability | The Docker Scout high/critical gate stays red (6 upstream-blocked Highs: sqlite-libs x3, oras-go/v2 CVE-2026-50163 x1, starlette x2). If it is a required check, the PR cannot merge until VEX / scout exceptions are added for the accepted-risk CVEs, or upstream patches land. Residual risk is documented in the PR body. |
| I4 | INFO | starlette CVE-2026-48818 | Residual-risk nuance | One of the two "residual" starlette Highs (CVE-2026-48818, StaticFiles UNC/SMB SSRF) is Windows-only per the advisory; the pdp-v2 image is Linux (Alpine), so it is not exploitable there (Scout still flags it by version). The genuinely applicable starlette residual is CVE-2026-54283 (urlencoded-form DoS). |
| I5 | INFO | cross-repo (permit-opa#38) | Consistency | The Go CVE fixes (x/crypto, x/net, containerd/v2, oras-go/v2, otel) live in permit-opa#38, not this PR — the image compiles OPA from permitio/permit-opa@main at build time (tests.yml build-pdp-image), so those fixes only land once #38 merges to permit-opa main. This PR touches no go.mod/go.sum; Go-version consistency must be validated in #38. |
Blast radius: The requirements.txt bump flows into the shipped image (Dockerfile pip install -r requirements.txt) and is gated by Docker Scout; opal caps were confirmed so there is no resolver conflict; conftest.py is test-only. The bundled tests.yml change collides with open PR #319 on the same file.
Isolation / scope: Out-of-scope but the out-of-scope work (the CI migration) is complete and functional (CI green) — MEDIUM scope creep, compounded by duplication/divergence with #319. The core CVE work (requirements.txt + conftest.py) is well-isolated.
|
|
||
| # Build pdp-tester image and import into k3d | ||
| - name: Build and import pdp-tester image | ||
| # Docker runtime backend: launch the PDP as a local container via aiodocker |
There was a problem hiding this comment.
[MEDIUM] Unrelated pdp-tester CI migration bundled into a CVE-patch PR (duplicates open PR #319)
Problem: This PR's stated purpose is patching CVEs in the pdp-v2 image (the requirements.txt cryptography bump + the aioresponses test shim). The entire k3d -> Docker-runtime migration of the pdp-tester job (commit 75d974b) is unrelated to that goal and is the whole subject of a separate open PR, #319 (PER-15361). Both PRs edit .github/workflows/tests.yml, and the two copies have already diverged: #319 additionally adds timeout-minutes: 15 on the job, cache: "pip" on setup-python, and explicit non-zero-exit handling (... || status=$? then a later exit 1) so a tester crash that does not print test cases failed still fails the step. This copy has none of those. Whichever PR merges first forces a conflict on the other; if this (older) copy lands first, #319's hardening is at risk of being dropped or re-litigated during conflict resolution.
Suggestion: Drop the tests.yml change from this PR and let #319 own the pdp-tester migration, keeping this PR scoped to requirements.txt + horizon/tests/conftest.py. Alternatively, if this PR should carry the migration, close #319 and port its timeout-minutes / pip-cache / exit-status handling here so the better version is the one that lands.
main (#318) independently did the same k3d->docker pdp-tester rework and also fixed the aiohttp 3.14 / aioresponses incompatibility via a conftest.py shim that injects the required stream_writer, keeping aiohttp on 3.14.x for its June 2026 security fixes. Conflict resolution: - .github/workflows/tests.yml: kept our version of the pdp-tester job (superset of main's rework, adding timeout-minutes, pip cache, exit-status capture, and simplified post-mortem). - requirements.txt: dropped our aiohttp<3.14 cap in favor of main's conftest.py shim (main's approach avoids reintroducing the 3.14-only CVEs); kept main's cryptography bump and starlette note. - horizon/tests/conftest.py: took main's stream_writer compat shim. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
PER-15358 (#318, now merged into this branch) fixes the aioresponses/ aiohttp-3.14 incompatibility with a stream_writer compat shim in horizon/tests/conftest.py, deliberately keeping the test env on the CVE-patched 3.14 line. The pin (mirrored from #317 before #318 landed) would force CI back to 3.13.x, bypass the shim, and reintroduce the dev/prod version skew. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ras-go/starlette VEX waivers (PER-15358) (#322) * fix: remove sqlite-libs and waive un-fixable oras-go CVE (PER-15358) Follow-up to #318 addressing the HIGH CVEs docker-scout still gates on, except the two starlette ones (blocked by opal-client's starlette<1 cap). sqlite (CVE-2026-11822, CVE-2026-11824, CVE-2025-70873) — real fix: These are in SQLite's FTS5/zipfile extensions, which the PDP never uses. The residual was sqlite-libs (the prior `apk del sqlite` was a no-op that errored — "No such package: sqlite" — surviving only via layer caching). sqlite-libs is pinned by the official python:alpine `.python-rundeps` virtual, so we re-pin every other python runtime shared object under a fresh virtual (derived dynamically, arch- agnostic) and drop the original pin together with sqlite-libs. Verified on python:3.10-alpine3.22: sqlite-libs gone from the apk DB and filesystem; ssl/ctypes/lzma/bz2/curses/readline/uuid/gdbm all import; pip and the build-deps add/del cycle still work. oras-go (CVE-2026-50163) — waiver, bump later: No fixed release exists (all versions <= 2.6.1 affected; upstream fix expected ~2026-07-15), and it is an indirect dep of the bundled OPA (permit-opa). The PDP runs OPA inline via OPAL and never pulls OCI artifacts, so the vulnerable tar/hardlink extraction path is never executed. Added an OpenVEX not_affected statement (.docker/scout/pdp-v2.vex.json) and wired the scout gate to honor it (vex-location + only-vex-affected). Remove once permit-opa bumps oras-go to the patched release. The 2 starlette HIGHs are intentionally left, so the docker-scout gate stays red until opal-client relaxes its starlette<1 bound. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix: waive un-fixable starlette CVEs via OpenVEX and pin version (PER-15358) The two remaining docker-scout HIGH findings are starlette CVE-2026-48818 and CVE-2026-54283. Both are fixed only in starlette >=1.1.0/1.3.1, but opal-common/opal-client 0.9.6 hard-cap starlette<1 (further narrowed to <0.51.0 via fastapi-utils -> fastapi 0.125.0), so neither can be upgraded away until OPAL relaxes its bound. There is no <1 backport. Neither vulnerable code path is reachable in the PDP: - CVE-2026-48818: Windows-only SSRF/NTLM via UNC paths in StaticFiles; the PDP runs on Linux and mounts no StaticFiles. - CVE-2026-54283: urlencoded request.form() DoS; the PDP is a JSON-only API with no request.form()/python-multipart usage. Waive both as not_affected / vulnerable_code_not_in_execute_path in the existing OpenVEX doc (same mechanism as the oras-go waiver), and pin starlette==0.50.0 so the build (which has no lockfile) can't drift to a new 0.x release and silently break the waiver PURL match. Remove the pin and both waivers once OPAL relaxes starlette<1 and starlette is upgraded >=1.3.1. This clears the docker-scout gate to 0 HIGH. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix: set vex-author so docker scout applies our VEX waivers (PER-15358) The docker-scout gate was still failing on all three waived CVEs even though scout loaded the VEX doc and annotated each finding "VEX: not affected". Root cause: docker scout only *applies* (suppresses on) VEX statements whose author matches its --vex-author accept-list, which defaults to `<.*@docker.com>`. Our statements are authored "Permit.io", so they were matched and displayed but never suppressed, and the gate kept counting them (confirmed against the CI log; corroborated by docker/scout-cli#207 where all reporters likewise used non-docker.com authors without --vex-author). Add vex-author: Permit.io to the gate step so scout accepts and applies our statements. This makes the oras-go + 2x starlette not_affected waivers actually suppress, taking the gate to 0 HIGH. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
main's #318/#322 independently did the same k3d->Docker pdp-tester rewrite this branch had, plus docker-scout VEX waivers and CVE bumps. Resolution: - .github/workflows/tests.yml: take main's version wholesale — it is a refined superset (adds START_TIMEOUT, cleaner --local --tag next flags, and the docker-scout OpenVEX waiver wiring this branch lacked). - requirements-dev.txt: drop the `aiohttp<3.14` pin. main deliberately stays on aiohttp 3.14 (June 2026 security fixes, not backported to 3.13.x) and shims aioresponses via horizon/tests/conftest.py instead; keeping the pin would reintroduce those CVEs into the image. Net effect: the PR now diffs against main as only the PER-15244 auth change (authentication.py, enforcer/api.py, pdp.py, test_enforcer_api.py). Full horizon/tests suite: 72 passed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…calls (PER-15246) (#320) * feat: replace legacy /update_policy* 307 redirects with direct gated calls (PER-15246) The gated aliases /update_policy and /update_policy_data 307-redirected to the canonical OPAL trigger routes. Many HTTP clients (requests, httpx, browsers) strip Authorization on redirect, so once the canonical routes are gated by the upcoming default-deny middleware (PER-15245), a legitimate SDK calling the alias with a token would get 307 -> token dropped -> 401. Call the OPAL updaters directly instead of redirecting, mirroring the canonical handlers (policy_updater.trigger_update_policy / data_updater.get_base_policy_data, 503 when the data updater is disabled). Keep the per-route enforce_pdp_token gate and drop the now-unused RedirectResponse import. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test: address Copilot review on legacy update-route tests - Assert the 503 detail string matches the canonical data route exactly. - Use httpx `is_redirect` instead of `!= 307` so the no-redirect guard covers every redirect code (301/302/303/307/308), since clients drop Authorization on all of them. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: restore canonical trigger log lines on legacy alias routes The canonical OPAL trigger handlers log the API-originated trigger; the direct-call rewrite dropped that, leaving SDK-triggered full re-pulls unattributable in PDP logs during incident debugging. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test: fix CI collection break and #317 status-code collision (review) - Import MockPermitPDP by basename (from test_enforcer_api) instead of horizon.tests.*: CI installs the package non-editably, so the wheel has no tests/ package and the dotted import aborted all pytest collection. Basename matches pytest's prepend import mode and also avoids a duplicate module object (second OpalClient construction) in local full-suite runs. - Accept 401 or 422 for a missing Authorization header: 422 on current main (required-param validation), 401 once PR #317 gives the param a None default. Survives either merge order; still fails on 200/500. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci: pin aiohttp<3.14 in dev requirements (mirrors #317) aioresponses 0.7.x cannot mock aiohttp>=3.14 (ClientResponse gained a required stream_writer argument), which fails 34 enforcer/local-api tests in CI. Identical to the pin in #317 so either merge order resolves cleanly. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * test: correct two comment inaccuracies flagged in review - The fixture comment claimed monkeypatch mutations could leak across modules; monkeypatch reverts at teardown, so state the real rationale (defensive isolation from the shared singleton). - httpx's is_redirect covers any 3xx, not just the five common codes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * ci: drop aiohttp<3.14 dev pin, superseded by conftest shim from main PER-15358 (#318, now merged into this branch) fixes the aioresponses/ aiohttp-3.14 incompatibility with a stream_writer compat shim in horizon/tests/conftest.py, deliberately keeping the test env on the CVE-patched 3.14 line. The pin (mirrored from #317 before #318 landed) would force CI back to 3.13.x, bypass the shim, and reintroduce the dev/prod version skew. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * docs: note deliberate canonical parity on unguarded policy_updater (review) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
) Docker Scout began flagging two HIGH CVEs in cryptography 48.0.1 on 2026-08-04, turning docker-scout red on every open PR (#326, #327) and on main. Neither is caused by any code change - the pin has been cryptography>=48.0.1,<49 since #318. CVE-2026-69249 CVSS 8.7 fixed in 49.0.0 CVE-2026-69247 CVSS 8.2 affects >=44.0.0, fixed only in 50.0.0 (Observable Timing Discrepancy) Clearing both requires 50.0.0, so the floor moves past our own <49 major cap. Nothing external bounds cryptography: opal-common 0.9.6 requires it unpinned and its pyjwt[crypto]<3,>=2.4.0 carries no upper bound, so the new <51 cap is ours - it keeps a major out of an image build that has no lockfile, same reasoning as the websockets pin. musllinux_1_2 cp311-abi3 wheels are published for x86_64 and aarch64, so the alpine image keeps installing a prebuilt wheel and still needs no Rust toolchain. No VEX changes: both CVEs are fixable by upgrade, so neither needs a waiver in .docker/scout/pdp-v2.vex.json. Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Closes PER-15358.
Docker Scout flagged 24 CVEs (8 Critical, 16 High) on
permitio/pdp-v2:next, across two repos. This PR is the PDP half; the Go half is permitio/permit-opa#38 (the OPA binary is compiled frompermit-opa@main, so that PR must merge for the image to pick up the Go fixes).This PR (PDP)
cryptography>=46.0.5,<47→>=48.0.1,<49— patches GHSA-537c-gmf6-5ccf (1 High). Resolves cleanly (fastapi 0.125.0, opal 0.9.6).starletteHigh CVEs are upstream-blocked:opal-common/opal-client0.9.6 (latest) hard-capstarlette<1, while the fixes are only in starlette 1.1.0/1.3.1.Companion PR (permit-opa#38) — 16 High/Critical
x/crypto0.49→0.53,x/net0.52→0.55,containerd/v22.2.2→2.2.5,oras-go/v22.6.0→2.6.1,otel1.42→1.43.Verification
Built the image locally (
linux/arm64) with the updated OPA tarball and confirmed the patched versions are baked into the shipped artifact:x/cryptox/netcontainerd/v2oras-go/v2otel/sdkcryptographyOutcome: 18 of 24 fixed (8 Critical + 10 High)
Remaining 6 High are all upstream-blocked — no fix available:
sqlite-libs3.49.2-r1 (3 High) — no upstream patch;apk del sqlitecan't remove it (pulled in by Python's_sqlite3). Needs a base-image bump when Alpine patches.oras-go/v2path-traversal CVE-2026-50163 (1 High) — no fix yet.starletteCVE-2026-54283 / CVE-2026-48818 (2 High) — blocked by OPAL'sstarlette<1cap.Note (unrelated, pre-existing)
pytestcurrently shows 34 failures on both this branch and cleanmain(identical), caused byaioresponses 0.7.9being incompatible withaiohttp 3.14.1(ClientResponse ... missing 'stream_writer'). Not caused by this change; worth a separate fix (pinaiohttp<3.14or updateaioresponses).🤖 Generated with Claude Code