CVE 回帰マトリクス
別の OIDC / OAuth / JOSE 実装に対して CVE が公表されたとき、本ライブラリにとっての問いは 「同じ欠陥が本ライブラリにも届きうるか、届かないとすれば構造的に何が防いでいるか」 です。コードレビューだけでは正直な答えは出せず、将来のリファクタで回避経路が再び開いてしまったときにビルドが落ちるテストが必要です。
本ページはそのテスト群の公開リストです。ここに載っている CVE には、少なくとも 1 本のユニット / fuzz テストが対応し、対象を実際に呼び出して拒否動作を pin(固定化)しています。テストへの参照は安定しており、表の各行に挙げたファイル名・テスト名はリポジトリに実在します。
表の読み方
- CVE — 他実装に対する元の脆弱性開示です。本ライブラリに対する CVE 記録ではありません。テストが防ごうとしている 欠陥クラス を示すためのフィールドです。
- クラス — 根本的な欠陥の種類(algorithm confusion、redirect_uri マッチング、PKCE ダウングレード等)。
- RFC アンカ — テストが pin している仕様セクション。
- テスト — 該当箇所が退行したらビルドを落とすテスト。
JOSE / JWT 検証
| CVE | クラス | RFC アンカ | テスト |
|---|---|---|---|
| CVE-2015-9235 (jsonwebtoken) | alg=none 受理 | RFC 8725 §3.1 | internal/jose.FuzzJOSEParse (alg=none seed)internal/tokens.TestVerify_AlgConfusion_HSUsingECPublicKeyBytesAsSecret |
| CVE-2016-10555 (jwt-simple) | alg=HS256 受理、公開鍵を HMAC secret として使用 | RFC 8725 §2.1 | internal/tokens.TestVerify_AlgConfusion_HSUsingECPublicKeyBytesAsSecret |
| CVE-2015-2951 (jose4j) | alg=none 受理 | RFC 8725 §3.1 | internal/jose.FuzzJOSEParse |
| CVE-2024-54150 (cjwt) | algorithm confusion | RFC 8725 §2.1 | internal/tokens.TestVerify_AlgConfusion_HSUsingECPublicKeyBytesAsSecret |
| CVE-2026-22817 / -27804 / -23552 (Hono JWT 2026 cluster) | 大文字小文字違いの alg=NONE で deny-list を回避 | RFC 8725 §3.1 | internal/jose.TestParseAlgorithm_CaseVariantsRejectedinternal/jose.FuzzJOSEParse (case-variant seeds) |
| CVE-2026-33322 (MinIO OIDC) | algorithm confusion | RFC 8725 §2.1 | internal/tokens.TestVerify_AlgConfusion_HSUsingECPublicKeyBytesAsSecret |
| CVE-2018-0114 (Cisco / node-jose) | jwk ヘッダの盲信 — JWS 自身が運ぶ鍵で検証してしまう | RFC 8725 §3.1–3.5 | internal/jose.TestParseSigned_HeaderInjection_NeverFetchesinternal/jose.FuzzJOSEParse (jku seed) |
| CVE-2018-1000531 (inversoft prime-jwt) | alg ヘッダのダウングレード + jwk ヘッダの盲信 | RFC 8725 §3.1 | internal/jose.TestParseSigned_HeaderInjection_NeverFetches |
| CVE-2017-11424 (python-jose 系) | ヘッダ内の jku URL を辿って鍵を取得 | RFC 8725 §3.1 | internal/jose.TestParseSigned_HeaderInjection_NeverFetches |
| CVE-2019-7644 (Auth0 jsonwebtoken-koa) | jwk ヘッダの盲信 | RFC 8725 §3.1 | internal/jose.TestParseSigned_HeaderInjection_NeverFetches |
| CVE-2025-59420 (Authlib) | crit 拡張リストを無視 | RFC 7515 §4.1.11 / RFC 8725 §3.5 | internal/jose.TestParseSigned_CritHeaderRejectedAtVerify |
| CVE-2026-32597 (PyJWT) | 同じ crit 無視欠陥 | RFC 8725 §3.5 | internal/jose.TestParseSigned_CritHeaderRejectedAtVerify |
| CVE-2024-29371 (jose4j JWE 解凍 bomb) | 細工された JWE によるリソース枯渇 | RFC 8725 §3.11 | internal/jose.FuzzJOSEParse (oversize seed)internal/parendpoint.FuzzPARRequestObjectinternal/introspectendpoint.FuzzIntrospectTokeninternal/revokeendpoint.FuzzRevokeToken |
Authorize / redirect_uri
| CVE | クラス | RFC アンカ | テスト |
|---|---|---|---|
| CVE-2024-10318 (NGINX OIDC リファレンスモジュール) | フロントチャネル id_token が nonce バインディングなしに発行 → セッションフィクセーション | OIDC Core §15.5.2 / RFC 9700 §2.1.2 | internal/authorize.TestRequest_Validate_RejectsImplicitAndHybridResponseTypes (response_type=code 限定)internal/backchannel.TestSignLogoutToken_EmitsRequiredClaims (logout_token の typ 区別) |
| CVE-2024-8883 (Keycloak) | 旧 redirect_uri パッチをワイルドカード / suffix で迂回 | RFC 6749 §3.1.2.3 / RFC 9700 §4.1 | internal/authorize.TestRequest_Validate_RedirectURIAttackVariants |
| CVE-2020-15234 (ory/fosite) | 大文字小文字違いの redirect_uri が登録値にマッチ | RFC 6749 §3.1.2.3 | internal/authorize.TestRequest_Validate_RedirectURIAttackVariants |
| GHSA-rfq3-w54c-f9q5 (ory/fosite) | loopback redirect ルールでホスト / クエリの差し替えを許してしまった欠陥 (修正後はポートのみが実行時に変動可)。本ライブラリは登録値との完全一致のみ許容するためさらに厳格 | RFC 6749 §3.1.2.3 / RFC 9700 §4.1 | internal/authorize.TestRequest_Validate_RedirectURIAttackVariants |
PKCE / コード交換
| CVE | クラス | RFC アンカ | テスト |
|---|---|---|---|
| CVE-2024-23647 (authentik ≤2023.10.6, CVSS 6.1) | /token が code_challenge 無し で発行された code に対しても code_verifier を受理 — PKCE ダウングレード | RFC 9700 §4.8 / RFC 7636 §4.6 | internal/grants/authcode.TestExchange_NoPKCE_RejectsSmuggledVerifier |
| CVE-2025-4144 (Cloudflare workers-oauth-provider <0.0.5, CVSS 8.1) | 同じダウングレードを別エコシステムで再現 | RFC 9700 §4.8 | internal/grants/authcode.TestExchange_NoPKCE_RejectsSmuggledVerifier |
認可コード横取り (クロスクライアント取得)
| CVE | クラス | RFC アンカ | テスト |
|---|---|---|---|
| GHSA-vh7g-p26c-j2cw (dexidp/dex, 2024) | フロントチャネルで横取りした認可コードを 別の client_id で交換して、被害者向けに発行されたトークンを取得できた欠陥。構造的緩和は (code, client_id, redirect_uri[, code_verifier]) のタプル一致を交換時に強制すること | RFC 6749 §4.1.3 / OIDC Core §3.1.3.4 | internal/grants/authcode.TestExchange_RejectsClientMismatch |
クライアント認証 / private_key_jwt
| CVE | クラス | RFC アンカ | テスト |
|---|---|---|---|
| CVE-2025-27370 (OIDF 連携、OIDC 系統) | private_key_jwt aud confusion: 鍵を複数 AS で使い回したクライアントを、敵対 AS が中継してなりすまし | RFC 7523bis / FAPI 2.0 §5.2.2 | internal/clientauth.TestPrivateKeyJWTVerifier_AudIssuer_AcceptedViaAuxAudiences |
| CVE-2025-27371 (IETF 連携、OAuth 2.0 系統) | 同じ欠陥、OAuth プロファイル系統 | RFC 7523bis | internal/clientauth.TestPrivateKeyJWTVerifier_AudIssuer_AcceptedViaAuxAudiences |
| CVE-2020-15222 (ory/fosite < 0.31.0, GHSA-mh3m-8c74-74xh) | private_key_jwt の jti の一意性が強制されない — assertion replay | RFC 7523 §3 / CWE-345 | internal/clientauth.TestPrivateKeyJWTVerifier_JTIReplay_Rejected |
| GHSA-v3q9-2p3m-7g43 (ory/fosite, 2020 cluster) | 同じ jti リプレイ欠陥クラスが別 GHSA として再開示されたもの。構造的緩和は同一 (assertion の exp 期間中、jti ごとに 1 回限りの使用) | RFC 7523 §3 / CWE-345 | internal/clientauth.TestPrivateKeyJWTVerifier_JTIReplay_Rejected |
セッションライフサイクル (フィクセーション / ローテーション)
| CVE | クラス | RFC アンカ | テスト |
|---|---|---|---|
| GHSA-xhpr-465j-7p9q (Keycloak, 2024) | メール検証経由の初回ログインフィッシング (CWE-384 セッションフィクセーション)。信頼境界をまたぐ前から存在していたセッションが検証後も有効なまま使われ、cookie を仕込んだ攻撃者が検証後の信頼に乗ってしまう欠陥。構造的緩和は信頼境界でセッション ID をローテーションし、CreatedAt は維持して攻撃者がローテーションを誘発しても寿命を延ばせないようにすること | OIDC Core §3.1.2.7 | internal/sessions.TestManager_Rotate_IssuesFreshIDPreservingChooserGroupinternal/sessions.TestManager_Rotate_PreservesCreatedAt |
多要素認証 (TOTP / step-up)
| CVE | クラス | RFC アンカ | テスト |
|---|---|---|---|
| GHSA-9r3w-4j8q-pw98 (cal.com) | TOTP コードを送るだけでパスワード検証を完全に飛ばせた欠陥 — primary factor の証明なしで TOTP ステップが進む | RFC 6238 / OIDC Core §2 (acr 意味論) | internal/authn.TestLoginFlowTOTPRequiresPrimary (オーケストレータ層)internal/authn/totp.TestAuthenticator_BeginRequiresSubjectinternal/authn/totp.TestAuthenticator_ContinueRequiresSubject (アダプタ層) |
| GHSA-5jfq-x6xp-7rw2 (Keycloak) | 二要素バイパス — 同じ構造クラス。同じ二層緩和 (オーケストレータのステップ順序 + アダプタ側の Subject 必須ゲート) で対応 | RFC 6238 / OIDC Core §2 | (上と同じテスト群) |
JARM / レスポンス署名
| CVE | クラス | RFC アンカ | テスト |
|---|---|---|---|
| CVE-2023-6927 (Keycloak) | response_mode=form_post.jwt で CVE-2023-6134 を迂回 — JARM 追加時に bearer フローと同じ alg 制約が抜けた | FAPI 2.0 Message Signing §5.4 / RFC 8725 §3.1 | internal/jarm.TestSigner_AlgIsES256_Structural |
| CVE-2023-6134 (Keycloak、親 CVE) | 元の form-post ダウングレード(6927 経由で追跡) | RFC 8725 §3.1 | internal/jarm.TestSigner_AlgIsES256_Structural |
エラーレスポンスの出力面 (redirect / form_post)
authorize エンドポイントは、クエリ付きリダイレクトと自動送信される form_post HTML の 2 つの出力面でエラーを返します。どちらの面でも、敵対的な redirect_uri や error_description が markup 注入や open-redirect 連鎖を起こさないよう、RP 由来の byte 列をエスケープしなければなりません。
| CVE | クラス | RFC アンカ | テスト |
|---|---|---|---|
| GHSA-27gc-wj6x-9w55 (Keycloak, 2024) | error_description をエスケープせず HTML エラーページに反射してしまう欠陥 (CWE-79 / CWE-601) — フィッシング / open-redirect 連鎖。二層の緩和: (1) error_description の値はハードコードされた sentinel 文字列のクローズドカタログで、RP の byte 列が直接届かない (2) 通信路上では url.Values.Encode がリダイレクト面を percent-encode し、html.EscapeString が form_post 面の action= と value= を共に escape | RFC 6749 §4.1.2.1 / RFC 9700 §4.10 | internal/jarm.TestWriteFormPost_EscapesRedirectAndJWTinternal/authorizeendpoint.TestBuildRedirectError_EncodesHostileBytes_NoXSSinternal/authorizeendpoint.TestBuildRedirectError_StripsControlBytes |
運用の可観測性 (revoke のサイレント失敗)
| CVE | クラス | RFC アンカ | テスト |
|---|---|---|---|
| GHSA-7mqr-2v3q-v2wm (ory/fosite) | /revoke がストレージエラーを黙って握りつぶしていた欠陥。RFC 7009 §2.2 は wire 上の 200 を要求し続けるため、revocation が実際に失敗しても運用側に観測可能な信号がない状態でした。本ライブラリは wire 200 を維持しつつ、NotFound 以外のストア障害では token.revoke_failed audit イベントを発火し、SOC ツーリング側でサイレント失敗クラスを検知できるようにしています | RFC 7009 §2.2 | internal/revokeendpoint.TestHandler_RefreshToken_StoreFault_EmitsAudit |
DoS / パース安全性
JOSE と各エンドポイントの fuzz ハーネスが、細工された入力でも panic を起こさないことを保証します:
| 対象 | fuzzer | 防いでいる CVE クラス |
|---|---|---|
| JOSE パース | internal/jose.FuzzJOSEParse | RFC 8725 §3.11 / CVE-2024-29371(解凍 bomb), 2015 alg=none cluster |
| PAR request object | internal/parendpoint.FuzzPARRequestObject | CVE-2024-29371(CVSS 7.5、jose4j JWE 解凍 bomb) |
| Introspection token | internal/introspectendpoint.FuzzIntrospectToken | CVE-2024-29371 |
| Revocation token | internal/revokeendpoint.FuzzRevokeToken | RFC 8725 §3.11 / CVE-2024-29371(panic 免疫) |
FuzzJOSEParse の no-panic + JWS-only 契約は、OP が決して受理しない入力形 (compact JWS のみ、JWE / 圧縮の経路は不在、CBC-mode JWE alg は allowlist 外) を起点とする依存ライブラリ側のアドバイザリ群もクラス単位で覆っています:
| アドバイザリ | ソース | クラスカバレッジ |
|---|---|---|
| GHSA-78h2-9frx-2jm8 | go-jose | JWE 復号時の panic — ParseSigned は JWS のみで JWE 復号経路に到達しない |
| GHSA-c6gw-w398-hv78 | go-jose | 病的 JSON でのパース DoS — no-panic fuzz 契約でカバー |
| GHSA-c5q2-7r4c-mv6g | go-jose | 圧縮増幅 (CVE-2024-29371 cluster) — compact JWS のみで圧縮経路なし |
| GHSA-pvcr-v8j8-j5q3 | lestrrat-go/jwx | JSON 形式パース panic — compact-only 拒否でカバー |
| GHSA-hj3v-m684-v259 | lestrrat-go/jwx | JWE 圧縮 DoS — 同じ compact-only 契約 |
| GHSA-7f9x-gw85-8grf | lestrrat-go/jwx | 悪意ある JWE パラメータ DoS — 同じ compact-only 契約 |
| GHSA-rm8v-mxj3-5rmq | lestrrat-go/jwx | CBC-mode JWE の padding oracle 可能性 — JWS-only allowlist (RS256 / PS256 / ES256 / EdDSA) が CBC-mode JWE alg を全排除 |
このリストに 意図的に 含めないもの
- 本ライブラリ自身に対する CVE。 本ライブラリは pre-v1.0 で、現時点で公表 CVE はありません。発生した場合は
SECURITY.mdと 脆弱性報告 のフローで扱い、本ページではありません。 - OP の入力契約が構造的に弾けない依存ライブラリ側欠陥。 これらは CI の
govulncheckで追跡し、バージョン更新で解決します。一方、OP の compact-JWS-only / JWS-only allowlist 契約がトリガとなる入力を構造的に拒否できる場合 (JWE 側の panic、CBC padding oracle など) は、上の表に「クラスカバレッジ」として fuzz ハーネスへのポインタを添えて掲載しています。 - TLS / トランスポート層の欠陥 (例:
GHSA-gr79-9v6v-gc9r、GHSA-q8hq-4h99-fj7x)。本ライブラリは HTTP サーバを所有しないため、TLS の構成は組み込み側の責任です。詳細は セキュリティ方針 を参照。 - SAML 側の欠陥 (例:
GHSA-m9hp-7r99-94h5)。本ライブラリは SAML を実装しません (OP のみ)。 - CVE 番号が無い理論的攻撃。 仕様セクション(例: RFC 8725 §3.x)だけを動機としたテストはコードベースに存在しますが、欠陥クラスを既知の特定 CVE と紐づけられない限り本ページには載せません。
全体像
CVE 駆動テストは、他の 3 種の回帰素材と並んで存在します:
- 仕様シナリオ — リポジトリの
tests/scenarios/が、CVE の有無に関わらず OIDC / OAuth / FAPI の仕様文言を直接カタログ化しています。 - OFCS 適合ハーネス — OFCS 適合状況 を参照してください。OpenID Foundation 認定テストスイートが、FAPI 2.0 プランに沿って公開エンドポイントを end-to-end で実行します。
- Fuzz ハーネス — 上で列挙したものです。PR ごとに実行されます。
本ライブラリが pin すべき CVE クラスがここに載っていない場合は Issue を起票してください。公開で議論すること自体が脆弱性に該当する内容であれば、脆弱性報告 のフローに従ってください。