
Keycloak antes da versão 18.0.0 e após a 10.0.0 contém um XSS refletido no endpoint clients-registrations. O bug é acionado ao fornecer, via POST, uma estrutura json com uma chave como nome de parâmetro que não é suportada pelo endpoint. A resposta reflete a chave json em uma mensagem de erro e com o cabeçalho definido como Content-Type: text/html. Quando executado em um navegador, o código html da chave json é interpretado, permitindo acionar código JavaScript. Não é necessária autenticação e o bug afeta todos os realms disponíveis.
Atualmente, devido ao bug exigir Content-Type: application/json e ser submetido via POST, não há um caminho comum de exploração que tenha impacto no usuário.
Este repositório fornece um POC para o CVE-2021-20323 e recomendações de remediação/mitigação.
O bug é muito fácil de acionar.
curl -v -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: application/json" -d "{\"\":1}"
Também é possível acioná-lo com o provedor openid-connect.
curl -v -X POST {BaseURL}/realms/master/clients-registrations/openid-connect -H "Content-type: application/json" -d "{\"\":1}"
Nota: Em versões mais antigas do Keycloak (as que executam com wildfly em vez de quarkus), o caminho base usa /auth/realms/* em vez de /realms/*
Como podemos ver em várias fontes aqui ou aqui, normalmente não é possível explorar um XSS POST refletido que exija Content-Type: application/json para ser vulnerável. O único caso em que isso poderia acontecer é se a política de CORS fosse manualmente afrouxada do padrão para permitir solicitações entre origens. Esse cenário só é razoável de se assumir em casos de uso muito específicos, criados por razões funcionais pelo proprietário do aplicativo. Para ser explorável nesse caso, o atacante precisaria estar no controle do domínio/servidor permitido na política de CORS ou ter um XSS nesse segundo domínio que pudesse ser usado como retransmissor.
Com o CVE-2021-20323, o Keycloak não aceita POST com Content-Type de multipart/form-data ou application/x-www-form-urlencoded, que são os únicos dois tipos permitidos em um envio básico de form. Isso torna o CVE-2021-20323 explorável apenas se o CORS permitir explicitamente.
# 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"}
Atualize para o Keycloak 18.0.0 ou posterior.
Não há versão corrigida conhecida para o RedHat Single Sign-On, que é uma versão reempacotada do Keycloak pela RedHat.
clients-registrationsclients-registrations, de forma semelhante a esta publicação no blog do KeycloakLicença MIT © [ndmalc]