
Il 13 agosto 2024, l'MSTC (Microsoft Security Response Center) ha reso nota CVE-2024-38063, una vulnerabilità critica nello stack TCP/IP di Windows che può essere sfruttata per compromettere le funzioni di rete vitali del sistema operativo. I partecipanti all'OPSWAT Graduate Fellowship Program forniscono un esame approfondito dei dettagli tecnici di questa falla e del suo potenziale impatto, nonché delle strategie di mitigazione consigliate per questa vulnerabilità.
Partecipanti al programma di borse di studio OPSWAT : Pham Ngoc Thien - Università Ho Chi Minh di Tecnologia dell'Informazione
Panoramica
CVE-2024-38063 è una vulnerabilità critica dello stack TCP/IP di Windows con un punteggio CVSS 9,8, che riguarda l'elaborazione dei pacchetti IPv6. Gli aggressori remoti possono sfruttare questa vulnerabilità utilizzando un integer underflow durante la gestione delle intestazioni di estensione IPv6 per eseguire codice dannoso o causare un DoS (Denial of Service).
Poiché IPv6 è abilitato per impostazione predefinita sulla maggior parte dei sistemi moderni, questa falla zero-click rappresenta un rischio sostanziale. Di conseguenza, tutte le versioni non patchate di Windows 10, Windows 11 e Windows Server 2008, 2012, 2016, 2019 e 2022 con IPv6 abilitato sono vulnerabili a questa CVE.
Concetti chiave
Stack TCP/IP di Windows
Lo stack TCP/IP di Windows è un componente fondamentale del sistema operativo responsabile della comunicazione di rete tramite la suite Transmission Control Protocol/Internet Protocol (TCP/IP). Gestisce tutte le interazioni di rete, facilitando la comunicazione tra dispositivi su reti locali e globali.
IPv6 e intestazioni di estensione
L'IPv6 è stato sviluppato per risolvere i limiti dell'IPv4. Ha introdotto vari miglioramenti, come la modularità e la flessibilità attraverso le intestazioni di estensione. Le intestazioni, posizionate tra l'intestazione IPv6 e il payload, supportano dati opzionali e funzionalità avanzate.
Le principali intestazioni di estensione IPv6 includono:
- Opzioni hop-by-hop (intestazione successiva = 0)
- Testata di instradamento (testata successiva = 43)
- Intestazione del frammento (Intestazione successiva = 44)
- Intestazione delle opzioni di destinazione (intestazione successiva = 60)
- Intestazione di autenticazione (AH) (Intestazione successiva = 51)
- Encapsulating Security Payload (ESP) (intestazione successiva = 50)
Ogni intestazione di estensione punta alla successiva tramite il campo Next Header, creando una catena sequenziale. Questa modularità introduce complessità nel processo di gestione dei pacchetti e potenziali vettori di sfruttamento.
Underflow di un intero
Un underflow di numeri interi si verifica quando un calcolo produce un valore inferiore al valore minimo rappresentabile per un tipo di dati. Ad esempio, la sottrazione di un valore più grande da uno più piccolo in un intero senza segno può far sì che il risultato diventi un valore positivo molto grande.
Un integer overflow si verifica quando il valore supera il limite massimo del tipo di dati e "trabocca" al valore minimo rappresentabile (ad esempio, 0 in un intervallo 0-10). Entrambi gli scenari si verificano a causa di un'errata gestione delle condizioni al contorno nelle operazioni aritmetiche, con conseguenti gravi vulnerabilità nei sistemi software.
Analisi delle vulnerabilità
Il flusso di lavoro dell'elaborazione IPv6
Dopo aver ricevuto un pacchetto IPv6, Windows analizza innanzitutto l'intestazione IPv6. Quindi, la funzione IppReceiveHeaderBatch controlla il valore del campo Next Header per scegliere il gestore appropriato per le intestazioni successive. Per ogni intestazione di estensione nella catena, IppReceiveHeaderBatch invoca la routine corrispondente per elaborare quella specifica intestazione.
Nonostante il design flessibile e modulare di questo meccanismo, esso introduce un potenziale vettore di attacco. In IPv6, i pacchetti frammentati vengono tipicamente riassemblati a destinazione, dove esiste una vulnerabilità nel processo di riassemblaggio dei frammenti e nella gestione delle intestazioni.
Un aggressore può indurre una cattiva gestione della memoria e innescare un buffer overflow inviando numerosi pacchetti malformati con intestazioni di estensione manipolate. Ciò consente ai dati in eccesso di sovrascrivere regioni di memoria non previste, permettendo potenzialmente l'esecuzione di codice arbitrario. Questa vulnerabilità è identificata come CVE-2024-38063.
Falla critica nello stack TCP/IP di Windows
La patch di Microsoft per risolvere la vulnerabilità CVE-2024-38063 è stata esaminata a fondo dal ricercatore di sicurezza Marcus Hutchins. Il suo blog tecnico offre una visione dettagliata della causa di questa vulnerabilità. Sulla base delle sue scoperte, il nostro collega ha esplorato ulteriormente il problema per comprendere a fondo l'exploit.
Analisi delle patch
La patch includeva un aggiornamento del file tcpip.sys, compresa una modifica della funzione Ipv6pProcessOptions. Una modifica di una sola riga ha sostituito una chiamata a IppSendErrorList() con una chiamata a IppSendError(), indicando che IppSendErrorList() potrebbe aver contribuito alla CVE.
Dimensione pacchetto zero
Un esame più attento della funzione IppSendErrorList() ha rivelato che essa elabora un elenco collegato di pacchetti invocando la funzione IppSendError() per ciascuno di essi. La funzione IppSendError() assegna ai pacchetti difettosi lo stato STATUS_DATA_NOT_ACCEPTED. Quindi, crea un messaggio di errore ICMP contenente informazioni sul pacchetto problematico e lo invia indietro. Tuttavia, quando IppSendErrorList() viene invocata con always_send_icmp = true su più pacchetti, imposta il campo packet_size a zero per ogni pacchetto.
La funzione Ipv6pProcessOptions è progettata per elaborare le intestazioni di estensione contenenti campi di valore delle opzioni, comprese le intestazioni Hop-by-Hop Options e Destination Options. Impostando il Tipo di opzione su un valore qualsiasi superiore a 0x80, un utente malintenzionato può innescare un errore specifico nell'elaborazione dell'intestazione delle opzioni, forzando l'impostazione di always_send_icmp su true e di conseguenza azzerando la dimensione del pacchetto.
Mentre un pacchetto di dimensione zero viene solitamente scartato, un aggressore può manipolare il campo Next Header del pacchetto IPv6 originale. Questa manipolazione consente agli aggressori di ottenere il controllo sull'interpretazione del pacchetto nelle fasi di elaborazione successive, evitando il rifiuto immediato e creando un'opportunità di sfruttamento.
Underflow di un intero nell'elaborazione dei frammenti
Impostando il campo Next Header a 44, che indica un'intestazione di frammento, un pacchetto viene gestito dalle routine di frammentazione o riassemblaggio di IPv6. Quando il pacchetto raggiunge il parser dei frammenti, Ipv6pReceiveFragment(), specifica che:
- La dimensione del pacchetto è zero.
- L'intestazione del frammento indica che rimangono altri dati da elaborare.
Nella funzione Ipv6pReceiveFragment(), la dimensione di allocazione per fragment_size viene calcolata sottraendo 0x30 (lunghezza dell'intestazione del pacchetto) dalla dimensione del pacchetto senza alcuna convalida. Se la dimensione del pacchetto è zero, questa sottrazione è insufficiente e risulta in un valore di 16 bit di grandi dimensioni (circa 0xFFD0 o 65488), causando l'elaborazione da parte del parser di una memoria eccessiva al di fuori dei confini validi del pacchetto e portando alla corruzione della memoria.
Dall'underflow all'overflow e al disallineamento dell'allocazione
La funzione Ipv6pReassemblyTimeout() è responsabile della pulizia dei frammenti IPv6 incompleti dopo un tempo specificato, utilizzando l'aritmetica a 16 bit per determinare le dimensioni del buffer e le operazioni di copia. A causa dell'underflow nel passaggio precedente, in cui la packet_length o la fragment_size diventano 0xFFD0, si verifica un overflow durante l'allocazione.
Il calcolo risultante causa l'azzeramento del registro, portando all'allocazione di soli 48 byte di memoria. Tuttavia, poiché la quantità di dati copiati (65.488 byte da riassemblaggio->payload) non corrisponde alla memoria allocata, si verifica un buffer overflow controllabile nel pool del kernel.
Questa discrepanza consente agli aggressori di eseguire codice dannoso tramite un pacchetto appositamente creato che sfrutta la vulnerabilità nell'elaborazione di IPv6.
CVE-2024-38963 Prova di concetto
Nel tentativo di riprodurre la vulnerabilità CVE-2024-38963, i nostri colleghi hanno creato una serie di pacchetti malformati progettati per sfruttare la falla. Il processo seguito è stato il seguente:
1. Creazione di pacchetti IPv6 malformati
Inserire un'intestazione di estensione delle opzioni di destinazione IPv6 (tipo 60) dopo l'intestazione IPv6 di base, quindi incorporare un'opzione non valida (ad esempio, il tipo di opzione 0x81).
Questa manipolazione forza il kernel di Windows (tcpip.sys) a impostare always_send_icmp = true, innescando la generazione di errori ICMPv6 tramite la routine IppSendErrorList().
2. Forzare l'elaborazione dell'elenco dei buffer di rete (NBL)
L'inondazione del bersaglio con rapide raffiche di questi pacchetti malformati aumentava le possibilità che il kernel raggruppasse più pacchetti in un'unica Net-Buffer List (NBL). Quando due o più pacchetti vengono raggruppati, il ciclo vulnerabile IppSendErrorList() si attiva, azzerando in modo errato i metadati DataLength e Offset nei frammenti successivi (la dimensione del pacchetto è ora zero).
3. Iniettare pacchetti IPv6 frammentati
In seguito alla trasmissione di pacchetti malformati, vengono inviati pacchetti IPv6 frammentati che includono intestazioni di estensione Fragment. Questi frammenti vengono elaborati utilizzando i valori DataLength già corrotti.
4. Sfruttare il timeout di riassemblaggio
Il kernel trattiene i frammenti per 60 secondi (gestiti da Ipv6pReassemblyTimeout) per consentire il riassemblaggio dei pacchetti. Durante questo timeout, i valori corrotti di DataLength innescano un underflow di numeri interi in Ipv6pReceiveFragment, con il risultato di una dimensione del frammento calcolata in modo errato (eccessivamente grande).
5. L'innesco dell'overflow del buffer Heap
Il kernel alloca un buffer heap sulla base dei valori underflow. Durante il processo di riassemblaggio vengono eseguiti due calcoli diversi: uno determina la dimensione dell'allocazione della memoria (che, a causa di un overflow di 16 bit, diventa troppo piccola) e l'altro calcola la lunghezza della copia utilizzando il valore grande, in underflow.
Questa mancata corrispondenza porta a una scrittura fuori dai limiti, causando un buffer overflow basato su heap che può essere sfruttato per innescare un Denial-of-Service (DoS) o un'esecuzione di codice remoto.
Il codice sorgente utilizzato per riprodurre questo CVE per un attacco Denial-of-Service:
Quando questa vulnerabilità viene sfruttata da un aggressore, il sistema della vittima può bloccarsi immediatamente, causando una schermata blu della morte:
Bonifica
Trascurare di aggiornare regolarmente il sistema operativo espone il dispositivo a minacce alla sicurezza, comprese quelle legate alle CVE (Common Vulnerabilities and Exposures). Per ridurre questi rischi, MetaDefender Endpoint™ offre una solida protezione rilevando la versione del sistema operativo e verificando la presenza di vulnerabilità, comprese le CVE note, come CVE-2024-38063.
MetaDefender Endpoint è progettato per proteggere i dispositivi all'interno di reti IT/OT critiche dalle minacce provenienti da periferiche e supporti rimovibili. Assicura che il sistema operativo e le applicazioni installate siano aggiornate, segnala eventuali versioni obsolete o vulnerabili ed elenca le applicazioni con vulnerabilità note e CVE, insieme alle correzioni consigliate. Inoltre, aiuta a proteggere i dispositivi dai rischi legati ai supporti rimovibili, bloccando l'accesso alle unità USB fino a quando non vengono scansionate e trovate pulite utilizzando diversi motori anti-malware ed eseguendo Deep CDR™ su oltre 180 tipi di file.
Rivolgetevi oggi stesso a uno dei nostri esperti per scoprire come MetaDefender Endpoint può trasformare la vostra posizione di sicurezza con un'intelligence leader del settore.