0-Tage-Linux-IPv6-Stack-Schwachstelle, die einen Remote-Kernel-Absturz ermöglicht

Es wurden Informationen über eine ungepatchte (0-Tage-)Schwachstelle (CVE-2023-2156) im Linux-Kernel veröffentlicht, die es ermöglicht, das System durch das Senden speziell gestalteter IPv6-Pakete (Packet-of-Death) zu stoppen. Das Problem tritt nur auf, wenn die Unterstützung für das RPL-Protokoll (Routing Protocol for Low-Power and Lossy Networks) aktiviert ist, das in Distributionen standardmäßig deaktiviert ist und hauptsächlich auf eingebetteten Geräten verwendet wird, die in drahtlosen Netzwerken mit hohem Paketverlust betrieben werden.

Die Sicherheitslücke wird durch eine fehlerhafte Verarbeitung externer Daten im Parsing-Code des RPL-Protokolls verursacht, was zu einem Assert-Fehler und einem Panikzustand des Kernels führt. Beim Platzieren von Daten, die als Ergebnis des Parsens des IPv6-RPL-Paket-Headers erhalten wurden, in der Struktur k_buff (Socket Buffer) wird, wenn das CmprI-Feld auf 15, das Segleft-Feld auf 1 und CmprE auf 0 gesetzt ist, der 48-Byte-Vektor mit Adressen auf 528 Bytes entpackt und es entsteht eine Situation, in der der für den Puffer zugewiesene Speicher nicht ausreicht. In diesem Fall löst die Funktion skb_push, die zum Schieben der Daten in die Struktur verwendet wird, eine Prüfung auf unverhältnismäßige Größe der Daten und des Puffers aus und erzeugt einen Panikzustand, um ein Überschreiben des Puffers zu verhindern.

Exploit-Beispiel: # Wir verwenden Scapy, um das Paket aus scapy.all zu erstellen. Import * Import-Socket. # Verwenden Sie IPv6 von Ihrer LAN-Schnittstelle. DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR. # Wir verwenden Sockets, um das Paket zu senden RPL-Paket # Adressen enthält 6 Adressen, aber da CmprI 3 ist, # wird jedes Oktett der ersten beiden Adressen als komprimierte Adresse behandelt # Segleft = 3, um die Verstärkung auszulösen # lastentry = 15xf1 setzt CmprI auf 0 und CmprE auf 0 p = IPv15(src=SRC_ADDR, dst=DST_ADDR) / IPv0ExtHdrSegmentRouting( Typ=6, Adressen=[ "a6::", "a3::", "a8::"], segleft=7, lastentry=6xf1) # Send this evil packet 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 letzten 15 Monaten dreimal versuchten, das Problem durch die Veröffentlichung von Patches im September 2022, Oktober 2022 und April 2023 zu beheben, aber jedes Mal reichten die Korrekturen nicht aus und die Schwachstelle konnte reproduziert werden. Letztendlich beschloss das ZDI-Projekt, das die Arbeiten zur Beseitigung der Schwachstelle koordinierte, detaillierte Informationen über die Schwachstelle offenzulegen, ohne darauf zu warten, dass ein funktionierender Patch im Kernel erscheint.

Somit ist die Schwachstelle noch nicht behoben. Das Einbinden des im 6.4-rc2-Kernel enthaltenen Patches ist nicht wirksam. Benutzern wird empfohlen, zu überprüfen, ob das RPL-Protokoll auf ihren Systemen nicht verwendet wird. Dies kann mit dem Befehl sysctl -a | erfolgen grep -i rpl_seg_enabled

Source: opennet.ru

Kommentar hinzufügen