
Keycloakデータベース内でCVE-2026-18963(Keycloakの未認証アカウント乗っ取り)の悪用痕跡をハントする
Keycloak の PostgreSQL データベースから CVE-2026-18963 の悪用痕跡(reset-credentials フローを介した未認証のアカウント乗っ取り)を検索する psql スクリプトです。
KYOS が公開しています。私たちが運用する Keycloak デプロイメントにパッチを適用する際、暴露期間中に誰も乗っ取られていないことを確認するために作成しました。
CVE-2026-18963 は keycloak-services の reset-credentials フローにおける欠陥です(keycloak#51833)。未認証の攻撃者は、メール検証リンクをクリックすることなく任意のユーザーのパスワードリセットプロセスを完了し、そのアカウントに新しいパスワードを設定できます。ユーザーの操作は必要ありません。
深刻度: Critical、CVSS v3.1 9.1(AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N)、Red Hat および NVD による。根本原因は認証フローにおける不適切な状態検証であり、keycloak#51844 で修正されています。
| ストリーム | 修正版 |
|---|
| 26.7.x | 26.7.2 (リリースノート) |
| 26.6.x | 26.6.6 |
| 26.4.x (LTS) | 26.4.15 |
| 26.8 | 26.8.0 |
サポート対象ストリームのこれらのバージョンより古いものはすべて脆弱です。サポート終了のリリース(26.5.x、26.3 以前)には修正が提供されないため、暴露を想定して修正済みストリームにアップグレードしてください。Red Hat はレガシー RH-SSO 7 を影響なしとしています。Red Hat Build of Keycloak 26.4/26.6 は 26.4.15-1 / 26.6.6-1 で修正されています。
セルフサービスのパスワードリセットを無効にすると、脆弱なエントリポイントが除去されます: すべてのレルムで、Admin console > Realm settings > Login > "Forgot password" をオフにします。管理 API の場合は: PUT /admin/realms/{realm} に {"resetPasswordAllowed": false} を指定します。
これにより login-actions/reset-credentials エンドポイントはブロックされますが、正当なユーザーが自分のパスワードをリセットすることもできなくなるため、アップグレードまでの暫定措置として扱ってください。Red Hat はこの CVE に対する推奨緩和策を公開していないことに注意してください。パッチ適用が唯一の本当の修正です。
cve-2026-18963-keycloak-hunt.sql は4つの読み取り専用クエリを実行します:
| クエリ | 検出内容 |
|---|---|
| Q0 | レルムがログイン/管理イベントをそもそも保存しているかどうか、およびその TTL。イベントがオフまたは期限切れの場合、Q2/Q3 の空の結果は何も証明しません。 |
| Q1 | 暴露期間内に設定されたすべてのパスワード資格情報(credential.created_date)。これが乗っ取りそのものであり、イベントログがオフでも機能します。 |
| Q2 | リセット/資格情報のログインイベントを調べ、直前の24時間に SEND_RESET_PASSWORD がない完了済みリセットにフラグを立てます(no_email_before = t)。このフラグが CVE のシグネチャです: 攻撃者はメールを一切トリガーしていません。 |
| Q3 | 管理者主導の経路を除外するための、Admin-API による資格情報リセットおよび execute-actions オペレーション。 |
# defaults: realm 'master', window since 2026-06-01
psql -U keycloak -d keycloak -f cve-2026-18963-keycloak-hunt.sql
# explicit realm and window (run once per realm, quote values exactly like this)
psql -U keycloak -d keycloak \
-v realm="'myrealm'" -v since="'2026-05-01'" \
-f cve-2026-18963-keycloak-hunt.sql
since は、脆弱なバージョンが稼働し始めた直前の日付に設定します。Kubernetes の場合:
kubectl exec -it my-postgres-pod -- \
psql -U keycloak -d keycloak -v realm="'myrealm'" -v since="'2026-05-01'" \
-f - < cve-2026-18963-keycloak-hunt.sql
Q1 の行は自動的に侵害を意味するわけではありません。それぞれを既知の正当な原因(セルフサービスリセット、ヘルプデスクによる操作、新規登録)と照合し、説明できないものは乗っ取りの候補として扱ってください。
RESET_PASSWORD、UPDATE_CREDENTIAL、UPDATE_PASSWORD で no_email_before = t となっている Q2 の行は、この CVE が悪用された最も強い指標です。ip_address 列をアクセスログと突き合わせてください。
最初に Q0 を確認してください: ログインイベントは期限切れになり(events_expiration)、完全に無効化されている可能性もあります。Q1 は期限切れにならないため、最も信頼できるチェックです。
MIT、LICENSE を参照してください。現状のまま提供され、保証はありません。