
Proof-of-concept per CVE-2022-22978, che dimostra il bypass dell'autorizzazione in RegexRequestMatcher di Spring Security tramite iniezione CRLF, con un'applicazione demo e un'analisi della correzione.
Secondo le informazioni che ho raccolto, questa è una vulnerabilità relativa alla classe RegexRequestMatcher nel framework Spring Security. Nello specifico, le applicazioni che usano RegexRequestMatcher con un’espressione regolare contenente un punto (.) possono essere bypassate usando i caratteri \r(%0a) e \n(%0d); pertanto gli attaccanti senza autenticazione possono accedere a percorsi non autorizzati.
Versioni del framework Spring Security affette dalla vulnerabilità:
5.5.x precedenti a 5.5.75.6.x precedenti a 5.6.4Dobbiamo accedere al codice sorgente di Spring Security per analizzare staticamente questa vulnerabilità. Nello specifico, ho usato la funzione di confronto dei commit tra le versioni 5.6.3 (vulnerabile) e 5.6.4 (corretta) su Github. Vedi il seguente link: Comparing 5.6.3...5.6.4 · spring-projects/spring-security (github.com)

Ho esaminato le modifiche nella classe RegexRequestMatcher. Si può notare che nella versione 5.6.4 questa classe usa Pattern.DOTALL invece del default . come nella versione 5.6.3.
Dove:
Pattern è una delle tre classi nel pacchetto java.util.regex, usata per elaborare le espressioni regolari.Pattern.DOTALL: quando si usa questo flag, "." nell’espressione regolare corrisponde a tutti i caratteri, inclusi i caratteri di nuova riga come \n , \r.Pattern.CASE_INSENSITIVE: non fa distinzione tra maiuscole e minuscole.
Per impostazione predefinita, il punto . in un’espressione regolare corrisponde a tutti i caratteri tranne i caratteri di nuova riga come \n, \r. Se una funzione regex valida il pattern di una stringa, non corrisponderà se nella stringa sono presenti caratteri di nuova riga. Per evitare ciò, si può usare il flag Pattern.DOTALL.
Tuttavia, se qualcuno usa intenzionalmente %0d invece di \n o %0a invece di \r, la regex precedente non corrisponderà comunque. Pertanto, nella versione 5.6.4, è stato aggiunto un controllo per questo caso in RegexRequestMatcherTests.java. Specificamente, converte %0d e %0a rispettivamente in \n e \r prima di controllare con la regex.

Passo 1: Creare un’applicazione web Spring Boot usando Spring Initializr con le due dipendenze Spring Security e Spring Web.

Passo 2: Creare un Controller che stampi il testo This is a CVE-2022-22978 demo quando viene fatta una richiesta al percorso /admin/*.

Passo 3: Impostare un meccanismo di autenticazione per ogni accesso al percorso /admin/<qualsiasi> usando regexMatchers("/admin/.*").authenticated(). Questa è la vulnerabilità sfruttata dagli attaccanti per visualizzare il contenuto delle pagine /admin/<qualsiasi> senza autenticazione.

Passo 4: Nel file di configurazione, dichiarare la versione di Spring Security che contiene la vulnerabilità. Qui scelgo la versione 5.6.3.

Passo 5: Eseguire l’applicazione con il comando gradlew bootRun, il programma usa per impostazione predefinita Apache Tomcat in ascolto sulla porta 8080. Accedere al percorso /admin/xyz (qualsiasi percorso purché inizi con /admin/).

Il risultato restituisce il codice 403 Forbidden, il che significa che non è possibile accedere perché non autenticati.
A questo punto, sfruttando la vulnerabilità della funzione regexMatchers in Spring Security (versione 5.6.3) poiché non corrisponde ai caratteri di nuova riga come \r(%0d) e \n(%0a), possiamo accedere al percorso sopra senza autenticazione usando il payload /admin/%0dxyz.

Analogamente con il payload /admin/%0axyz.

Così abbiamo sfruttato con successo la vulnerabilità CVE-2022-22978 con un payload molto semplice.
Aggiornare la versione di Spring Security a:
5.5.7+5.6.4+5.7+Demo: Usare la versione corretta, nello specifico 5.7.1.

Provare ad attaccare il web con lo stesso payload di prima: /admin/%0dxyz.

A questo punto, l’app non restituisce la risposta desiderata dall’attaccante.
git clone https://github.com/ducluongtran9121/CVE-2022-22978-PoC.git
cd CVE-2022-22978-PoC
gradlew bootRun
Java 18
Gradle 7.4.1