
CVE-2026-29000 - pac4j-jwt (< 4.5.9 / < 5.7.9 / < 6.3.3) JwtAuthenticator 認証バイパス PoC
JwtAuthenticator 認証バイパス PoCこれは、pac4j-jwt の JwtAuthenticator
コンポーネントにおける認証バイパス(CVSS 10.0、緊急)である
CVE-2026-29000 の概念実証(PoC)です。
このスクリプトは、ターゲットが RSA の公開鍵を提供している限り、いかなる秘密も知らなくても、 任意のユーザーと任意のロールを偽装するトークンを偽造します。
[!WARNING] このツールは教育目的および許可されたセキュリティテスト専用に提供されます。Hack The Box のマシン "Principal" を解くために書かれたものであり、デフォルト値(
iss、role、kid)はそのマシンに 合わせて調整されています。所有しているシステム、またはテストする明示的な許可を得たシステムに 対してのみ使用してください。
pac4j-jwt のバージョン < 4.5.9、< 5.7.9、< 6.3.3 には、
JwtAuthenticator が 暗号化された JWT(JWE)を処理する際の論理的な欠陥があります。
JwtAuthenticator が JWE を復号すると、内部トークンを SignedJWT として解析しようとします。
内部トークンが署名のない PlainJWT(alg: none)の場合、SignedJWT オブジェクトは null になり、
この論理エラーにより署名検証処理が完全にスキップされます。
その後、JwtAuthenticator は検証されていないクレームから直接ユーザープロファイルを
構築します。
言い換えれば、サーバーの公開鍵のみを必要とする外側の JWE 暗号化は、 真正性の証明と誤認されます。そのため、公開鍵を読み取れる攻撃者は誰でも、 完全に信頼されたトークンを生成できます。
/api/auth/jwks)から RSA 公開鍵を取得する。PlainJWT(alg: none)を、攻撃者が選択したクレーム
(sub、role、iss、…)で偽造する。PlainJWT を、ターゲットの公開鍵で暗号化した JWE エンベロープにラップする。Bearer トークンとして送信する。脆弱な
JwtAuthenticator はそれを復号し、署名検証をスキップして、偽造された
クレームを信頼する。requirements.txt の依存関係:pip install -r requirements.txt
(requests, jwcrypto, cryptography)
python3 exploit.py -u <username> [options]
--target(ネットワーク経由で JWKS を取得する)または
--jwks-file(ローカルから指定する)のいずれかを指定する必要があります。
ターゲットから公開鍵を取得して管理者トークンを偽造し、 stdout に出力します:
python3 exploit.py -t http://target:8080 -u admin
トークンを偽造し、保護されたエンドポイントに対して自動的にテストします:
python3 exploit.py -t http://target:8080 -u admin \
--verify-endpoint /api/settings -v
ローカルに保存した JWKS を使用し、トークンをファイルに保存します:
python3 exploit.py --jwks-file jwks.json -u admin -o token.jwe
org.pac4j:pac4j-jwt を修正済みリリースにアップグレードしてください:
MIT License の下で公開されています。
| フラグ | 説明 | デフォルト |
|---|
-t, --target | ターゲットのベース URL(例:http://host:8080) | — |
--jwks-url | JWKS エンドポイントのパス | /api/auth/jwks |
--jwks-file | --target から取得する代わりに、ローカルファイルから JWKS を読み込む | — |
-u, --username | sub クレームの値 (必須) | — |
--role | role クレームの値 | ROLE_ADMIN |
--iss | iss クレームの値 | principal-platform |
--exp | トークンの有効期間(秒) | 3600 |
--verify-endpoint | 偽造トークンをテストする保護エンドポイント(例:/api/settings) | — |
-k, --insecure | TLS 証明書の検証を無効化 | off |
-o, --output | 偽造した JWE を stdout ではなくファイルに書き出す | stdout |
-v, --verbose | 偽造した JWT ペイロードを stderr に出力 | off |