Arresto QUIC: una vulnerabilità DoS nei server Windows con SMB su QUIC
Analisi riassuntiva
Ben Barnea, ricercatore di Akamai, ha scoperto un'importante vulnerabilità in Microsoft Windows Server 2022, a cui è stato assegnato il codice CVE-2023-24898 con un punteggio base di 7,5.
La vulnerabilità risiede in un controllo mancante nell'allocazione di un buffer nel driver srvnet.sys.
La vulnerabilità potrebbe condurre ad attacchi DoS (Denial-of-Service) contro i sistemi Windows Server 2022. La vulnerabilità può essere sfruttata senza autenticazione dai criminali tramite Internet.
Sono vulnerabili solo i server che utilizzano SMB su QUIC, una funzione relativamente nuova. Per attivare questa funzione, è necessario utilizzare Windows Server 2022 Azure Edition.
Le vulnerabilità sono state segnalate in modo responsabile a Microsoft e descritte nella Patch Tuesday di maggio 2023.
Forniamo una query di Insight per consentire agli utenti di Akamai Guardicore Segmentation di rilevare i server potenzialmente vulnerabili nelle loro reti.
Introduzione
QUIC è un protocollo del livello di trasporto relativamente nuovo che è stato originariamente progettato da Google, ma presenta varie implementazioni. Lo scopo di QUIC è quello di fornire una connessione più affidabile e sicura, superando anche i comuni problemi di Internet, come la latenza e la perdita di pacchetti. Viene trasmesso tramite UDP.
L'implementazione di QUIC offerta da Microsoft viene denominata MsQuic. QUIC è integrato anche in Windows, in cui viene utilizzato come livello di trasporto per il protocollo SMB (una funzione denominata SMB su QUIC) e con HTTP/3 in IIS. La funzione SMB su QUIC è disponibile solo nell' edizione Windows Server 2022 Azure, mentre il protocollo HTTP/3 è disponibile per tutte le implementazioni IIS eseguite in Windows Server 2022.
La vulnerabilità discussa in questo blog si trova nel driver che implementa il livello di trasporto del protocollo SMB, denominato srvnet.sys.
La vulnerabilità
Per mantenere uno stato di connessione, QUIC utilizza un identificatore dedicato, che identifica in modo univoco una connessione esistente tra un client e un server. Un client può creare diverse connessioni contemporaneamente. Una connessione QUIC è anche multiplex, ossia il client e il server possono scambiarsi dati tramite più flussi simultaneamente utilizzando la stessa connessione.
Il codice per la funzione SMB su QUIC viene implementato in srvnet.sys. Quando il server riceve nuovi dati su un flusso, viene richiamata la funzione SrvNetQuicServerReceiveEvent . Lo scopo della funzione è leggere un intero messaggio SMB inviato dal client. Una volta eseguita questa operazione, il messaggio viene trasferito all'elenco dei messaggi SMB per un'ulteriore elaborazione.
Per leggere un messaggio SMB, il codice prima tenta di leggere le dimensioni del messaggio SMB, che sono rappresentate da un numero intero a quattro byte. Se l'operazione viene eseguita con esito positivo, il codice controlla che le dimensioni non superino il massimo valore consentito per un'assegnazione. Se il controllo viene superato, il codice assegna un buffer con le dimensioni specificate e tenta di leggere i byte rimanenti dal pacchetto nel buffer appena assegnato. Una volta completata la lettura dell'intero messaggio SMB, il codice indica al livello SMB che è stato ricevuto un nuovo messaggio SMB.
La struttura di un messaggio SMB è illustrata nella figura 1.
La vulnerabilità si verifica se per il messaggio SMB vengono ricevuti meno di quattro byte (figura 2). In questo caso, il codice salva gli X byte ricevuti e imposta PendingMessageSize su 4 meno X, dove X è il numero dei byte ricevuti per le dimensioni del messaggio. Alla successiva ricezione di un pacchetto, il codice legge i rimanenti 4 - X byte necessari per le dimensioni del messaggio SMB.
Dopo aver terminato la lettura delle dimensioni del messaggio, il codice assegna immediatamente un messaggio SMB senza eseguire una verifica delle dimensioni rispetto al massimo valore consentito. Pertanto, inviando le dimensioni del messaggio SMB in due pacchetti anziché in un pacchetto, un criminale può evitare la verifica del massimo valore consentito e richiedere un'assegnazione per dimensioni molto grandi.
Sfruttamento
Per trasformare questo bug in una vulnerabilità DoS, è necessario inviare continuamente pacchetti in grado di attivare il problema descritto.
Tuttavia, anche evitando la verifica del massimo valore consentito, esistono comunque due restrizioni:
1. SrvNetAllocateBuffer presenta un limite massimo di 16 MB per le assegnazioni.
2. Il numero delle connessioni non autenticate consentite simultaneamente è limitato dalla RAM disponibile sul server. Questa restrizioni limita lo sfruttamento dei server con una RAM massima di 32 GB (nella prossima sezione, vedremo come sia possibile bypassare questa limitazione).
Per sfruttare questa vulnerabilità, abbiamo prima tentato di creare più connessioni e di inviare ogni volta due pacchetti per far assegnare al server 16 MB. La ripetizione di questo processo porta all'esaurimento della memoria. Poiché questa vulnerabilità si trova in un driver e viene eseguita in modalità kernel, l'intero sistema diventa instabile e non disponibile.
Uno sfruttamento ottimizzato?
Questo tipo di sfruttamento richiede l'invio di molti pacchetti. Si ritiene che abusando delle funzioni di QUIC sia possibile ridurre il numero di pacchetti necessari.
Anche se QUIC consente di eseguire più flussi su una singola connessione, limita questo numero tramite la proprietà initial_max_streams_bidi . La funzione SMB su QUIC limita a uno il numero di flussi simultanei per una connessione.
Anche se non possiamo migliorare lo sfruttamento utilizzando più flussi simultanei , possiamo tentare di sfruttare la vulnerabilità in un altro modo. Invece di creare più flussi simultanei, proviamo a creare un pacchetto QUIC con più periodi per far verificare la seguente sequenza in modo seriale e ripetutamente:
1. Creare un flusso
2. Attivare l'assegnazione di 16 MB inviando due periodi di dati
3. Chiudere il flusso
In tal modo, possiamo anche bypassare il limite di connessioni non autenticate. Lasciamo al lettore la possibilità di cimentarsi in questa sfida.
Rilevamento e mitigazione
Per individuare un server con SMB su QUIC, gli utenti con Akamai Guardicore Segmentation possono eseguire una semplice query di Insight, come riportato di seguito:
select * from registry where
path="HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters\EnableSMBQUIC" and data=1
Si consiglia di applicare una patch al computer Windows Server in uso poiché non ci sono altre soluzioni alternative o mitigazioni disponibili per questa vulnerabilità, ad eccezione della disattivazione della funzione SMB su QUIC.
Riepilogo
QUIC è un protocollo di rete relativamente nuovo che garantisce migliori performance e una latenza ridotta. Pertanto, ovviamente, è stato già adottato e incorporato in due protocolli molto importanti: l'IIS (per HTTP/3) e l'SMB.
Riteniamo che QUIC costituisca una nuova superficie di attacco molto allettante, non solo in Windows. Oltre al problema descritto in questa sede, un'altra vulnerabilità, a cui è stato assegnato il codice CVE-2023-23392, è stata risolta in HTTP/3.
Incoraggiamo altri ricercatori ad esaminare diversi componenti che utilizzano MsQuic e ad analizzare lo stesso MsQuic.