highCVSS 8.2Vulnerability

CVE-2026-49998

#### Summary Centrifugo's dynamic JWKS endpoint feature can verify a JWT for one allowed issuer using a public key cached from another allowed issuer. The JWKS cache and `singleflight` lookup are keyed only by the JWT header `kid`, not by the resolved JWKS endpoint, issuer, audience, or other trust-domain namespace. In a documented multi-issuer dynamic JWKS configuration, an attacker who can obtain or mint a valid token for issuer/tenant A can authenticate as issuer/tenant B if both JWKS documents use the same `kid` value and tenant A's key is cached first. This affects connection token verification and subscription token verification because both paths use the same JWKS verification manager. #### Details The vulnerable path is reachable when either of these shipped configuration options is set to a templated JWKS URL using values derived from JWT `iss` or `aud` claims: - `client.token.jwks_public_endpoint` - `client.subscription_token.jwks_public_endpoint` Relevant shipped config fields are defined in `internal/configtypes/types.go:59-65`, mapped into verifier configuration in `internal/confighelpers/jwt.go:36-41`, and exposed in the generated config schema at `internal/cli/configdoc/schema.json:3927`, `3947`, `3967`, `3987`, `4069`, `4089`, `4109`, and `4129`. Dynamic JWKS endpoints based on `iss` and `aud` are documented in the project changelog at `CHANGELOG.md:107`. External clients control JWT connection and subscription tokens: - Connection tokens reach `VerifyConnectToken` from `internal/client/handler.go:350-352`. - Normal subscription tokens reach `VerifySubscribeToken` from `internal/client/handler.go:769-775`. - Subscription refresh tokens reach `VerifySubscribeToken` from `internal/client/handler.go:628-632`. The verifier must parse token claims before signature verification to resolve the dynamic JWKS endpoint: - `VerifyConnectToken` parses without verification at `internal/jwtverify/token_verifier_jwt.go:528-535`, extracts template variables

Properties

summary
Centrifugo's dynamic JWKS key cache keyed only by `kid` allows cross-issuer JWT authentication bypass
severity
high
epss_score
0.00177
cvss_score
8.2
ghsa_published
2026-07-01T20:28:52Z
source_url
https://github.com/advisories/GHSA-g6vg-wj8f-48cj
ghsa_updated
2026-07-01T20:28:55Z
ghsa_id
GHSA-g6vg-wj8f-48cj
cve_id
CVE-2026-49998
cvss_vector
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:C/C:H/I:H/A:N
is_ghsa_only
false
epss_percentile
0.07488

Related Entities (13)

ENRICHED_BY (1)

[Source]FIRST EPSS

HAS_WEAKNESS (1)

[Weakness]Improper Verification of Cryptographic Signature

REPORTED_BY (1)

[Source]GitHub Advisory Database

AFFECTS (5)

[Software]go/github.com/centrifugal/centrifugo
[Software]go/github.com/centrifugal/centrifugo/v5
[Software]go/github.com/centrifugal/centrifugo/v3
[Software]go/github.com/centrifugal/centrifugo/v4
[Software]go/github.com/centrifugal/centrifugo/v6

VULNERABLE_TO (5)

[Software]go/github.com/centrifugal/centrifugo
[Software]go/github.com/centrifugal/centrifugo/v4
[Software]go/github.com/centrifugal/centrifugo/v5
[Software]go/github.com/centrifugal/centrifugo/v6
[Software]go/github.com/centrifugal/centrifugo/v3

Explore deeper with Ninja Signal's threat intelligence graph

CVE-2026-49998 (CVSS 8.2) — Ninja Signal Threat Intelligence | Ninja Signal