
Proof-of-concept e analisi per CVE-2021-20323, una vulnerabilità XSS riflessa nell'endpoint clients-registrations di Keycloak, con condizioni di sfruttamento, raccomandazioni di mitigazione e link agli advisory ufficiali.
Keycloak prima della versione 18.0.0 e dopo la 10.0.0 contiene una XSS riflessa sull'endpoint clients-registrations. Il bug viene attivato fornendo, tramite POST, una struttura JSON con una chiave come nome del parametro che non è supportata dall'endpoint. La risposta riflette la chiave JSON in un messaggio di errore e con header impostato come Content-Type: text/html. Se eseguito in un browser, il codice HTML dalla chiave JSON viene interpretato, consentendo di eseguire codice JavaScript. Non è richiesta autenticazione e il bug colpisce tutti i realm disponibili.
Attualmente, poiché il bug richiede Content-Type: application/json e viene inviato tramite POST, non esiste un vettore comune per sfruttarlo che abbia un impatto sull'utente.
Questo repository fornisce un POC per CVE-2021-20323 e raccomandazioni per la correzione/attenuazione.
Il bug è molto facile da attivare.
curl -v -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: application/json" -d "{\"\":1}"
È anche possibile attivarlo con il provider openid-connect.
curl -v -X POST {BaseURL}/realms/master/clients-registrations/openid-connect -H "Content-type: application/json" -d "{\"\":1}"
Nota: Nelle versioni più vecchie di Keycloak (quelle in esecuzione con wildfly invece di quarkus) il percorso di base usa /auth/realms/* invece di /realms/*
Come possiamo vedere da diverse fonti qui o qui, non è comunemente possibile sfruttare una XSS POST riflessa che richiede Content-Type: application/json per essere vulnerabile. L'unico caso in cui potrebbe accadere è se la policy CORS fosse stata manualmente allentata rispetto al default per consentire richieste cross-origin. Questo scenario è ragionevole solo in casi d'uso molto specifici, creati per motivi funzionali dal proprietario dell'applicazione. Per essere sfruttabile in tal caso, l'attaccante dovrebbe avere il controllo del dominio/server consentito nella policy CORS o avere una XSS su questo secondo dominio che potrebbe essere usato come relay.
Con CVE-2021-20323, Keycloak non accetta POST con Content-Type di multipart/form-data o application/x-www-form-urlencoded, che sono gli unici due tipi consentiti in un normale invio di form. Questo rende CVE-2021-20323 sfruttabile solo se CORS lo consente esplicitamente.
# 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"}
Aggiornare a Keycloak 18.0.0 o successivo.
Nessuna versione corretta nota per RedHat Single Sign-On, che è una versione ricompilata di Keycloak da RedHat.
clients-registrationsclients-registrations, in modo simile a questo post sul blog di KeycloakLicenza MIT © [ndmalc]