
2024. augusztus 13-án az MSTC (Microsoft Security Response Center) nyilvánosságra hozta a CVE-2024-38063 kódot, amely egy kritikus sebezhetőséget jelent a Windows TCP/IP stackben, amely kihasználva veszélyeztetheti az operációs rendszer létfontosságú hálózati funkcióit. Itt az OPSWAT Graduate Fellowship Program résztvevői alaposan megvizsgálják a hiba technikai részleteit és potenciális hatásait, valamint a sebezhetőségre ajánlott elhárítási stratégiákat.
OPSWAT ösztöndíjprogram résztvevői: Pham Ngoc Thien - Ho Si Minh-völgyi Informatikai Egyetem
Áttekintés
A CVE-2024-38063 egy 9,8-as CVSS pontszámmal rendelkező kritikus sebezhetőség a Windows TCP/IP stackben, amely az IPv6 csomagok feldolgozását érinti. Távoli támadók kihasználhatják ezt a sebezhetőséget egy egész szám alulcsordulással az IPv6 kiterjesztési fejlécek kezelésénél rosszindulatú kód futtatására vagy DoS (Denial of Service) okozására.
Mivel az IPv6 alapértelmezés szerint engedélyezett a legtöbb modern rendszeren, ez a nulladik kattintás hibája jelentős kockázatot jelent. Ennek eredményeképpen a Windows 10, a Windows 11, valamint a Windows Server 2008, 2012, 2016, 2019 és 2022 összes nem javított, IPv6-ot engedélyező verziója sebezhető ezzel a CVE-vel szemben.
Kulcsfogalmak
Windows TCP/IP stack
A Windows TCP/IP stack egy alapvető operációs rendszerelem, amely a TCP/IP (Transmission Control Protocol/Internet Protocol) csomagon keresztül történő hálózati kommunikációért felelős. Ez kezeli az összes hálózati interakciót, megkönnyítve az eszközök közötti kommunikációt a helyi és globális hálózatokon keresztül.
IPv6 és bővítményfejlécek
Az IPv6-ot az IPv4 korlátainak kezelésére fejlesztették ki. Különböző fejlesztéseket vezetett be, például a modularitást és a rugalmasságot a kiterjesztő fejlécek révén. A fejlécek, amelyek az IPv6 fejléc és a hasznos teher között helyezkednek el, támogatják az opcionális adatokat és a fejlett funkciókat.
A legfontosabb IPv6 kiterjesztés fejlécek a következők:
- Hop-by-Hop beállítások (Következő fejléc = 0)
- Útválasztási fejléc (Következő fejléc = 43)
- Töredékfejléc (Következő fejléc = 44)
- Célállomás opciók fejléc (Következő fejléc = 60)
- Hitelesítési fejléc (AH) (Következő fejléc = 51)
- Encapsulating Security Payload (ESP) (Következő fejléc = 50)
Minden bővítményfejléc a következőre mutat a Következő fejléc mezőn keresztül, így létrehozva egy szekvenciális láncot. Ez a modularitás bonyolítja a csomagkezelési folyamatot és potenciális kihasználási vektorokat eredményez.
Egész szám alulcsordulás
Egész szám alulcsordulás akkor következik be, amikor egy számítás kisebb értéket eredményez, mint az adattípus minimális ábrázolható értéke. Például egy nagyobb érték kivonása egy kisebb értékből egy előjel nélküli egész számra azt eredményezheti, hogy az eredmény egy nagyon nagy pozitív érték lesz.
Egész szám túlcsordulás akkor következik be, amikor az érték túllépi az adattípus maximális határértékét, és "túlcsordul" vissza a legkisebb ábrázolható értékre (pl. 0 egy 0-10-es tartományban). Mindkét forgatókönyv a határfeltételek nem megfelelő kezelése miatt következik be az aritmetikai műveletekben, ami súlyos sebezhetőségekhez vezet a szoftverrendszerekben.
Sebezhetőségi elemzés
Az IPv6-feldolgozás munkafolyamata
Egy IPv6-csomag fogadása után a Windows először elemzi az IPv6-fejlécet. Ezután az IppReceiveHeaderBatch függvény ellenőrzi a Next Header mező értékét, hogy kiválassza a megfelelő kezelőt a következő fejlécekhez. Az IppReceiveHeaderBatch a lánc minden egyes bővítményfejlécéhez meghívja a megfelelő rutint az adott fejléc feldolgozásához.
A mechanizmus rugalmas és moduláris felépítése ellenére ez egy potenciális támadási vektort vezet be. Az IPv6-ban a töredezett csomagokat jellemzően a célállomáson rakják össze újra, ahol a töredékek újbóli összerakásának folyamatában és a fejléc kezelésében van sebezhetőség.
A támadó számos manipulált kiterjesztési fejléccel ellátott, rosszul formázott csomag elküldésével memóriakezelési hibát idézhet elő, és puffer túlcsordulást idézhet elő. Ez lehetővé teszi, hogy a felesleges adatok nem kívánt memóriarégiókat írjanak felül, ami potenciálisan tetszőleges kód futtatását teszi lehetővé. Ezt a sebezhetőséget CVE-2024-38063 néven azonosították.
Kritikus hiba a Windows TCP/IP stackben
A Microsoft által a CVE-2024-38063 sebezhetőséget orvosló javítást Marcus Hutchins biztonsági kutató alaposan megvizsgálta. Technikai blogjában részletes betekintést nyújt a sebezhetőség kiváltó okába. Az ő eredményeire építve munkatársunk tovább vizsgálta a problémát, hogy alaposan megértse a kihasználást.
Foltelemzés
A javítás a tcpip.sys fájl frissítését tartalmazta, beleértve az Ipv6pProcessOptions függvényen belüli módosítást. Az egysoros módosítás az IppSendErrorList() hívását az IppSendError() hívására cserélte, ami arra utal, hogy az IppSendErrorList() hozzájárulhatott a CVE-hez.
Nulla csomagméret
Az IppSendErrorList() függvény közelebbi vizsgálata során kiderült, hogy a csomagok összekapcsolt listáját dolgozza fel az IppSendError() függvény meghívásával. Az IppSendError() függvény a hibás csomagoknak a STATUS_DATA_NOT_ACCEPTED állapotot adja. Ezután létrehoz egy ICMP hibaüzenetet, amely tartalmazza a problémás csomagra vonatkozó információkat, és visszaküldi azt. Ha azonban az IppSendErrorList() függvényt több csomagra vonatkozóan always_send_icmp = true értékkel hívjuk meg, a packet_size mezőt minden csomag esetében nullára állítja.
Az Ipv6pProcessOptions függvényt az opciós értékmezőket tartalmazó kiterjesztési fejlécek feldolgozására tervezték, beleértve a Hop-by-Hop Options és a Destination Options fejléceket is. Az Option Type 0x80-nál nagyobb értékre állításával a támadó speciális hibát idézhet elő az options header feldolgozásában, ami az always_send_icmp true értékre állítását kényszeríti, és ennek következtében a csomag mérete nullára lesz állítva.
Míg a nulla méretű csomagot általában elvetik, a támadó manipulálhatja az eredeti IPv6-csomag Next Header mezőjét. Ez a manipuláció lehetővé teszi a támadók számára, hogy irányítást szerezzenek a csomag értelmezése felett a későbbi feldolgozási szakaszokban, elkerülve az azonnali elutasítást és lehetőséget teremtve a kihasználásra.
Egész számok alulcsordulása töredékfeldolgozásban
A következő fejléc mező 44-re állításával, ami töredezett fejlécet jelez, a csomagot az IPv6 töredezettségi vagy újraszerelési rutinjai kezelik. Amikor a csomag eléri az Ipv6pReceiveFragment() töredékelemzőt, akkor azt adja meg, hogy:
- A csomag mérete nulla.
- A töredékfejléc jelzi, hogy további adatok feldolgozására van szükség.
Az Ipv6pReceiveFragment() függvényben a fragment_size kiosztási mérete úgy kerül kiszámításra, hogy a 0x30 (a csomagfejléc hossza) levonásra kerül a csomag méretéből, mindenféle érvényesítés nélkül. Ha a csomag mérete nulla, akkor ez a kivonás alulcsúszik, ami egy nagy 16 bites értéket eredményez (körülbelül 0xFFD0 vagy 65488), ami azt eredményezi, hogy az elemző a csomag érvényes határain kívül túlzottan nagy memóriát dolgoz fel, ami memóriakárosodáshoz vezet.
Az alulcsordulástól a túlcsordulásig és a kiosztási hibákig
Az Ipv6pReassemblyTimeout() függvény felelős a hiányos IPv6 fragmentumok eltakarításáért egy megadott idő után, 16 bites aritmetikát használva a puffer méretének és a másolási műveletek meghatározásához. Az előző lépésben bekövetkezett alulcsordulás miatt, amikor a packet_length vagy a fragment_size 0xFFD0 lesz, túlcsordulás következik be a kiosztás során.
Az eredményül kapott számítás hatására a regiszter nullázódik, ami mindössze 48 bájt memória kiosztását eredményezi. Mivel azonban az átmásolt adatmennyiség (65 488 bájt a reassembly->payload-ból) nem felel meg a kiosztott memóriának, a kernel poolban szabályozható puffer túlcsordulás következik be.
Ez az eltérés lehetőséget ad a támadóknak arra, hogy rosszindulatú kódot hajtsanak végre egy speciálisan kialakított csomagon keresztül, amely kihasználja az IPv6-feldolgozás sebezhetőségét.
CVE-2024-38963 Proof of Concept
A CVE-2024-38963 sebezhetőség reprodukálására tett kísérletük során munkatársaink egy sor rosszul formált csomagot állítottak össze a hiba kihasználására. Az általuk követett folyamat a következő volt:
1. Hibás IPv6 csomagok előállítása
Szúrjon be egy IPv6 Destination Options kiterjesztett fejlécet (60-as típus) az alap IPv6 fejléc után, majd ágyazzon be egy érvénytelen opciót (pl. 0x81 típusú opciót).
Ez a manipuláció arra kényszeríti a Windows kernelt (tcpip.sys), hogy az always_send_icmp = true értéket állítsa be, ami az IppSendErrorList() rutin segítségével ICMPv6 hiba generálását váltja ki.
2. A hálózati pufferlista (NBL) feldolgozásának kikényszerítése
A célpontot elárasztva a rosszul formázott csomagok gyors sorozatával megnőtt az esélye annak, hogy a kernel több csomagot egyetlen Net-Buffer Listába (NBL) csoportosít. Amikor két vagy több csomagot csoportosítanak, a sebezhető IppSendErrorList() ciklus aktiválódik, és helytelenül visszaállítja a DataLength és Offset metaadatokat a következő fragmentumokban (a csomag mérete most nulla).
3. Töredezett IPv6 csomagok bejuttatása
A hibásan formázott csomagok továbbítását követően töredezett IPv6-csomagok kerülnek elküldésre, amelyek töredezettségi kiterjesztés fejlécet tartalmaznak. Ezeket a töredékeket a már elrontott DataLength értékek felhasználásával dolgozzák fel.
4. Az újraösszeszerelési időkorlát kihasználása
A kernel 60 másodpercig tartja vissza a töredékeket (az Ipv6pReassemblyTimeout által kezelt), hogy lehetővé tegye a csomagok újbóli összerakását. Ezen időkorlát alatt a sérült DataLength értékek egész számok alulcsordulását váltják ki az Ipv6pReceiveFragmentben, ami helytelenül kiszámított (túl nagy) fragmentumméretet eredményez.
5. A Heap-puffer túlcsordulás kiváltása
A kernel egy heap-puffert rendel ki az alulcsordult értékek alapján. Az újraszerkesztési folyamat során két különböző számítás történik: az egyik a memória kiosztásának méretét határozza meg (amely a 16 bites túlcsordulás miatt túl kicsi lesz), a másik pedig a másolás hosszát számítja ki a nagy, alulcsordult érték felhasználásával.
Ez az eltérés határok nélküli íráshoz vezet, ami egy halom alapú puffer túlcsordulást okoz, amely kihasználható a szolgáltatásmegtagadás (DoS) vagy távoli kódvégrehajtás kiváltására.
A CVE reprodukálásához használt forráskód egy Denial-of-Service támadáshoz:
Ha ezt a sebezhetőséget egy támadó kihasználja, az áldozat rendszere azonnal összeomolhat, ami a halál kék képernyőjét eredményezi:
Helyreállítás
Ha elmulasztja az operációs rendszer rendszeres frissítését, az eszköze ki van téve a biztonsági fenyegetéseknek, beleértve a CVE-khez (közös sebezhetőségek és veszélyforrások) kapcsolódó veszélyeket is. E kockázatok csökkentése érdekében a MetaDefender Endpoint™ megbízható védelmet nyújt az operációs rendszer verziójának észlelésével és a sebezhetőségek ellenőrzésével, beleértve az ismert CVE-ket, például a CVE-2024-38063-at.
MetaDefender Endpoint a kritikus IT/OT hálózatokon belüli eszközök védelmére szolgál a perifériás és cserélhető adathordozók fenyegetéseitől. Biztosítja az operációs rendszer és a telepített alkalmazások naprakészségét, jelzi az elavult vagy sebezhető verziókat, és felsorolja az ismert sebezhetőségekkel és CVE-kkel rendelkező alkalmazásokat az ajánlott javításokkal együtt. Segít továbbá megvédeni az eszközöket a cserélhető adathordozókkal kapcsolatos kockázatoktól azáltal, hogy blokkolja az USB való hozzáférést mindaddig, amíg több rosszindulatú szoftverek elleni motorral nem vizsgálják meg és nem találják tisztának, miközben több mint 180 fájltípuson mély CDR™-t végez.
Beszéljen még ma szakértőnkkel, hogy megtudja, hogyan alakíthatja át MetaDefender Endpoint az Ön biztonsági helyzetét az iparág vezető intelligenciájával.