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 / -27804 / -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-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-2024-29371 (jose4j JWE decompression bomb)resource exhaustion via crafted JWERFC 8725 §3.11internal/jose.FuzzJOSEParse (oversize seed)
internal/parendpoint.FuzzPARRequestObject
internal/introspectendpoint.FuzzIntrospectToken
internal/revokeendpoint.FuzzRevokeToken

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

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

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

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 request objectinternal/parendpoint.FuzzPARRequestObjectCVE-2024-29371 (CVSS 7.5; jose4j JWE decompression bomb)
Introspection tokeninternal/introspectendpoint.FuzzIntrospectTokenCVE-2024-29371
Revocation tokeninternal/revokeendpoint.FuzzRevokeTokenRFC 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.
  • 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.