Skip to content

chore(deps): bump cel-go to v0.29.2 for GHSA-gcjh-h69q-9w9g - #756

Merged
lakhansamani merged 1 commit into
mainfrom
chore/bump-cel-go-ghsa-gcjh
Aug 7, 2026
Merged

chore(deps): bump cel-go to v0.29.2 for GHSA-gcjh-h69q-9w9g#756
lakhansamani merged 1 commit into
mainfrom
chore/bump-cel-go-ghsa-gcjh

Conversation

@lakhansamani

@lakhansamani lakhansamani commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Clears GHSA-gcjh-h69q-9w9g (CVSS 6.3), which affects cel-go >=0.22.0,<=0.28.1. We were on 0.28.1, pulled in transitively by openfga v1.18.1. First patched version is 0.29.0; this takes v0.29.2.

The advisory

ext.NativeTypes(ParseStructTag("json")) does not honour JSON's skip directive. A field tagged json:"-" gets registered in CEL's type system under the literal name "-" and becomes readable via dyn(obj)["-"] — so anyone who can submit a CEL expression can read fields the developer deliberately kept out of serialised output.

Assessed as not exploitable here — but bumped anyway

The vulnerable package is linked into the binary: github.com/google/cel-go/ext appears in our build graph, imported by buf.build/go/protovalidate/cel (v1.2.0).

But the vulnerable function is never invoked:

Consumer Calls NativeTypes / ParseStructTag?
buf.build/go/protovalidate no
openfga v1.18.1 no
our own code no

Exploitation also requires attacker-controlled CEL expressions. In this codebase CEL reaches two places — protovalidate evaluating compiled-in buf.validate constraints, and OpenFGA conditions from an authorization model, which only a super-admin can write.

Bumped regardless: the fix is a version change, and leaving a flagged advisory in the tree costs more than it saves.

⚠️ govulncheck does not cover this advisory

Worth recording, because it is the kind of thing that gets misread as an all-clear.

govulncheck reports 0 affected, and its single "modules you require" finding is GO-2026-5932 (x/crypto/openpgp, unrelated, and Fixed in: N/A) — not this cel-go issue. GHSA-gcjh-h69q-9w9g is not in the Go vulnerability database yet, so a clean govulncheck run was never evidence about it either way. The reachability analysis above was done by hand.

Verified

Check Result
go build ./... / go vet ./... 0
make test 42 packages, 0 failures
internal/authorization/... (OpenFGA, the main CEL consumer) pass
make smoke (GraphQL + REST + gRPC + MCP) pass
make lint clean
resolved version cel-go v0.29.2

Smoke was run deliberately rather than skipped: protovalidate evaluates buf.validate constraints through CEL on every gRPC request, so this bump sits on a live request path, not just in the build graph.

cel-go >=0.22.0,<=0.28.1 lets ext.NativeTypes(ParseStructTag("json")) expose
struct fields marked json:"-" via dyn(obj)["-"]. Fixed in 0.29.0.

Not exploitable here — cel-go/ext is linked in (via
buf.build/go/protovalidate/cel) but neither protovalidate nor openfga calls
NativeTypes or ParseStructTag, and neither does our code. Bumped anyway: the
fix is a version change and leaving a flagged advisory in the tree costs more
than it saves.

Note govulncheck does NOT cover this advisory yet — its only finding is the
pre-existing, unfixed GO-2026-5932 (x/crypto/openpgp). Its silence was not
evidence of safety here; reachability was checked by hand.
@lakhansamani
lakhansamani merged commit 935abac into main Aug 7, 2026
4 checks passed
@lakhansamani
lakhansamani deleted the chore/bump-cel-go-ghsa-gcjh branch August 7, 2026 17:09
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