Skip to content

fix(ci): waive three tarfile interpreter CVEs as Group A-2 and label the waiver blocks - #117

Merged
tyler-rich merged 1 commit into
devfrom
fix/tarfile-cve-waivers-group-a2
Jul 30, 2026
Merged

fix(ci): waive three tarfile interpreter CVEs as Group A-2 and label the waiver blocks#117
tyler-rich merged 1 commit into
devfrom
fix/tarfile-cve-waivers-group-a2

Conversation

@tyler-rich

@tyler-rich tyler-rich commented Jul 30, 2026

Copy link
Copy Markdown
Owner

Summary

Two newly-disclosed HIGH CPython CVEs in tarfile began tripping the dogfood gate on 2026-07-30 when they reached Grype's DB, turning CI red on any open PR. This waives them as Group A-2, tracked in #116, with source-verification evidence.

These are new advisories, not a regression. They first appeared on a docs-only commit in #115: no dependency, base-image digest, or lockfile moved, the only docker/Dockerfile change was a comment, and the same job passed on the prior commit a day earlier.

The three CVEs

CVE Sev Gates? Defect
CVE-2026-11940 HIGH Hardlink referencing a symlink stored deeper than itself makes the extraction fallback recreate the symlink at the shallower path, escaping the destination directory. Incomplete fix of CVE-2025-4330.
CVE-2026-11972 HIGH Streaming mode (mode="r|") mishandles EOF — _Stream.seek() discarded read()'s result, so a truncated archive parses in an infinite loop. CWE-252.
CVE-2026-0864 MED Oversized extended-header size field caused a single huge pre-allocating read. Waived alongside for a clean report.

Verification

Confirmed at the source per CLAUDE.md § Dependency hygiene — not from Grype's FIXED IN column. Method: shallow blobless clone of python/cpython, git log -- Lib/tarfile.py for the commits, git merge-base --is-ancestor COMMIT v3.14.6 for release membership, plus a direct 3.14-vs-v3.14.6 file diff.

v3.14.6 = commit c63aec6, released 2026-06-10.

CVE Upstream 3.14 backport Merged vs. cut Ancestor of v3.14.6?
CVE-2026-11972 gh-151981 / GH-151982 e86666c (#151992) 2026-06-23 +13d no
CVE-2026-11940 gh-151558 79c06bd (GH-151559) 2026-06-23 +13d no
CVE-2026-11940 (companion) gh-151987 / GH-151988 5e0ef3f (#152609) 2026-06-29 +19d no
CVE-2026-0864 gh-151497 / GH-151498 2cf26d0 (GH-151979) 2026-06-24 +14d no

Every backport merged after the 3.14.6 cut, so 3.14.7 is the first release carrying any of them. 3.14 patchlevel reads "3.14.6+"; no v3.14.7 tag exists.

Grype is wrong in the pessimistic direction, again — it reports FIXED IN 3.15.0b4 for all three and does not record the 3.14 backports. Read literally that argues for a runtime bump, which is the exact mistake the source-verification rule exists to prevent. No 3.15 move is warranted here.

Does Scrye use tarfile?

No — the string appears nowhere in the repository; backup bundles are a JSON envelope (app/backup/bundle.py), not tar. The residual risk is unreachable stdlib code present in the image, the same rationale the poplib acceptance (#52) rests on. Recorded per-CVE because the poplib precedent showed module reachability materially changes the acceptance.

Why a new issue instead of extending #98

#98 carries its own source-verification evidence dated 2026-07-26, scoped to its specific trio. Appending CVEs verified on a different date against different files would leave that issue's evidence section not covering half its own contents. Both are Group A, share the 3.14.7 trigger, and now share a 2026-10-25 review date — deliberately aligned so one review covers both — and each issue cross-references the other so the split reads as intentional rather than as duplicate trackers.

The blocks are now labelled A-1 (#98) / A-2 (#116) / B (#52) with a mapping index at the top of the interpreter section, so the block→issue relationship is legible from ci/grype.yaml without opening GitHub. A single shared "tracked in #NN" header is what previously made two unrelated decisions look like one.

Verification of this change

  • ci/grype.yaml parses (yaml.safe_load); 10 ignore entries, 7 waived CVE IDs as intended.
  • No test reads ci/grype.yaml, and this PR changes only YAML and Markdown — no code paths affected.
  • The dogfood gate itself is the real check; CI on this PR is what proves the waiver takes effect.

Merge-order note

Both this PR and #115 add an entry to docs/ARCHIVE.md §14 and bump the index count from 111. Whichever merges second will conflict on the index heading and needs it set to 113, keeping both entries.

See docs/ARCHIVE.md § Deviations for the dated entry. Closes nothing automatically — #116 is closed by hand once 3.14.7 is in the pinned base image.

…the waiver blocks

CVE-2026-11940 and CVE-2026-11972 (both HIGH, both tarfile) began tripping the
dogfood gate on 2026-07-30 when they reached Grype's DB. CVE-2026-0864 is a
non-gating Medium in the same module, waived alongside them for a clean report.

Verified at the source per CLAUDE.md § Dependency hygiene, not from Grype's
FIXED IN column — which reports 3.15.0b4 for all three and does not record the
3.14 backports. All three fixes are merged to the 3.14 maintenance branch and
absent from released v3.14.6 (commit c63aec6, 2026-06-10), so all three close on
3.14.7:

  CVE-2026-11972  e86666c  gh-151981/#151992   2026-06-23  (+13d)
  CVE-2026-11940  79c06bd  gh-151558/GH-151559 2026-06-23  (+13d)
                  5e0ef3f  gh-151987/#152609   2026-06-29  (+19d)
  CVE-2026-0864   2cf26d0  gh-151497/GH-151979 2026-06-24  (+14d)

None is an ancestor of v3.14.6, confirmed with git merge-base --is-ancestor.
No 3.15 move is warranted and none should be scoped off the back of this.

Scrye does not use tarfile — the string appears nowhere in the repo and backup
bundles are a JSON envelope — so the residual risk is unreachable stdlib code
in the image, the same rationale the poplib acceptance rests on.

Tracked in a new issue rather than appended to #98, because #98 carries its own
dated verification scoped to its own trio. The blocks are now labelled A-1
(#98) / A-2 (#116) / B (#52) with an index at the top of the section, so the
block-to-issue mapping is legible from the file — a single shared "tracked in
#NN" header is what previously made two unrelated decisions look like one.

See docs/ARCHIVE.md § Deviations for the dated entry.
@tyler-rich
tyler-rich merged commit 25044f1 into dev Jul 30, 2026
4 checks passed
@tyler-rich
tyler-rich deleted the fix/tarfile-cve-waivers-group-a2 branch July 30, 2026 23:57
tyler-rich added a commit that referenced this pull request Jul 31, 2026
Brings in the Group A-2 tarfile CVE waivers (#117), which is what the image
dogfood gate needs to pass on this branch.

Resolves the docs/ARCHIVE.md §14 conflict by keeping both entries and setting
the index count to 113: the 2026-07-30 tarfile waiver entry sits above the
2026-07-29 version-bump entry, per §14's newest-first ordering for regime 1.

Verified the net effect in both directions: against dev this branch adds only
the version-bump work, and against its own pre-merge tip it adds only
ci/grype.yaml's waiver and the tarfile §14 entry.
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.

1 participant