
Exploit proof-of-concept per CVE-2026-18963, un bypass dell'autenticazione nel flusso di recupero password di Keycloak, che consente di reimpostare la password senza una verifica adeguata. Include una modalità di prova non distruttiva.
Prova di concetto per CVE-2026-18963, una vulnerabilità nel flusso di "Password dimenticata" / selezione delle credenziali di Keycloak che consente a un attaccante di raggiungere il passaggio UPDATE_PASSWORD — e reimpostare la password di un account target — senza completare correttamente la verifica dell'identità richiesta (ad esempio senza un OTP/fattore secondario valido).
Lo script gestisce il flusso esclusivamente via HTTP (senza browser/Selenium) mediante:
tryAnotherWay.startSessionPolling() utilizzato dall'interfaccia di Keycloak per mantenere attiva la sessione di autenticazione.UPDATE_PASSWORD.Questo strumento è fornito esclusivamente per test di sicurezza e ricerca autorizzati (test di penetrazione che sei incaricato di eseguire, CTF, ambienti di laboratorio propri o divulgazione coordinata di vulnerabilità). Eseguirlo su sistemi che non possiedi o per i quali non hai un'autorizzazione scritta esplicita a testare è illegale. L'autore e i collaboratori non si assumono alcuna responsabilità per usi impropri o danni causati da questo strumento.
Usa --stop-at-update-password per produrre una prova non distruttiva (raggiungere UPDATE_PASSWORD senza inviare una nuova password) quando questo è sufficiente a dimostrare il problema.
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 di base dell'istanza Keycloak target |
--realm | master | Realm target |
--client-id | account | ID client OIDC utilizzato per avviare il flusso di login |
--username | admin | Nome utente target |
--new-password | (required) | Password da impostare per l'account target |
--stop-at-update-password | off | Ferma quando viene raggiunto UPDATE_PASSWORD, senza inviare una nuova password (prova non offensiva) |
--timeout | 10.0 | Timeout delle richieste HTTP in secondi |
--output-dir | debug_http | Directory in cui viene salvata ogni risposta HTML intermedia per il debug |
--insecure | off | Disabilita la verifica del certificato 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
Ogni risposta HTTP intermedia viene salvata in --output-dir (debug_http di default) come 01_login.html, 02_reset.html, ... per una revisione offline. Lo script termina con 0 in caso di successo e 1 in caso di errore, stampando messaggi di avanzamento e diagnostici su stdout.
Aurélien LOIE