MOB-53673: CVE fixes - 2026-09-03 - #2023
Conversation
Auto-fixed by prisma-taurus skill. CVEs fixed: CVE-2026-18938, CVE-2026-13757, CVE-2026-54371, CVE-2025-5278 These three packages ship in the ubuntu:24.04 base image at exactly the flagged versions and are not reinstalled by any earlier apt-get install, so no rebuild picks up their fixes -- an explicit --only-upgrade entry is the only mechanism. Fixes were published in noble-updates before the scanned image's build start, confirming they were available but not landing. Also repairs two long-dead entries in the same block that apt was skipping silently after Ubuntu's 64-bit-time_t renames, so the gnutls and pipewire CVE lists those comments claim to enforce are now actually enforced: libgnutls30 -> libgnutls30t64 libpipewire-0.3-0 -> libpipewire-0.3-0t64 Marks the erb/json gem entries as appeasement rather than fixes: both are pure default gems, so the gemspec purge de-registers the gem and the vulnerable stdlib copy still loads (ERB.version 4.0.4, JSON::VERSION 2.9.1 in the published image). Comment-only here; the revert needs its own PR. Records in vulnerability_history.md: the pure-default-gem appeasement trap, the base-image-vs-unpinned OS provenance rule, the silent-skip/t64 dead-entry trap, why unpinned entries must not be pruned, and the stale-image caveat for tag-based Prisma scans. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
🟡 Changes recommended
A couple of newly added/edited Dockerfile comments are internally inconsistent/ambiguous and should be clarified to avoid misleading future maintenance of the CVE upgrade block.
Once you've addressed the issues Copilot identified, you can request another Copilot review.
Pull request overview
Updates the Taurus Docker image build to explicitly --only-upgrade a few Ubuntu 24.04 base-image–shipped packages so patched versions land during image build (and fixes two silently-skipped package names due to t64 renames), alongside documenting the rationale/decision traps in the Prisma skill history.
Changes:
- Fix two dead
apt-get install --only-upgradeentries by switching tolibgnutls30t64andlibpipewire-0.3-0t64. - Add explicit
--only-upgradeentries forlibp11-kit0,libattr1, andcoreutilsto pick up patched pocket versions even when they are already present in the base image. - Expand documentation in both the Dockerfile and
vulnerability_history.mdaround provenance, silent skips, and “appeasement vs real fix” pitfalls.
File summaries
| File | Description |
|---|---|
| Dockerfile | Adjusts OS --only-upgrade package list (incl. t64 renames) and adds base-shipped package upgrades; updates inline CVE/provenance commentary. |
| .claude/skills/prisma-taurus/vulnerability_history.md | Adds/refreshes operational guidance on default-gem appeasement traps, OS provenance rules, dead --only-upgrade entries, and stale-scan pitfalls. |
Review details
Suppressed comments (1)
Dockerfile:248
- Same as above: this reference to
vulnerability_history.mdis ambiguous without the repo path; use the full path so readers can jump to the right document quickly.
# Revert in a DEDICATED PR (reverting alone re-adds scan findings, so it cannot ride inside a CVE
# run whose gate requires the total to drop). See vulnerability_history.md, "When a Ruby gem has a
# CVE" step 3 (pure-default-gem trap) for the decision test and options.
- Files reviewed: 2/2 changed files
- Comments generated: 2
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Comment-only; the package list and build behaviour are unchanged, so the image verified by taurus-branch-builder #590 still applies. - The "unpinned installs don't need an entry" note contradicted the block itself, which does list such packages (wget, python3.12, libnss3). Explain the real distinction: those entries are no-ops in the --no-cache master build but load-bearing in a layer-cached branch build, so they stay. - Reference vulnerability_history.md by its full repo path. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## master #2023 +/- ##
=======================================
Coverage 88.19% 88.19%
=======================================
Files 75 75
Lines 21164 21164
=======================================
Hits 18663 18663
Misses 2501 2501 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
Superseded by #2024, which is merged. #2024 contains both commits from this PR unchanged (
#2024 additionally replaces the erb/json gem appeasement with real fixes, so closing this one in favour of a single merge to master. |
Jira: MOB-53673
Fixable in taurus, this run: 10 detected → 4 fixed.
Distinct CVEs. Counts only this repo's own
Dockerfilechanges, each confirmed gone in the branch image scan.Fixed
libattr1(attr)1:2.5.2-1build1.1→1:2.5.2-1ubuntu0.1libp11-kit0(p11-kit)0.25.3-4ubuntu2.1→0.25.3-4ubuntu2.2libp11-kit0(p11-kit)0.25.3-4ubuntu2.1→0.25.3-4ubuntu2.2coreutils9.4-3ubuntu6.2→9.4-3ubuntu6.3Why these needed a code change (they are not rebuild-clearable)
All three ship in the
ubuntu:24.04base image at exactly the flagged versions, and the image's own/var/log/apt/history.logshows no taurusapt-get installtouching them — the only hits are dated2026-08-10, which is Canonical's rootfs build baked into the base image. An unpinnedapt-get installdoes not upgrade an already-installed base package, so no rebuild would ever have picked these up; an explicit--only-upgradeentry is the only mechanism.Their fixes were published in noble-updates on 2026-08-27 / 08-31, i.e. before the scanned image's build start (2026-09-03 06:22:52Z) — so the fix existed and simply was not landing. Verified reachable inside the scanned image before building:
apt-get install --only-upgrade --dry-runreported3 upgraded, 0 newly installed, 0 to remove.Also fixed: two silently dead entries in the same block
Ubuntu's 64-bit-
time_ttransition renamed these binaries, and--only-upgradeskips names it cannot resolve without erroring, so both entries had been no-ops and the CVE lists their comments claim to enforce were not actually enforced:apt-cache policyfor the old namelibgnutls30libgnutls30t64Installed: (none) / Candidate: (none)libpipewire-0.3-0libpipewire-0.3-0t64Installed: (none) / Candidate: (none)Both are no-ops today (the packages are already pocket-current), so this changes no CVE count now — it restores forward protection for the next gnutls/pipewire security update. All 33 entries in the block now resolve; swept the full list to confirm.
Note this class of bug is invisible to both the build and the scan:
apt-getexits 0 either way, and a dead entry looks identical to a working one whenever the package is already current.Fixable but did NOT land (6, deferred for cause)
@faker-js/faker5.5.3postman-collectionpins faker at an exact5.5.3(its latest, 5.3.1, still does); faker 10.5.0 is ESM-only while postman-collection is CommonJS, sorequire()would fail; and it calls APIs deleted in v8–v10 (address.*,company.bs*,datatype.number/uuid) that drive Postman dynamic variables. An override breaks Newman at runtime, not just at install.file-type3.9.0diff7.0.0diff: ^9). That changes the runner customers' Mocha/Selenium scenarios execute and touchesbzt/modules/javascript.py(codecov exposure) for one CVSS-2.7 low.resolv0.6.2resolv0.7.1, short of the 0.7.2 fix.setuptools80.10.2pkg_resources, whichsetup.pyimports in a no-isolation build. Standing deferral.Not actionable in this repo
301 findings — monitor-only JMeter/Gatling bundled jars, k6 binary internals, Ubuntu Pro ESM, distro pip, and no-released-patch (open/needed/deferred). All 4 criticals are monitor-only JMeter-bundled Apache Tika 1.28.3 (
CVE-2025-66516,CVE-2025-54988injmeter-taurus/5.5/lib) — verified, not assumed. No scanner-appeasement/.deps.jsonfindings appeared in this scan, so there are no manual-intervention items this run.Verification
Verified against the
taurus-branch-builderimage scan (build #590) before opening — integration passed. Diffing the branch scan against the baseline keyed on(CVE, package, version):Unit tests: 1320 passed, 0 errors (3 skipped). Five pre-existing environmental errors were confirmed identical on clean
masterand then cleared entirely by running the suite'stests/resources/httpserver/start.pyhelper andxvfb-run.Raw totals are for reconciliation only — X/Y count distinct CVEs while the raw total counts per-occurrence, so they do not sum arithmetically.
Local code review
An independent reviewer ran on the diff pre-push and verified it empirically in the real image (applied the exact apt line,
dpkg --auditclean, HTTPS/bzt --helpsmoke tests passed). Verdict: ready to merge. Outcome of its findings:Applied (4):
erb/jsongem entries as appeasement rather than fixes (see below)libgnutls30name (which then led me to sweep all 33 entries and findlibpipewire-0.3-0too)Declined (1): adding the other 7 base-shipped upgradable packages (
diffutils,libpam*,libproc2-0,procps). Checked the baseline CSV: none of them are flagged, so no fix was missed by the criterion above. Adding unflagged packages would be speculative churn, and every entry is a maintenance liability — as the two dead entries just demonstrated.Two findings that need separate follow-up
1. The existing
erbandjsongem "fixes" are scanner appeasement. In the currently published image:For a pure default gem the code lives in Ruby's stdlib dir, not the gem dir. Deleting
specifications/default/<gem>-<old>.gemspecde-registers the feature as gem-upgradable, sorequirestops consulting RubyGems and loads the old stdlib copy — Prisma goes quiet while the vulnerable code still executes.net-imapis unaffected because its code really does live in the gem dir.Only the comments are corrected here. Reverting the mechanism re-adds 2+ findings to the scan, which would fail this run's decision gate, so it needs its own PR. Ruby 3.4.10 bundles
erb 4.0.4.1(would make erb genuinely fixed) but stilljson 2.9.1, so aARG RUBY_VERSIONbump solves only half.2. The baseline scan can silently scan a stale image.
prisma-cloud-ondemand-scanon the mutableunstabletag reused a previously-pulled copy: scans #220 and #221 both reportedImage ID 9a200d22…(the 09-01 image) even after master #14904 republished the tag mid-run. The tell was that several flagged packages were already at their fixed versions on disk. Re-baselined by digest (IMAGE_URL=blazemeter/taurus@sha256:…; note the artifact is then namedtaurus@sha256.csv). Without this, 7 findings would have been misclassified as needing fixes.Also in this PR
vulnerability_history.mdupdates so future runs don't re-derive any of the above: the pure-default-gem appeasement trap and its decision test, the base-image-vs-unpinned OS provenance rule (the mirror of the earlier openssl case), the silent-skip/t64dead-entry trap with a sweep command, why unpinned--only-upgradeentries must not be pruned when the base catches up, the stale-image scan caveat, and refreshed re-check conditions for the faker / file-type / diff / resolv deferrals.🤖 Generated with Claude Code