
18.0.0 이전 및 10.0.0 이후의 Keycloak에는 clients-registrations 엔드포인트에 반사형 XSS 취약점이 있습니다. 이 버그는 POST로 엔드포인트가 지원하지 않는 키를 매개변수 이름으로 포함하는 JSON 구조를 제공할 때 트리거됩니다. 응답은 오류 메시지에서 JSON 키를 반사하며 헤더가 Content-Type: text/html로 설정됩니다. 브라우저에서 실행되면 JSON 키의 HTML 코드가 해석되어 JavaScript 코드를 실행할 수 있습니다. 인증은 필요하지 않으며 이 버그는 모든 사용 가능한 realm에 영향을 미칩니다.
현재 이 버그는 Content-Type: application/json을 요구하고 POST를 통해 제출되므로 사용자에게 영향을 주는 일반적인 공격 경로는 없습니다.
이 저장소는 CVE-2021-20323에 대한 POC와 수정/완화 권장 사항을 제공합니다.
이 버그는 매우 쉽게 트리거할 수 있습니다.
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 버전(quarkus 대신 wildfly로 실행되는 버전)에서는 기본 경로가 /realms/* 대신 /auth/realms/*를 사용합니다.
여러 소스 여기 또는 여기에서 볼 수 있듯이, Content-Type: application/json을 요구하는 반사형 POST XSS를 악용하는 것은 일반적으로 불가능합니다. 발생할 수 있는 유일한 경우는 CORS 정책이 기본값에서 수동으로 완화되어 교차 출처 요청을 허용하는 경우입니다. 이 시나리오는 애플리케이션 소유자가 기능상의 이유로 특정 사용 사례에서만 합리적으로 가정할 수 있습니다. 그러한 경우 악용하려면 공격자는 CORS 정책에서 허용된 도메인/서버를 제어하거나 릴레이로 사용할 수 있는 두 번째 도메인에서 XSS를 보유해야 합니다.
CVE-2021-20323의 경우 Keycloak은 기본 form 제출에서 허용되는 유일한 두 가지 유형인 multipart/form-data 또는 application/x-www-form-urlencoded의 Content-Type을 가진 POST를 수락하지 않습니다. 따라서 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이 Keycloak을 재패키징한 RedHat Single Sign-On에 대해서는 알려진 수정 버전이 없습니다.
clients-registrations에 대한 모든 호출을 금지하도록 리버스 프록시를 구성합니다.clients-registrations에 대한 액세스를 제한합니다.MIT License © [ndmalc]