Skip to content

CVE regression matrix

When a CVE is published against another OIDC / OAuth / JOSE implementation, the question for this library is "could the same defect reach us, and if not, why not?". The honest answer needs more than a code review — it needs a test that fails the build if a future refactor reintroduces the bypass.

This page is the public ledger of those tests. Every CVE listed here has at least one unit / fuzz test that exercises the surface and pins the rejection. The test references are stable — if a row points at a file or test name, it lives in the repository.

Reading the table

  • CVE — the original disclosure, against another implementation. We do not maintain CVE entries against this library; the field tells you what class of defect the test is meant to keep out.
  • Class — the underlying defect (alg confusion, redirect-uri matching, PKCE downgrade, ...).
  • RFC anchor — the spec section the test pins behaviour against.
  • Test — the regression test that fails if the surface regresses.

JOSE / JWT verification

CVEClassRFC anchorTest
CVE-2015-9235 (jsonwebtoken)alg=none acceptedRFC 8725 §3.1internal/jose.FuzzJOSEParse (alg=none seed)
internal/tokens.TestVerify_AlgConfusion_HSUsingECPublicKeyBytesAsSecret
CVE-2016-10555 (jwt-simple)alg=HS256 accepted, treats public key as HMAC secretRFC 8725 §2.1internal/tokens.TestVerify_AlgConfusion_HSUsingECPublicKeyBytesAsSecret
CVE-2015-2951 (jose4j)alg=none acceptedRFC 8725 §3.1internal/jose.FuzzJOSEParse
CVE-2024-54150 (cjwt)algorithm confusionRFC 8725 §2.1internal/tokens.TestVerify_AlgConfusion_HSUsingECPublicKeyBytesAsSecret
CVE-2026-22817 / CVE-2026-27804 / CVE-2026-23552 (Hono JWT 2026 cluster)case-variant alg=NONE bypass of deny-listRFC 8725 §3.1internal/jose.TestParseAlgorithm_CaseVariantsRejected
internal/jose.FuzzJOSEParse (case-variant seeds)
CVE-2026-33322 (MinIO OIDC)algorithm confusionRFC 8725 §2.1internal/tokens.TestVerify_AlgConfusion_HSUsingECPublicKeyBytesAsSecret
CVE-2018-0114 (Cisco / node-jose)trusted jwk header — verifier used key from JWS itselfRFC 8725 §3.1–3.5internal/jose.TestParseSigned_HeaderInjection_NeverFetches
internal/jose.FuzzJOSEParse (jku seed)
CVE-2018-1000531 (inversoft prime-jwt)alg header downgrade + trusted jwkRFC 8725 §3.1internal/jose.TestParseSigned_HeaderInjection_NeverFetches
CVE-2017-11424 (python-jose-style)jku resolved from headerRFC 8725 §3.1internal/jose.TestParseSigned_HeaderInjection_NeverFetches
CVE-2019-7644 (Auth0 jsonwebtoken-koa)trusted jwk headerRFC 8725 §3.1internal/jose.TestParseSigned_HeaderInjection_NeverFetches
CVE-2026-34240 / GHSA-vm9r-h74p-hg97 (Dart jose)trusted jwk header — verifier treated attacker-supplied key material as a candidate verification keyRFC 8725 §3.1–3.5internal/jose.TestParseSigned_HeaderInjection_NeverFetches
CVE-2025-59420 (Authlib)crit extension list ignoredRFC 7515 §4.1.11 / RFC 8725 §3.5internal/jose.TestParseSigned_CritHeaderRejectedAtVerify
CVE-2026-32597 (PyJWT)same crit-ignored defectRFC 8725 §3.5internal/jose.TestParseSigned_CritHeaderRejectedAtVerify
CVE-2026-28498 (Authlib)hash-binding verifier fail-opened when handed an unknown / unsupported algRFC 8725 §3.1internal/jose.TestParseSigned_RejectsUnsupportedRegisteredAlg_NoFailOpen
CVE-2024-29371 (jose4j JWE decompression bomb)resource exhaustion via crafted JWERFC 8725 §3.11internal/jose.FuzzJOSEParse (oversize seed)
internal/parendpoint.FuzzPARFormBody
internal/introspectendpoint.FuzzIntrospectFormBody
internal/revokeendpoint.FuzzRevokeFormBody

Authorize / redirect_uri

CVEClassRFC anchorTest
CVE-2024-10318 (NGINX OIDC reference)front-channel id_token issued without nonce binding → session fixationOIDC Core §15.5.2 / RFC 9700 §2.1.2internal/authorize.TestRequest_Validate_RejectsImplicitAndHybridResponseTypes (response_type=code only)
internal/backchannel.TestSignLogoutToken_EmitsRequiredClaims (logout_token typ discrimination)
CVE-2024-8883 (Keycloak)wildcard / suffix bypass of an earlier redirect_uri patchRFC 6749 §3.1.2.3 / RFC 9700 §4.1internal/authorize.TestRequest_Validate_RedirectURIAttackVariants
CVE-2020-15234 (ory/fosite)case-variant redirect_uri matched a case-different registrationRFC 6749 §3.1.2.3internal/authorize.TestRequest_Validate_RedirectURIAttackVariants
GHSA-rfq3-w54c-f9q5 (ory/fosite)loopback redirect rule allowed host / query override; fix narrows runtime variation to the port only — exact-string match here is even stricterRFC 6749 §3.1.2.3 / RFC 9700 §4.1internal/authorize.TestRequest_Validate_RedirectURIAttackVariants
CVE-2026-7571 (Keycloak)disabled implicit-flow control bypass; front-channel access-token disclosure via a forged client stateRFC 9700 §2.1.2internal/authorize.TestRequest_Validate_RejectsImplicitAndHybridResponseTypes
CVE-2026-3872 (Keycloak)wildcard redirect_uri path traversal using ..;/RFC 6749 §3.1.2.3 / RFC 9700 §4.1internal/authorize.TestRequest_Validate_RedirectURIAttackVariants
CVE-2026-7504 (Keycloak)wildcard redirect_uri parser confusion through multiple @ bytes in the authority / userinfo segmentRFC 6749 §3.1.2.3 / RFC 9700 §4.1internal/authorize.TestRequest_Validate_RedirectURIAttackVariants

PKCE / code exchange

CVEClassRFC anchorTest
CVE-2024-23647 (authentik ≤2023.10.6, CVSS 6.1)/token accepted code_verifier on codes minted without a code_challenge — PKCE downgradeRFC 9700 §4.8 / RFC 7636 §4.6internal/grants/authcode.TestExchange_NoPKCE_RejectsSmuggledVerifier
CVE-2025-4144 (Cloudflare workers-oauth-provider <0.0.5, CVSS 8.1)same downgrade variant in a different ecosystemRFC 9700 §4.8internal/grants/authcode.TestExchange_NoPKCE_RejectsSmuggledVerifier

Authorization code interception (cross-client retrieval)

CVEClassRFC anchorTest
GHSA-vh7g-p26c-j2cw (dexidp/dex, 2024)back-channel ID-token retrieval after authorization-code interception — redeeming the code under a different client_id returned tokens minted for the victim. Structural mitigation: the (code, client_id, redirect_uri[, code_verifier]) tuple must match at exchangeRFC 6749 §4.1.3 / OIDC Core §3.1.3.4internal/grants/authcode.TestExchange_RejectsClientMismatch

Client authentication / private_key_jwt

CVEClassRFC anchorTest
CVE-2025-27370 (OIDF coordinated, OIDC)private_key_jwt aud confusion: malicious AS could relay a key reused across ASs and impersonate the clientRFC 7523bis / FAPI 2.0 §5.2.2internal/clientauth.TestPrivateKeyJWTVerifier_AudIssuer_AcceptedViaAuxAudiences
CVE-2025-27371 (IETF coordinated, OAuth 2.0)same defect, OAuth profile lineageRFC 7523bisinternal/clientauth.TestPrivateKeyJWTVerifier_AudIssuer_AcceptedViaAuxAudiences
CVE-2020-15222 (ory/fosite < 0.31.0, GHSA-mh3m-8c74-74xh)private_key_jwt jti uniqueness not enforced — assertion replayRFC 7523 §3 / CWE-345internal/clientauth.TestPrivateKeyJWTVerifier_JTIReplay_Rejected
GHSA-v3q9-2p3m-7g43 (ory/fosite, 2020 cluster)same jti-replay defect class re-disclosed under a separate GHSA — structural mitigation is identical (per-jti single-use within the assertion's exp window)RFC 7523 §3 / CWE-345internal/clientauth.TestPrivateKeyJWTVerifier_JTIReplay_Rejected
CVE-2026-1180 (Keycloak)jwks_uri SSRF during dynamic-client private_key_jwt key resolutionRFC 7591 §2 / RFC 7523 §3internal/securefetch.TestPolicy_SSRFContract

Token introspection

CVEClassRFC anchorTest
CVE-2026-37979 (Keycloak)token introspection audience bypass — a confidential client could retrieve claims for another resource server's tokenRFC 7662 §2.2internal/introspectendpoint.TestHandler_JWTAccessToken_DifferentClient
internal/introspectendpoint.TestHandler_OpaqueAccessToken_DifferentClient

Refresh token rotation

CVEClassRFC anchorTest
CVE-2026-1035 (Keycloak)refresh-token reuse bypass via TOCTOU race in rotation enforcementRFC 9700 §2.2.2 / RFC 6749 §6op/storeadapter/inmem.TestConsumeRefresh_Race

Session lifecycle (fixation / rotation)

CVEClassRFC anchorTest
GHSA-xhpr-465j-7p9q (Keycloak, 2024)first-login phishing via email verification (CWE-384 session fixation) — a session that pre-existed the trust transition continued to be authoritative after verification, letting an attacker who planted the cookie ride the post-verification trust. Structural mitigation: rotate session ID on the trust boundary, but preserve CreatedAt so an attacker cannot extend lifetime by triggering rotationOIDC Core §3.1.2.7internal/sessions.TestManager_Rotate_IssuesFreshIDPreservingChooserGroup
internal/sessions.TestManager_Rotate_PreservesCreatedAt
CVE-2026-7507 (Keycloak)OIDC-login session fixation → account takeover; a pre-seeded session ID survived fresh authentication. Structural mitigation: rotate the cookie-bound session ID when a fresh authn factor completes at the authorize / interaction boundary, and delete the old session recordOIDC Core §3.1.2.7internal/authorizeendpoint.TestInteractionPost_RotatesSessionIDAfterFreshAuthn

Multi-factor authentication (TOTP / step-up)

CVEClassRFC anchorTest
GHSA-9r3w-4j8q-pw98 (cal.com)providing a TOTP code skipped the password check entirely — TOTP step ran without primary-factor proofRFC 6238 / OIDC Core §2 (acr semantics)internal/authn.TestLoginFlowTOTPRequiresPrimary (orchestrator gate)
internal/authn/totp.TestAuthenticator_BeginRequiresSubject
internal/authn/totp.TestAuthenticator_ContinueRequiresSubject (adapter gate)
GHSA-5jfq-x6xp-7rw2 (Keycloak)second-factor bypass — same structural class, covered by the same two-layer mitigation (orchestrator step ordering + adapter Subject-required gate)RFC 6238 / OIDC Core §2(same tests as above)

JARM / response signing

CVEClassRFC anchorTest
CVE-2023-6927 (Keycloak)response_mode=form_post.jwt bypass of CVE-2023-6134 — JARM added without the same alg restrictions as the bearer flowFAPI 2.0 Message Signing §5.4 / RFC 8725 §3.1internal/jarm.TestSigner_AlgIsES256_Structural
CVE-2023-6134 (Keycloak, parent)original form-post downgrade; tracked via 6927RFC 8725 §3.1internal/jarm.TestSigner_AlgIsES256_Structural

Error response surfaces (redirect / form_post)

The authorize endpoint emits errors over two surfaces — a redirect with query parameters and an auto-submitting form_post HTML page. Both must escape RP-supplied bytes so a hostile redirect_uri or error_description cannot inject markup or open-redirect chains.

CVEClassRFC anchorTest
GHSA-27gc-wj6x-9w55 (Keycloak, 2024)error_description reflected into HTML error pages without escaping (CWE-79 / CWE-601) — phishing / open-redirect chains. Two-layer mitigation: (1) error_description is a closed catalogue of hardcoded sentinels — RP bytes never reach the field directly; (2) on the wire, url.Values.Encode percent-encodes the redirect surface and html.EscapeString escapes both action= and value= on the form_post surfaceRFC 6749 §4.1.2.1 / RFC 9700 §4.10internal/jarm.TestWriteFormPost_EscapesRedirectAndJWT
internal/authorizeendpoint.TestBuildRedirectError_EncodesHostileBytes_NoXSS
internal/authorizeendpoint.TestBuildRedirectError_StripsControlBytes

Operator observability (silent failure on revoke)

CVEClassRFC anchorTest
GHSA-7mqr-2v3q-v2wm (ory/fosite)/revoke silently swallowed storage errors — RFC 7009 §2.2 still requires a wire 200, but operators had no observable signal that revocation actually failed. The library keeps the wire 200 and additionally emits token.revoke_failed on every non-NotFound store fault so SOC tooling can detect the silent-failure classRFC 7009 §2.2internal/revokeendpoint.TestHandler_RefreshToken_StoreFault_EmitsAudit

DoS / parsing safety

Fuzz harnesses across the JOSE / endpoint surface keep parsing panic-free against crafted inputs:

SurfaceFuzzerCVE class kept out
JOSE parseinternal/jose.FuzzJOSEParseRFC 8725 §3.11 / CVE-2024-29371 (decompression bomb), 2015 alg=none cluster
PAR endpoint bodyinternal/parendpoint.FuzzPARFormBodyCVE-2024-29371 (CVSS 7.5; jose4j JWE decompression bomb)
Introspection endpoint bodyinternal/introspectendpoint.FuzzIntrospectFormBodyCVE-2024-29371
Revocation endpoint bodyinternal/revokeendpoint.FuzzRevokeFormBodyRFC 8725 §3.11 / CVE-2024-29371 (panic immunity)

The same FuzzJOSEParse no-panic + JWS-only contract additionally class-covers a cluster of dependency-side advisories that exercise input shapes the OP never accepts (compact JWS only, JWE / compression paths absent, CBC-mode JWE algs not in the allowlist):

AdvisorySourceClass-coverage
GHSA-78h2-9frx-2jm8go-joseJWE decryption panic — ParseSigned is JWS-only and never enters the JWE decrypt path
GHSA-c6gw-w398-hv78go-joseparse DoS on pathological JSON — covered by the no-panic fuzz contract
GHSA-c5q2-7r4c-mv6ggo-josecompression amplification (CVE-2024-29371 cluster) — compact JWS only, no compression path
GHSA-pvcr-v8j8-j5q3lestrrat-go/jwxJSON-form parse panic — compact-only rejection
GHSA-hj3v-m684-v259lestrrat-go/jwxJWE compression DoS — same compact-only contract
GHSA-7f9x-gw85-8grflestrrat-go/jwxmalicious JWE-params DoS — same compact-only contract
GHSA-rm8v-mxj3-5rmqlestrrat-go/jwxCBC-mode JWE padding-oracle possibility — JWS-only allowlist (RS256 / PS256 / ES256 / EdDSA) excludes every CBC-mode JWE alg

What this list deliberately does not include

  • CVEs against this library. The library is pre-v1.0 and has no published CVE record yet; if one is filed, it goes in SECURITY.md and through the disclosure flow on Reporting a security issue, not here.
  • Dependency defects whose trigger inputs the OP's input contract does NOT structurally reject. Those are tracked through govulncheck in CI and resolved by version bump. Where the OP's compact-JWS-only / JWS-only-allowlist contract structurally rejects the trigger inputs (e.g. JWE-side panics, CBC padding oracles), the advisory IS listed in the table above with a "class-covered" pointer to the fuzz harness.
  • TLS / transport defects (e.g. GHSA-gr79-9v6v-gc9r, GHSA-q8hq-4h99-fj7x). The library does not own its HTTP server; TLS configuration is the embedder's responsibility. See Library posture.
  • SAML defects (e.g. GHSA-m9hp-7r99-94h5). SAML is not implemented; this is an OP only.
  • Tracked but not yet covered advisories. The source repository's advisory queue may contain entries marked tracking while the matching regression test is still being designed (for example, classes under DCR redirect allow-listing, introspection revocation windows, or custom-grant confused-deputy checks). Those stay out of this public matrix until a concrete test pins the contract.
  • Theoretical attacks without a published CVE. A test motivated purely by a spec section (e.g. RFC 8725 §3.x) is still in the codebase, but won't appear here unless a CVE pins the class to a named defect somewhere in the ecosystem.

Reading the bigger picture

The CVE-driven tests sit alongside three other layers of regression material:

  1. Spec scenariostests/scenarios/ (in the repo) catalogues OIDC / OAuth / FAPI behaviours from the spec text directly, regardless of whether a CVE exists.
  2. OFCS conformance harness — see OFCS conformance status. The OpenID Foundation's certified test suite drives the public surface end-to-end against the FAPI 2.0 plans.
  3. Fuzz harnesses — listed above, run on every PR.

If you find a CVE class this library should pin and doesn't, please open an issue or follow the disclosure flow for anything that would itself be a vulnerability to discuss in public.