Skip to content

security: klauspost/compress v1.20.2 and brotli v1.2.7, both reachable - #27

Merged
tannevaled merged 2 commits into
mainfrom
fix-the-decompressor-advisories
Nov 7, 2026
Merged

tannevaled merged 2 commits into
mainfrom
fix-the-decompressor-advisories

Conversation

@tannevaled

Copy link
Copy Markdown
Contributor

The lane this repository gained in #26 caught them in one night

Both advisories were published 2026-11-05 at 22:54 UTC. The nightly sweep went red on 11-06 and again on 11-07 — the first two scheduled runs after publication — and the report it keeps on failure named both. That is the whole purpose of #26, demonstrated rather than argued.

advisory module reachable through
GO-2026-6888 (CVE-2026-111497) brotli v1.2.6 → v1.2.7 "a small crafted brotli stream … hundreds of megabytes of allocations per kilobyte of input, leading to denial of service" session.go:106 engineRender → engine.Engine.RenderWithLinks → brotli.Reader.Read
server.go:155 dispatch → brotli.decodeError.Error
GO-2026-6865 (CVE-2026-116591) klauspost/compress v1.18.7 → v1.20.2 panic on two-block frames in fse/huff0 server.go:115 Server.HandlerListener → grpc.NewServer → fse.Decompress, huff0.ReadTable

⛔ The first trace is the render path. brotli.Reader.Read is reached from engineRender — this program decoding a page it fetched. The exact symbol the advisory names, on the job the proxy exists to do, against content nobody here controls. The second pair is the gRPC server's compression. Both are denial of service on untrusted input; both have released fixes.

⛔ And both were // indirect. Renovate has no version string to compare or rewrite for a requirement the module does not declare for itself, so nothing was watching either — the third time this mechanism has hidden a reachable advisory in this repository, after x/net in #26.

Measured

Same tree, same govulncheck, GOOS=linux GOARCH=amd64:

before   2 vulnerabilities, the 4 symbol traces above
after    No vulnerabilities found.   Your code is affected by 0 vulnerabilities.

The lane's own gate run by hand: govulncheck wrote 889 KB of JSON and vulngate exited 0, judging the one remaining finding a notice — required, not called, and its upstream fix is a pseudo-version rather than a release.

Second commit: two dashes, before the shim goes away

Running that gate surfaced a deprecation:

⚠ vulngate: -go now takes two dashes; read as --go. The standard flag package
  accepted one dash and pflag does not. Update the call site: this shim will
  not outlive the next major.

vulngate moved to cobra. ⛔ A warning inside a green lane is a warning nobody reads — it would have become a red night on a major bump, for a reason unrelated to anything this lane measures. And the call site installs vulngate@latest on purpose (a pin inside a run: block is read by no dependency manager and rots: gitsafe carried one 36 minor versions behind), so the removal would have arrived here without a commit of ours.

Verified rather than assumed: --go is accepted, silent, same verdict, same exit status.

Checks

actionlint silent · gofmt clean · go build ./... ok · go vet ./... silent · go test ./... 2 packages ok.

Not in this PR

go-webengine/engine reaches GO-2026-6865 too, in its root and its nested bench module. That repository is claimed by another session; the finding has been sent to them.

🤖 Generated with Claude Code

tannevaled and others added 2 commits November 7, 2026 20:25
Found by the nightly lane this repository gained in #26, one night after
the advisories were published. It went red on 2026-11-06 and again on
11-07; the report it keeps on failure named both.

  GO-2026-6888  github.com/andybalholm/brotli v1.2.6 -> v1.2.7
                CVE-2026-111497. "A small crafted brotli stream containing
                many empty meta-blocks with new Huffman trees can trigger
                hundreds of megabytes of allocations per kilobyte of input,
                leading to denial of service."
    session.go:106:29  engineRender -> engine.Engine.RenderWithLinks
                       -> brotli.Reader.Read
    server.go:155:62   dispatch -> brotli.decodeError.Error

  GO-2026-6865  github.com/klauspost/compress v1.18.7 -> v1.20.2
                CVE-2026-116591. Panic on two-block frames in fse/huff0.
    server.go:115:22   Server.HandlerListener -> grpc.NewServer
                       -> fse.Decompress
    server.go:115:22   Server.HandlerListener -> grpc.NewServer
                       -> huff0.ReadTable

⛔ THE FIRST TRACE IS THE RENDER PATH. brotli.Reader.Read is reached from
engineRender, which is this program decoding a page it fetched: the exact
symbol the advisory names, on the job the proxy exists to do, against
content nobody here controls. The second pair is the gRPC server's
compression. Both are denial of service on untrusted input, and both have
released fixes.

⛔ AND BOTH WERE `// indirect`. Renovate has no version string to compare
or rewrite for a requirement the module does not declare for itself, so
nothing was watching either of them -- the third time this mechanism has
hidden a reachable advisory here, after x/net in #26.

Measured, same tree, same govulncheck, GOOS=linux GOARCH=amd64:

  before   2 vulnerabilities, 4 symbol traces (above)
  after    No vulnerabilities found. 0 affected.

The lane's own gate run by hand: govulncheck wrote 889 KB of JSON and
vulngate exited 0, judging the one remaining finding a notice (required,
not called, no RELEASED fix -- the upstream fix is a pseudo-version).

gofmt clean, go build ./... ok, go vet ./... silent, go test ./... 2
packages ok.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Running the gate by hand to check the fix above, vulngate said:

  ⚠ vulngate: -go now takes two dashes; read as --go. The standard flag
    package accepted one dash and pflag does not. Update the call site:
    this shim will not outlive the next major.

vulngate moved to cobra. The single dash still works, through a shim that
announces its own removal on every run — and ⛔ a warning inside a GREEN
lane is a warning nobody reads. It would have become a red night on a
major bump, for a reason unrelated to anything this lane measures.

Verified rather than assumed, 2026-11-07 against vulngate@latest: `--go`
is accepted and silent, same verdict, same exit status.

The call site pins nothing: this lane installs vulngate@latest on purpose
(a pin inside a `run:` block is read by no dependency manager and rots —
go-gitsafe/gitsafe carried one 36 minor versions behind), so the shim's
removal would have arrived here without a commit of ours.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@tannevaled
tannevaled merged commit 5cb5c3a into main Nov 7, 2026
9 checks passed
@tannevaled
tannevaled deleted the fix-the-decompressor-advisories branch November 7, 2026 19:28
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