diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml index f144b046..5090856f 100644 --- a/.github/workflows/security.yml +++ b/.github/workflows/security.yml @@ -59,10 +59,10 @@ jobs: # could do two flags' worth of work without anyone noticing: an # alias that stops matching fails silently, and a flag that matches # nothing looks identical to a flag that is still holding something - # back. For chromadb's three 2026-08-24 GHSA advisories (aliased to - # CVE-2026-45830/45831/45833), pip-audit's own canonical ID *is* the - # CVE — the PyPA advisory DB has no PYSEC entry for them yet — so - # these three are pip-audit's real output, not an alias regression. + # back. chromadb's three 2026-08-24 advisories were first emitted as + # CVE-2026-45830/45831/45833, before the PyPA DB had PYSEC entries; + # since then pip-audit emits PYSEC-2026-3813/3815/3814, so the flags + # were matching through aliases. Switched at the 2026-09-30 review. # CVE-2026-49265 (oauthlib, 2026-09-29) arrives only through # chromadb -> kubernetes -> requests-oauthlib, none of which the # backend image installs, and it sits in oauthlib's OAuth *server* @@ -72,9 +72,9 @@ jobs: pip-audit -r requirements.lock --disable-pip --no-deps --ignore-vuln PYSEC-2026-311 --ignore-vuln PYSEC-2026-1325 - --ignore-vuln CVE-2026-45830 - --ignore-vuln CVE-2026-45831 - --ignore-vuln CVE-2026-45833 + --ignore-vuln PYSEC-2026-3813 + --ignore-vuln PYSEC-2026-3814 + --ignore-vuln PYSEC-2026-3815 --ignore-vuln CVE-2026-49265 # ── Frontend dependency audit (blocking; allowlist via wrapper) ───────── diff --git a/docs/operating/SECURITY_GATES.md b/docs/operating/SECURITY_GATES.md index 2efeb075..ab6b9095 100644 --- a/docs/operating/SECURITY_GATES.md +++ b/docs/operating/SECURITY_GATES.md @@ -313,7 +313,8 @@ per-advisory disposition. ### 7e. pip-audit baseline (`--ignore-vuln` flags in `.github/workflows/security.yml`) **6 vulnerability IDs ignored** (down from 33 at gate introduction). Owner: -platform owner. SLA: next dependency-upgrade window (review by 2026-09-30). +platform owner. SLA: reviewed quarterly, or sooner when an entry's review date +comes first (last review 2026-09-30; next by 2026-12-31). The previous baseline deferred most entries to "the upgrade sprint", noting in particular that the starlette CVEs needed a major 0.52 -> 1.x bump. That bump @@ -342,13 +343,38 @@ re-verified by running the tool rather than assumed. | ID | Package (pinned) | Fix version if known | Review date | | --- | --- | --- | --- | -| PYSEC-2026-311 | chromadb==1.5.2 | none published | 2026-09-30 | -| PYSEC-2026-1325 | ecdsa==0.19.2 | none published | 2026-09-30 | -| CVE-2026-45830 | chromadb==1.5.2 | none published | 2026-09-30 | -| CVE-2026-45831 | chromadb==1.5.2 | none published | 2026-09-30 | -| CVE-2026-45833 | chromadb==1.5.2 | none published | 2026-09-30 | +| PYSEC-2026-311 | chromadb==1.5.2 | none published (1.5.9 still affected) | 2026-12-31 | +| PYSEC-2026-1325 | ecdsa==0.19.2 | none, by upstream policy | 2026-12-31 | +| PYSEC-2026-3813 (CVE-2026-45830) | chromadb==1.5.2 | none published (1.5.9 still affected) | 2026-12-31 | +| PYSEC-2026-3815 (CVE-2026-45831) | chromadb==1.5.2 | none published (1.5.9 still affected) | 2026-12-31 | +| PYSEC-2026-3814 (CVE-2026-45833) | chromadb==1.5.2 | none published (1.5.9 still affected) | 2026-12-31 | | CVE-2026-49265 | oauthlib==3.3.1 | 4.0.0 (major) | 2026-10-31 | +**2026-09-30 review (the baseline's due date).** Every entry re-checked with +pip-audit 2.10.1, OSV.dev and PyPI: + +- **Canonical IDs.** pip-audit now emits the three 2026-08-24 chromadb + advisories as `PYSEC-2026-3813` (CVE-2026-45830), `PYSEC-2026-3815` + (CVE-2026-45831) and `PYSEC-2026-3814` (CVE-2026-45833). The CVE flags were + still holding them, but only through aliases, the failure mode this section + warns about; the flags now use the PYSEC IDs. With them, the audit reports + `No known vulnerabilities found, 8 ignored`, the same as before the switch. +- **chromadb.** The latest release, 1.5.9, is still inside all four advisories' + affected range (`last_affected: 1.5.9`), so no upgrade helps. Still lock-only: + a dry-run install of `requirements.txt` with the lock on 2026-09-29 resolved + 97 packages without it. +- **ecdsa: shipped, not reachable.** This entry had a row but no written + disposition. `ecdsa` 0.19.2 *is* in the backend image, pulled in by + `python-jose` 3.5.0. PYSEC-2026-1325 (CVE-2024-23342, GHSA-wj6h-64fc-37mp) is + the Minerva timing attack on ECDSA signing, affecting every version; the + maintainers do not fix side channels in pure-Python code. UKIP never signs or + verifies with an EC key: JWTs are HS256 (`backend/auth.py`, `ALGORITHM`), + `jwt.decode` pins `algorithms=[ALGORITHM]` so an ES* token is refused, and + nothing in `backend/` imports `ecdsa`. Removing it for good means replacing + `python-jose` (for example with PyJWT); that is a dependency change worth its + own issue, not a baseline edit. +- **oauthlib** (below): unchanged, review by 2026-10-31. + **2026-09-29 review: oauthlib, CVE-2026-49265 (GHSA-xpv3-w29h-x7cv).** A timing side channel in `oauthlib`'s PKCE `code_verifier` comparison (`oauth2/rfc6749/grant_types/authorization_code.py`, CWE-208), fixed in 4.0.0.