
Keycloak до версии 18.0.0 и после 10.0.0 содержит отражённую XSS-уязвимость в конечной точке clients-registrations. Ошибка срабатывает при отправке через POST JSON-структуры с ключом в качестве имени параметра, который не поддерживается конечной точкой. В ответе JSON-ключ отражается в сообщении об ошибке, а заголовок устанавливается как Content-Type: text/html. При выполнении в браузере HTML-код из JSON-ключа интерпретируется, что позволяет запустить JavaScript-код. Аутентификация не требуется, и уязвимость затрагивает все доступные realm.
В настоящее время, поскольку уязвимость требует Content-Type: application/json и отправляется через POST, не существует распространённого пути эксплуатации, который оказывал бы воздействие на пользователя.
Этот репозиторий предоставляет POC для CVE-2021-20323, а также рекомендации по устранению и смягчению уязвимости.
Уязвимость очень легко воспроизвести.
curl -v -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: application/json" -d "{\"\":1}"
Также её можно воспроизвести с помощью провайдера openid-connect.
curl -v -X POST {BaseURL}/realms/master/clients-registrations/openid-connect -H "Content-type: application/json" -d "{\"\":1}"
Примечание: в более старых версиях Keycloak (работающих на wildfly вместо quarkus) базовый путь использует /auth/realms/* вместо /realms/*
Как видно из нескольких источников здесь или здесь, обычно невозможно эксплуатировать отражённый POST XSS, который требует Content-Type: application/json. Единственный случай, когда это возможно, — если политика CORS была вручную ослаблена по сравнению со значением по умолчанию для разрешения кросс-доменных запросов. Предполагать такой сценарий разумно только в очень специфических случаях, созданных владельцем приложения по функциональным причинам. Чтобы в таком случае уязвимость была эксплуатируемой, атакующий должен либо контролировать домен/сервер, разрешённый в политике CORS, либо иметь XSS на этом втором домене, который можно использовать в качестве ретранслятора.
В случае CVE-2021-20323 Keycloak не принимает POST с Content-Type типа multipart/form-data или application/x-www-form-urlencoded — единственными двумя типами, допустимыми в обычной отправке form. Это делает CVE-2021-20323 эксплуатируемой только в том случае, если CORS явно это разрешает.
# 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"}
Обновитесь до Keycloak 18.0.0 или более поздней версии.
Не существует известной исправленной версии для RedHat Single Sign-On, который является переупакованной версией Keycloak от RedHat.
clients-registrationsclients-registrations, аналогично этой записи в блоге KeycloakЛицензия MIT © [ndmalc]