
Proof-of-Concept und Analyse für CVE-2021-20323, eine reflektierte XSS-Schwachstelle im clients-registrations-Endpunkt von Keycloak, mit Ausnutzungsbedingungen, Abhilfemaßnahmen und Links zu offiziellen Sicherheitshinweisen.
Keycloak vor Version 18.0.0 und nach 10.0.0 enthält eine reflektierte XSS im clients-registrations-Endpunkt. Der Fehler wird ausgelöst, indem per POST eine JSON-Struktur mit einem Schlüssel als Parameter-Namen übermittelt wird, der vom Endpunkt nicht unterstützt wird. Die Antwort spiegelt den JSON-Schlüssel in einer Fehlermeldung wider, wobei der Header als Content-Type: text/html gesetzt ist. Bei Ausführung in einem Browser wird der HTML-Code aus dem JSON-Schlüssel interpretiert, sodass JavaScript-Code ausgelöst werden kann. Es ist keine Authentifizierung erforderlich, und der Fehler wirkt sich auf alle verfügbaren Realms aus.
Derzeit gibt es aufgrund der Anforderung des Fehlers, dass Content-Type: application/json erforderlich ist und der Fehler per POST übermittelt wird, keinen gängigen Weg zur Ausnutzung, der eine Auswirkung auf den Benutzer hat.
Dieses Repository bietet einen POC für CVE-2021-20323 sowie Empfehlungen zur Behebung/Minderung.
Der Fehler ist sehr einfach auszulösen.
curl -v -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: application/json" -d "{\"\":1}"
Es ist auch möglich, ihn mit dem -Anbieter auszulösen.
openid-connectcurl -v -X POST {BaseURL}/realms/master/clients-registrations/openid-connect -H "Content-type: application/json" -d "{\"\":1}"
Hinweis: Bei älteren Keycloak-Versionen (die mit Wildfly statt Quarkus laufen) verwendet der Basispfad /auth/realms/* anstelle von /realms/*
Wie wir in mehreren Quellen hier oder hier sehen können, ist es im Allgemeinen nicht möglich, eine reflektierte POST-XSS auszunutzen, die Content-Type: application/json erfordert, um angreifbar zu sein. Der einzige Fall, in dem dies passieren könnte, ist, wenn die CORS-Richtlinie manuell von der Standardeinstellung gelockert wurde, um Cross-Origin-Anfragen zu erlauben. Dieses Szenario ist nur in sehr spezifischen Anwendungsfällen vernünftig anzunehmen, die vom Anwendungsbesitzer aus funktionalen Gründen eingerichtet wurden. Um in einem solchen Fall ausnutzbar zu sein, müsste der Angreifer entweder die Kontrolle über die in der CORS-Richtlinie erlaubte Domain/Server haben oder eine XSS auf dieser zweiten Domain haben, die als Relay verwendet werden könnte.
Bei CVE-2021-20323 akzeptiert Keycloak keine POST-Anfragen mit Content-Type von multipart/form-data oder application/x-www-form-urlencoded, den einzigen beiden Typen, die in einem einfachen form-Submit erlaubt sind. Dies macht CVE-2021-20323 nur dann ausnutzbar, wenn CORS es explizit erlaubt.
# 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"}
Aktualisieren Sie auf Keycloak 18.0.0 oder höher.
Keine bekannte behobene Version für RedHat Single Sign-On, eine von RedHat neu verpackte Version von Keycloak.
clients-registrations zu verbieten.clients-registrations zu beschränken, ähnlich wie in diesem Keycloak-Blogbeitrag.MIT License © [ndmalc]