fix(os): clear the appliance rootfs CVE gate at the source (#1153) - #1154
Merged
Conversation
`OS rootfs scan` has been red on `develop-v2`'s own tip since 2026-08-19. No commit broke it: the branch was untouched between a green run and a red one, and the advisories were published in between. Four red runs, with PRs merged through them. Three findings, and they do not all have the same answer. Raised in the build, the same way the toolchain above them already is — the rootfs compiles both binaries from source, so the module graph is ours: golang.org/x/mod v0.38.0 -> v0.40.0 CVE-2026-56864, CVE-2026-56865 google.golang.org/grpc v1.82.0 -> v1.82.1 GHSA-hrxh-6v49-42gf Neither is reachable by a pin bump. cosign v3.1.3 is the newest release and pins x/mod v0.37.0; compose v5.4.0 and v5.5.0 both pin v0.38.0; cosign's own main is still v0.38.0. Waiting for upstream means the gate stays red, and a gate that stays red is a gate everyone learns to ignore. TWO MUTES DELETED, not added. `.trivyignore` already carried CVE-2026-56852 (x/text) and GHSA-hrxh-6v49-42gf (grpc) on the premise that these modules were vendored inside DOWNLOADED release binaries, so "no pin bump can clear them". That premise died when the rootfs started compiling them. Both are now fixed at the source and their entries are gone — which matters beyond tidiness: while a mute is present the scan cannot tell "fixed" from "hidden", so the first version of this change verified grpc against its own mute and proved nothing. Scanned with NO ignore file after the raises: cosign 0 findings, compose 1. That one remaining finding, github.com/docker/docker CVE-2026-34040, keeps a single accepted entry with corrected reasoning. There is nothing to raise it to: trivy names the fix as 29.3.1, but that is a Moby release, not a version of this module — `go list -m -versions` tops out at v28.5.2+incompatible for both github.com/docker/docker and github.com/moby/moby, and the attempt fails the build with "invalid version: unknown revision v29.3.1". Docker 29 lives at a module path compose does not import, so no compose release can carry it either. Two provenance claims corrected rather than left standing, both found by review: - a raise moves more than it names. `go get X@v Y@v` upgrades the whole closure MVS needs to seat them: compose moves 1 module, cosign moves 9. That is unavoidable, so it is written down instead of implied. - `cosign version` now reports `v3.1.3+dirty`, because raising a module edits go.mod and Go stamps that truthfully — release-utils overwrites the gitVersion ldflag from the build info. The build was still asserting `gitTreeState=clean` about a tree Go itself had recorded as modified; it now says `dirty`, so the two agree and both are true. Verified by building the gobuild stage and scanning the actual binaries with the gate's own settings — not by reading release notes. The first version of this change fixed x/mod and left two other HIGH findings standing, which is exactly why.
Collaborator
Author
|
Merging with Build image (dashboard) red. It is not this change: PR #1155, which does not touch Every other check is green, including Build + scan the appliance rootfs — the gate this PR exists to fix. |
This was referenced Aug 20, 2026
This was referenced Aug 20, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #1153.
OS rootfs scanhas been red ondevelop-v2's own tip since 2026-08-19 — four runs, with PRsmerged through them. No commit broke it: the branch was untouched between a green run and a red one
and the advisories were published in between.
Three findings, three different answers
Raised in the build — the rootfs compiles both binaries from source, so the module graph is
ours, the same reasoning the patched toolchain above them already uses:
golang.org/x/modgoogle.golang.org/grpcNeither is reachable by a pin bump. cosign v3.1.3 is the newest release and pins x/mod v0.37.0;
compose v5.4.0 and v5.5.0 both pin v0.38.0; cosign's own main is still v0.38.0.
Two mutes deleted, not added.
.trivyignorealready carried CVE-2026-56852 (x/text) andGHSA-hrxh-6v49-42gf (grpc), on the premise that these modules were vendored inside downloaded
release binaries so "no pin bump can clear them". That premise died when the rootfs started
compiling them. Both are fixed at the source now and their entries are gone.
That deletion is load-bearing, not tidiness: while a mute is present the scan cannot tell "fixed"
from "hidden". The first version of this branch verified the grpc raise against grpc's own
still-present mute and proved nothing. Caught in review.
One accepted, with corrected reasoning —
github.com/docker/dockerCVE-2026-34040, whichgenuinely cannot be raised (see below). It replaces a duplicate: the change had added a second entry
for an ID already accepted at line 24, with a different rationale and a different clearing
condition, so following either comment would have left the other muting.
Verification — the scan, on the real binaries, twice
Built the gobuild stage on a real machine and scanned the extracted binaries with trivy 0.70.0 and
the gate's own flags.
With no ignore file at all (the probative run — nothing can hide behind a mute):
With the trimmed
.trivyignore, gate settings,--exit-code 1:docker-compose versionandcosign versionboth run in the build's own check (exit 0).Why CVE-2026-34040 cannot be raised
Trivy names the fix as
29.3.1. That is a Moby release, not a version of this module:Tried it rather than assuming — the build fails with
invalid version: unknown revision v29.3.1.Docker 29 lives at a module path compose does not import, so no compose release can carry it
either: v5.4.0, v5.5.0 and main all pin v28.5.2+incompatible. The advisory is also a daemon-side
authz bypass, and compose links the client half.
Two provenance claims corrected, both found by review
go get X@v Y@vupgrades the whole closure MVS needs toseat them — compose moves 1 module, cosign moves 9 (x/mod → x/tools → x/net → x/crypto,
x/term, x/text, x/sync, x/sys). No formulation avoids that; it is what raising a module in a Go
build means, so it is written down instead of implied. The reviewer's security framing was
checked and does not hold: the release-signature verifier is the pinned
ghcr.io/sigstore/cosigncontainer (
pithead:542), not this binary, whose only consumer is an-xcheck intests/os/verify-image.sh.cosign versionnow reportsv3.1.3+dirty.go getedits go.mod, Go stampsvcs.modified,and release-utils overwrites the
gitVersionldflag from the build info — so the ldflag is inertand the suffix is truthful. The build was nevertheless still asserting
gitTreeState=cleanabouta tree Go itself had recorded as modified. It now says
dirty, so the two agree and both aretrue. Confirmed on the rebuild:
GitVersion: v3.1.3+dirty,GitTreeState: dirty.Nothing in the repo or the overlay parses either version string — checked.
Not done
OS rootfs scanscans the full image and is the real gate here; this PR's own run is what confirms it.
source-text assertion that the ARG contains a version string would be exactly the kind of check
this repo keeps finding cannot fail.
compose minor is a behaviour change, and it does not move any of these three findings.