
Busca rastros de explotación de CVE-2026-18963 (toma de control de cuenta no autenticada en Keycloak) en la base de datos de Keycloak.
Un script psql que busca en una base de datos PostgreSQL de Keycloak rastros de explotación de CVE-2026-18963 (toma de control de cuentas sin autenticación mediante el flujo de restablecimiento de credenciales).
Publicado por KYOS. Lo escribimos mientras parcheábamos las implementaciones de Keycloak que operamos, para verificar que nadie hubiera sufrido una toma de control durante la ventana de exposición.
CVE-2026-18963 es una falla en el flujo de restablecimiento de credenciales de keycloak-services (keycloak#51833). Un atacante no autenticado puede completar el proceso de restablecimiento de contraseña de cualquier usuario sin hacer clic en el enlace de verificación por correo y, a continuación, establecer una nueva contraseña en la cuenta. No se requiere interacción del usuario.
Gravedad: Crítica, CVSS v3.1 9.1 (AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N), según Red Hat y NVD. La causa raíz es una validación deficiente del estado en el flujo de autenticación, corregida en .
| Rama | Corregida en |
|---|---|
| 26.7.x | 26.7.2 (notas de la versión) |
| 26.6.x | 26.6.6 |
| 26.4.x (LTS) | 26.4.15 |
| 26.8 | 26.8.0 |
Todo lo que esté por debajo de esas versiones en las ramas compatibles es vulnerable. Las versiones fuera de soporte (26.5.x, 26.3 y anteriores) no reciben corrección: considere que está expuesto y actualice a una rama corregida. Red Hat indica que el RH-SSO 7 heredado no está afectado; el Red Hat Build de Keycloak 26.4/26.6 está corregido en 26.4.15-1 / 26.6.6-1.
Desactivar el restablecimiento de contraseña de autoservicio elimina el punto de entrada vulnerable: Consola de administración > Configuración del realm > Inicio de sesión > “Olvidé mi contraseña” desactivado, para cada realm. Mediante la API de administración: PUT /admin/realms/{realm} con {"resetPasswordAllowed": false}.
Esto bloquea el endpoint login-actions/reset-credentials, pero también impide que los usuarios legítimos restablezcan su propia contraseña, así que trátelo como una medida provisional hasta que actualice. Tenga en cuenta que Red Hat no enumera una mitigación respaldada para este CVE; el parche es la única solución real.
cve-2026-18963-keycloak-hunt.sql ejecuta cuatro consultas de solo lectura:
| Consulta | Qué encuentra |
|---|---|
| Q0 | Si el realm almacena eventos de inicio de sesión/administración en absoluto, y su TTL. Si los eventos están desactivados o caducados, los resultados vacíos en Q2/Q3 no prueban nada. |
| Q1 | Cada credencial de contraseña establecida dentro de la ventana de exposición (credential.created_date). Esto es la toma de control en sí y funciona incluso si el registro de eventos estaba desactivado. |
| Q2 | Eventos de inicio de sesión de restablecimiento/credenciales, marcando cualquier restablecimiento completado sin SEND_RESET_PASSWORD en las 24 h anteriores (no_email_before = t). Ese marcador es la firma del CVE: el atacante nunca activó el correo. |
| Q3 | Restablecimientos de credenciales y operaciones execute-actions mediante la API de administración, para descartar la vía impulsada por el administrador. |
# defaults: realm 'master', window since 2026-06-01
psql -U keycloak -d keycloak -f cve-2026-18963-keycloak-hunt.sql
# explicit realm and window (run once per realm, quote values exactly like this)
psql -U keycloak -d keycloak \
-v realm="'myrealm'" -v since="'2026-05-01'" \
-f cve-2026-18963-keycloak-hunt.sql
Establezca since justo antes de que su versión vulnerable entrara en producción. En Kubernetes:
kubectl exec -it my-postgres-pod -- \
psql -U keycloak -d keycloak -v realm="'myrealm'" -v since="'2026-05-01'" \
-f - < cve-2026-18963-keycloak-hunt.sql
Las filas de Q1 no son automáticamente compromisos. Compare cada una con una causa legítima conocida (restablecimiento de autoservicio, acción del servicio de soporte, nuevo registro) y trate cualquier cosa no explicada como candidata a toma de control.
Las filas de Q2 con no_email_before = t en RESET_PASSWORD, UPDATE_CREDENTIAL o UPDATE_PASSWORD son el indicador más fuerte de que este CVE ha sido explotado. Correlacione la columna ip_address con sus registros de acceso.
Compruebe Q0 primero: los eventos de inicio de sesión caducan (events_expiration) y pueden estar completamente desactivados. Q1 no caduca, por lo que es la comprobación más fiable.
MIT, consulte LICENSE. Se proporciona tal cual, sin garantía.