Skip to content

fix: [FL-30998] bump google.golang.org/grpc to 1.83.2 (HIGH, GHSA-vp52-pcj8-j9qc) - #108

Merged
josue merged 2 commits into
chore/FL-30996-go-1.27.1from
patch/FL-30998-grpc-1.83.1
Sep 2, 2026
Merged

fix: [FL-30998] bump google.golang.org/grpc to 1.83.2 (HIGH, GHSA-vp52-pcj8-j9qc)#108
josue merged 2 commits into
chore/FL-30996-go-1.27.1from
patch/FL-30998-grpc-1.83.1

Conversation

@josue

@josue josue commented Sep 2, 2026

Copy link
Copy Markdown
Collaborator

Stacked PR. Base is chore/FL-30996-go-1.27.1 (#107), itself stacked on patch/FL-30994-x-crypto-pin (#106). Merge order: #106#107 → this.

Corrected after review. The first revision was inert — a replace in _examples/go.mod shadowed the bump and the resolved version stayed vulnerable. Details below; the fix is in the second commit.

Problem

Dependabot alert #4 (HIGH): google.golang.org/grpc ≤ 1.83.0 is affected by GHSA-vp52-pcj8-j9qc, fixed in 1.83.1.

The alert was created 2026-09-02 07:50, after this wave's initial Dependabot sweep on 2026-08-31 returned CLEAN for this repo — genuinely new, not missed.

Solution

Bump to 1.83.2 — newest on the line, so a later patch doesn't reopen this.

Two places had to change, and the second is the whole story.

1. The root require (first commit) — insufficient on its own

2. The _examples replace (second commit) — what actually moved the version

_examples/go.mod carried replace google.golang.org/grpc => google.golang.org/grpc v1.82.1. Because go.work makes both modules main modules, replaces from every main module apply workspace-wide, and a replace is an absolute override, not an MVS input. So the root's require v1.83.2 lost to that wildcard replace:

$ go list -m google.golang.org/grpc        # before the fix
google.golang.org/grpc v1.83.2 => google.golang.org/grpc v1.82.1

v1.82.1 is precisely the version the advisory is filed against. The bump was inert for make test, make lint, CI's Testing job and the committed _examples/go.sum.

The pin was deliberate — #104 (FL-30189) added it as this repo's mechanism for controlling grpc — so it is raised to v1.83.2 rather than deleted, keeping the mechanism intact.

Also ran go work sync ./... + go mod tidy in _examples, which the first commit skipped. That is what make upgrade-deps ends with; without it _examples/go.mod kept the pre-bump versions, stale for GOWORK=off, Dependabot's resolver, or anyone lifting an example as a starting point.

Version changes that actually happened

Sourced from git diff, not from go get stdout — see the note below.

Module From To Direct?
google.golang.org/grpc 1.82.1 1.83.2 indirect (root)
x/mod 0.35.0 0.38.0 indirect
x/sync 0.20.0 0.22.0 direct
x/text 0.36.0 0.41.0 indirect
x/tools 0.44.0 0.48.0 direct
genproto/googleapis/rpc …afd174a4e478 …3dc84a4a5aaa indirect

x/net and x/sys did NOT move, despite go get reporting them as upgraded. Both are replace-pinned (go.mod:53 at v0.55.0, go.mod:55 at v0.44.0) and their go.sum entries are untouched. My first description listed them because I transcribed go get's stdout, which reports what MVS selected before replaces override it. go get describes intent; go list -m describes reality — the same error as the inert bump, one layer down.

The genproto ambiguity

Bumping grpc alone fails — the old monolithic genproto and the split-out genproto/googleapis/rpc both provide googleapis/rpc/status. Moving genproto past the split resolves it, and go mod tidy then drops the monolithic module entirely.

Testing strategy

The resolver check first, because a green suite says nothing about which version it compiled:

workspace       -> v1.83.2 => google.golang.org/grpc v1.83.2
GOWORK=off root -> v1.83.2
GOWORK=off _ex  -> v1.83.2 => google.golang.org/grpc v1.83.2

_examples/go.sum carries the v1.83.2 hashes. All three modes, because one mode was exactly what hid the first revision's failure.

Everything below re-run against the real 1.83.2; the first revision's green results were collected on 1.82.1 and are void:

Check root _examples
go build ./... ✅ rc=0 ✅ rc=0
go vet ./... ✅ rc=0
golangci-lint v2.13.2 0 issues
goimports ✅ clean
go test -count=1 ./... ✅ rc=0 ✅ rc=0

Passing: ok github.com/flume/enthistory, ok github.com/flume/enthistory/internal/schemast, ok _examples.

Checked #106 for the same shadowing: there is no websocket replace, and it resolves v1.5.3 under both workspace and GOWORK=off, so that fix was never affected. tidy removed a redundant // indirect line for it — go.sum still pins v1.5.3 and go mod why -m still shows it reachable via entgql → gqlgen/client.

Rollback plan

Revert both commits — go.mod/go.sum in root and _examples. No source change, no API change.

Security review

  • No application code changed.
  • Closes one HIGH advisory — verified by resolver output, not by the presence of a require line.
  • Two direct dependencies (x/sync, x/tools) moved as MVS requires, with the real test suite green.

Dependabot alert 4: google.golang.org/grpc at or below 1.83.0 is affected
by GHSA-vp52-pcj8-j9qc (HIGH), fixed in 1.83.1. Took 1.83.2, the newest
release on that line, so a later patch does not reopen this next wave.

The alert was created 2026-09-02 07:50, after this wave's initial
Dependabot sweep on 2026-08-31 returned CLEAN for enthistory. Genuinely
new, not missed by the sweep.

Bumping grpc alone fails with an ambiguous import: both the old
monolithic google.golang.org/genproto (pinned at a 2022 pseudo-version in
the module graph) and the split-out google.golang.org/genproto/googleapis/rpc
provide googleapis/rpc/status. Moving genproto forward past the split
resolves it, and go mod tidy then drops the monolithic module entirely -
it is no longer required by anything.

That cascade also raises five golang.org/x modules, two of which
(x/sync and x/tools) are direct requires here. Those are not gratuitous:
they are minimum-version-selection results forced by grpc 1.83.2's own
requirements. Verified by trying both a targeted genproto pin and
genproto@latest - the two converge on the same version set, which is what
MVS being the cause looks like.

Verified: build, vet, lint (0 issues) and goimports clean; go test
-count=1 passes enthistory, internal/schemast and _examples; go mod tidy
leaves no drift.

Stacked on chore/FL-30996-go-1.27.1, itself stacked on
patch/FL-30994-x-crypto-pin - all three touch go.mod.
@josue
josue requested a review from caseyh as a code owner September 2, 2026 09:25
@flume-bot

flume-bot commented Sep 2, 2026

Copy link
Copy Markdown

Snyk checks have passed. No issues have been found so far.

Status Scan Engine Critical High Medium Low Total (0)
Open Source Security 0 0 0 0 0 issues
Licenses 0 0 0 0 0 issues

💻 Catch issues earlier using the plugins for VS Code, JetBrains IDEs, Visual Studio, and Eclipse.

@flume-factory flume-factory Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review — 3 comment(s).

Comment thread go.mod
Comment thread go.mod
Comment thread go.mod
Review caught that the previous commit did not change the resolved grpc
version for any build in this repo, and it was right.

_examples/go.mod carried `replace google.golang.org/grpc => v1.82.1`.
go.work makes both modules main modules, replaces from every main module
apply workspace-wide, and a replace is an absolute override rather than
an MVS input - so the root's `require v1.83.2` lost to that wildcard
replace. Proven, not reasoned:

  before: go list -m google.golang.org/grpc
          -> v1.83.2 => google.golang.org/grpc v1.82.1

v1.82.1 is exactly the version GHSA-vp52-pcj8-j9qc is filed against, so
the advisory stayed live for `make test`, `make lint`, CI's Testing job
and the committed _examples/go.sum. My earlier build/test/lint evidence
was collected against the vulnerable version and did not show it.

That pin was deliberate - #104 (FL-30189) added it as this repo's
mechanism for controlling grpc - so it is raised to v1.83.2 rather than
deleted, keeping the mechanism intact.

Also ran `go work sync ./...` plus `go mod tidy` in _examples, which the
previous commit skipped. That is what `make upgrade-deps` ends with, and
without it _examples/go.mod kept the pre-bump x/mod, x/sync, x/text,
x/tools and genproto versions - stale for GOWORK=off, Dependabot's
resolver, or anyone lifting an example as a starting point.

Now verified in all three modes:
  workspace       -> v1.83.2 => v1.83.2
  GOWORK=off root -> v1.83.2
  GOWORK=off _ex  -> v1.83.2 => v1.83.2
and _examples/go.sum carries the v1.83.2 hashes.

Re-ran everything against the real 1.83.2: root build, vet, lint (0
issues) and goimports clean; go test -count=1 passes enthistory,
internal/schemast and _examples.

Checked FL-30994's websocket bump for the same shadowing - there is no
websocket replace, and it resolves v1.5.3 in both workspace and
GOWORK=off modes, so that fix was never affected. tidy dropped a
redundant `// indirect` line for it; go.sum still pins v1.5.3 and
go mod why still shows it in the build graph.
@josue
josue merged commit 05125d3 into chore/FL-30996-go-1.27.1 Sep 2, 2026
5 checks passed
@josue
josue deleted the patch/FL-30998-grpc-1.83.1 branch September 2, 2026 22:29
josue pushed a commit that referenced this pull request Sep 2, 2026
Resolves the four-file conflict created by merging #108 into this branch
while FL-30994's review fixes landed on the base.

Conflicts were go.mod, go.sum, _examples/go.mod and _examples/go.sum -
all four because both sides edited the same dependency declarations. The
resolution takes the newest of each rather than one side wholesale:

  go directive     1.26.7 (base) vs 1.26.8 (ours)     -> 1.26.8
  grpc             1.82.1 (base) vs 1.83.2 (ours)     -> 1.83.2
  websocket        1.5.3 both                          -> 1.5.3
  x/crypto replace 0.56.0 (base) vs 0.55.0 (ours)     -> 0.56.0

The x/crypto line is the one that would have been easy to lose. Taking
"ours" wholesale would have reverted it to v0.55.0, which still carries
GO-2026-6354 and GO-2026-6355 (DoS on deadlocked channels in
x/crypto/ssh), both fixed in v0.56.0. The base's explanatory comment is
carried across with the pin.

go.sum on both modules was regenerated with go mod tidy rather than
hand-merged.

Verified by resolver rather than by reading the manifests - websocket
v1.5.3 and grpc v1.83.2 both resolve correctly in root-standalone and
workspace modes, and grpc resolves v1.83.2 in _examples standalone through
its own replace. Root and _examples build, vet and test clean; lint
reports 0 issues, confirming FL-30996's reflect.Pointer fix survived.
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.

3 participants