
Recherchez des traces d'exploitation de CVE-2026-18963 (prise de contrôle de compte non authentifiée dans Keycloak) dans la base de données Keycloak.
Un script psql qui recherche dans une base de données PostgreSQL Keycloak des traces d'exploitation de la CVE-2026-18963 (prise de contrôle de compte non authentifiée via le flux reset-credentials).
Publié par KYOS. Nous l'avons écrit en corrigeant les déploiements Keycloak que nous exploitons, pour vérifier qu'aucun compte n'avait été compromis pendant la fenêtre d'exposition.
CVE-2026-18963 est une faille dans le flux reset-credentials de keycloak-services (keycloak#51833). Un attaquant non authentifié peut mener à bien le processus de réinitialisation de mot de passe pour n'importe quel utilisateur sans cliquer sur le lien de vérification par e-mail, puis définir un nouveau mot de passe sur le compte. Aucune interaction de l'utilisateur n'est requise.
Sévérité : critique, CVSS v3.1 9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N), selon Red Hat et NVD. La cause racine est une validation d'état inadéquate dans le flux d'authentification, corrigée dans keycloak#51844.
| Stream | Corrigé dans |
|---|---|
| 26.7.x | 26.7.2 (release notes) |
| 26.6.x | 26.6.6 |
| 26.4.x (LTS) | 26.4.15 |
| 26.8 | 26.8.0 |
Tout ce qui est en dessous de ces versions dans les streams pris en charge est vulnérable. Les versions hors support (26.5.x, 26.3 et antérieures) ne reçoivent aucun correctif : considérez qu'elles sont exposées et mettez à niveau vers un stream corrigé. Red Hat liste l'ancien RH-SSO 7 comme non affecté ; le Red Hat Build de Keycloak 26.4/26.6 est corrigé dans 26.4.15-1 / 26.6.6-1.
Désactiver la réinitialisation de mot de passe en libre-service supprime le point d'entrée vulnérable : Admin console > Realm settings > Login > « Forgot password » désactivé, pour chaque realm. Via l'API d'administration : PUT /admin/realms/{realm} avec {"resetPasswordAllowed": false}.
Cela bloque le point de terminaison login-actions/reset-credentials mais empêche également les utilisateurs légitimes de réinitialiser leur propre mot de passe, considérez donc cela comme une mesure provisoire jusqu'à la mise à niveau. Notez que Red Hat ne répertorie aucune atténuation officielle pour cette CVE ; l'application du correctif est la seule vraie solution.
cve-2026-18963-keycloak-hunt.sql exécute quatre requêtes en lecture seule :
# 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
Définissez since juste avant que votre version vulnérable ne soit mise en service. Sur 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
Les lignes de Q1 ne sont pas automatiquement des compromissions. Faites correspondre chacune à une cause légitime connue (réinitialisation en libre-service, action du support, nouvel enrôlement) et traitez tout élément inexpliqué comme un candidat à la prise de contrôle.
Les lignes de Q2 avec no_email_before = t sur RESET_PASSWORD, UPDATE_CREDENTIAL ou UPDATE_PASSWORD sont l'indicateur le plus fort que cette CVE a été exploitée. Corrélez la colonne ip_address avec vos journaux d'accès.
Vérifiez Q0 en premier : les événements de connexion expirent (events_expiration) et peuvent être entièrement désactivés. Q1 n'expire pas, c'est donc la vérification la plus fiable.
MIT, voir LICENSE. Fourni tel quel, sans garantie.
| Requête | Ce qu'elle trouve |
|---|
| Q0 | Indique si le realm stocke les événements de connexion/admin, et leur TTL. Si les événements sont désactivés ou expirés, des résultats vides dans Q2/Q3 ne prouvent rien. |
| Q1 | Chaque credential de mot de passe défini dans la fenêtre d'exposition (credential.created_date). C'est la prise de contrôle elle-même et cela fonctionne même si la journalisation des événements était désactivée. |
| Q2 | Événements de connexion de réinitialisation/credential, signalant toute réinitialisation terminée sans SEND_RESET_PASSWORD dans les 24 heures précédentes (no_email_before = t). Ce drapeau est la signature de la CVE : l'attaquant n'a jamais déclenché l'e-mail. |
| Q3 | Réinitialisations de credentials et opérations execute-actions via l'API d'administration, pour exclure la voie administrative. |