
Prueba de concepto y análisis para CVE-2021-20323, una vulnerabilidad de XSS reflejado en el endpoint clients-registrations de Keycloak, con condiciones de explotación, recomendaciones de mitigación y enlaces a avisos oficiales.
Keycloak anterior a 18.0.0 y posterior a 10.0.0 contiene un XSS reflejado en el endpoint de registros de clientes. El error se desencadena al proporcionar, mediante POST, una estructura JSON con una clave como nombre de parámetro que no es compatible con el endpoint. La respuesta refleja la clave JSON en un mensaje de error y con la cabecera establecida como Content-Type: text/html. Cuando se ejecuta en un navegador, el código HTML de la clave JSON se interpreta, lo que permite ejecutar código JavaScript. No se requiere autenticación y el error afecta a todos los reinos disponibles.
Actualmente, debido a que el error requiere Content-Type: application/json y se envía mediante un POST, no existe una ruta común de explotación que tenga un impacto en el usuario.
Este repositorio proporciona un POC para CVE-2021-20323 y recomendaciones de remediación/mitigación.
El error es muy fácil de desencadenar.
curl -v -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: application/json" -d "{\"\":1}"
También es posible desencadenarlo con el proveedor openid-connect.
curl -v -X POST {BaseURL}/realms/master/clients-registrations/openid-connect -H "Content-type: application/json" -d "{\"\":1}"
Nota: En versiones antiguas de Keycloak (las que funcionan con wildfly en lugar de quarkus) la ruta base usa /auth/realms/* en lugar de /realms/*
Como podemos ver en múltiples fuentes aquí o aquí, no es comúnmente posible explotar un XSS POST reflejado que requiera Content-Type: application/json. El único caso en que podría ocurrir es si la política CORS se hubiera relajado manualmente del valor predeterminado para permitir solicitudes de origen cruzado. Este escenario solo es razonable suponer en casos de uso muy específicos, por razones funcionales establecidas por el propietario de la aplicación. Para que sea explotable en tal caso, el atacante debería tener el control del dominio/servidor permitido en la política CORS o tener un XSS en ese segundo dominio que pueda usarse como relevo.
Con CVE-2021-20323, Keycloak no acepta POST con Content-Type de multipart/form-data o application/x-www-form-urlencoded, que son los únicos dos tipos permitidos en un envío básico de formulario. Esto hace que CVE-2021-20323 solo sea explotable si CORS lo permite explícitamente.
# curl -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: multipart/form-data" -d "{\"\":1}"
{"error":"RESTEASY003065: Cannot consume content type"}
# curl -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: application/x-www-form-urlencoded" -d "{\"\":1}"
{"error":"RESTEASY003065: Cannot consume content type"}
Actualice a Keycloak 18.0.0 o posterior.
No hay una versión corregida conocida para RedHat Single Sign-On, que es una versión reempaquetada de Keycloak por RedHat.
clients-registrationsclients-registrations, similar a esta entrada de blog de KeycloakLicencia MIT © [ndmalc]