Repository navigation
Require Go 1.26.10 for the crypto/x509 fix - #32
Conversation
GO-2026-6809: compromised intermediate certificates were not distrusted by crypto/x509. Fixed in go1.26.10; we required 1.26.9. flowctl reaches it through TLS and mTLS to the control plane — govulncheck traces it via x509.Certificate.Verify — so this is reachable rather than merely linked. Nothing in this repo changed to cause it. The advisory was published after #31 ran, and the vulncheck gate added in that PR caught it on the first run against main. That is the gate working as intended: it pulls a live vulnerability database, so it can go red without a code change. Raises the go directive rather than only the toolchain line, so an older toolchain refuses to build: go: go.mod requires go >= 1.26.10 (running go 1.26.9; GOTOOLCHAIN=local) With only a toolchain line and a lower go directive, GOTOOLCHAIN=local silently builds against the affected standard library, which is the outcome worth preventing for a security fix. No separate toolchain line is kept: it is redundant once the two match and 'go mod tidy' — which CI enforces — removes it. Note for Nix users: nixpkgs ships Go 1.26.6-1.26.9, so the dev shell's Go is older than the minimum and Go downloads 1.26.10 itself. Recorded against GAP-21 in the engineering profile, which already tracks CI and the flake disagreeing about the toolchain. Verified: govulncheck clean, lint clean, full suite and -race green across all 19 packages, and the build still reproduces byte-for-byte. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 4e70d0bd83
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| go 1.26.1 | ||
|
|
||
| toolchain go1.26.9 | ||
| go 1.26.10 |
There was a problem hiding this comment.
Reject the affected Go 1.27 toolchains
When a developer builds with Go 1.27.0, 1.27.1, or 1.27.2, go 1.26.10 is already satisfied, so the Go command keeps that bundled toolchain rather than switching to 1.26.10; the toolchain documentation defines this directive as only a minimum. Those Go 1.27 versions are also explicitly affected by GO-2026-6809, so such source builds still link the vulnerable standard library. Add enforcement that rejects the affected 1.27 patch range, or require a version such as 1.27.3 that is fixed across the newer release line.
Useful? React with 👍 / 👎.
Correction: my note about
|
The dev shell was on go_1_26, which nixpkgs ships as 1.26.9 — older than the 1.26.10 this branch now requires. Every Nix developer would have relied on Go downloading a toolchain itself. No flake.lock change: the pinned nixpkgs already carries go_1_27 as 1.27.3, a stable patch release. An earlier note on this PR claimed it was 1.27rc3; that came from the local flake registry, which is stale, not from the lock. staticcheck had to be rebuilt with the same Go. It links go/types, so a binary built with 1.26 cannot parse the 1.27 standard library, and make lint failed in the shell with 'method must have no type parameters' from math/rand/v2. Not a version problem — nixpkgs has the current 2026.2.2 — so the fix is the override rather than a bump. CI was never affected; it uses dominikh/staticcheck-action independently of Nix. Verified inside nix develop: Go 1.27.3, lint clean, 19 packages green, govulncheck clean, build still reproduces byte-for-byte. Records GAP-26 for a pre-existing failure found on the way: nix build .#default runs protobuf generation without the protoc plugins in nativeBuildInputs and fails identically on main. nix develop, the path BUILD-1 documents, is unaffected. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
What and why
GO-2026-6809: compromised intermediate certificates were not distrusted bycrypto/x509. Fixed in go1.26.10;go.modrequired 1.26.9.Reachable, not merely linked — govulncheck traces it through
x509.Certificate.Verify, and flowctl does TLS and mTLS to the control plane:Nothing in this repo changed to cause it. The advisory was published after #31 last ran, and the vulncheck gate that #31 added caught it on its first run against
main. That is the gate working as designed: it pulls a live vulnerability database, so it can go red with no code change.Why the
godirective and not justtoolchainThe one-line change raises the
godirective to1.26.10. With only atoolchainline and a lower directive,GOTOOLCHAIN=localsilently builds against the affected standard library — I verified it did. With the directive raised it refuses:Failing loudly is the point of a security minimum.
No separate
toolchainline is kept: it is redundant once the two match, andgo mod tidyremoves it — which this repo's own CI tidy check would then fail on.Contract classification (VER-3)
Testing
make lint— cleanmake test— greenmake test-race— green across all 19 packagesmake verify-repro— builds still reproduce byte-for-byte./scripts/govulncheck.sh— clean; the only remaining findings are the two Moby daemon CVEs already covered by.vex/flowctl.openvex.jsonThe Nix dev shell moves to Go 1.27.3 too
nixpkgs ships
go_1_26as 1.26.9, older than the minimum above, so the dev shell would have left every developer relying on Go downloading a toolchain itself. It now usesgo_1_27— 1.27.3, a stable patch release — which satisfies the minimum directly.No
flake.lockchange: the pinned nixpkgs already carries 1.27.3.One thing this needed that I did not expect.
make lintbroke in the shell:Not a staticcheck version problem — nixpkgs has the current 2026.2.2. staticcheck links
go/types, so a binary built with Go 1.26 cannot parse a 1.27 standard library. The flake rebuilds it with the matching Go:CI was never affected — it uses
dominikh/staticcheck-actionindependently of Nix — so this would only have bitten developers running the gate locally.Verified inside
nix develop: Go 1.27.3,make lintclean, 19 packages green,govulncheckclean, reproducible build unchanged.This closes the flake half of GAP-21; CI still resolves its own Go from
go-version-filerather than entering the flake, which is the remaining half.Pre-existing breakage found on the way (not fixed here)
nix build .#defaultfails, identically onmain:The derivation runs protobuf generation without the protoc plugins in its
nativeBuildInputs.nix develop— the path BUILD-1 documents and CONTRIBUTING describes — is unaffected. Recorded as GAP-26. It wants its own change, and the generation step can probably be dropped from the derivation entirely: the generated code is committed and CI already checks it is current.🤖 Generated with Claude Code
https://claude.ai/code/session_01H3BjiVyh7ifuS7xSrRUe2m