
La 13 august 2024, MSTC (Microsoft Security Response Center) a dezvăluit CVE-2024-38063, o vulnerabilitate critică în stiva Windows TCP/IP care poate fi exploatată pentru a pune în pericol funcții vitale de rețea în cadrul sistemului de operare. Aici, participanții la programul de burse pentru absolvenți OPSWAT oferă o examinare aprofundată a detaliilor tehnice și a impactului potențial al acestei erori, precum și strategii de atenuare recomandate pentru această vulnerabilitate.
Participanții la programul de burse OPSWAT : Pham Ngoc Thien - Universitatea Ho Chi Minh de Tehnologie a Informației
Prezentare generală
CVE-2024-38063 este o vulnerabilitate critică a stivei TCP/IP Windows cu un scor CVSS de 9,8, care afectează procesarea pachetelor IPv6. Atacatorii de la distanță pot exploata această vulnerabilitate folosind un integer underflow la manipularea antetelor de extensie IPv6 pentru a executa coduri malițioase sau pentru a provoca un DoS (Denial of Service).
Deoarece IPv6 este activat în mod implicit pe majoritatea sistemelor moderne, acest defect zero-click reprezintă un risc substanțial. Ca urmare, toate versiunile neacoperite ale Windows 10, Windows 11 și Windows Server 2008, 2012, 2016, 2019 și 2022 cu IPv6 activat sunt vulnerabile la acest CVE.
Concepte cheie
Stiva TCP/IP Windows
Stiva Windows TCP/IP este o componentă fundamentală a sistemului de operare, responsabilă de comunicarea în rețea prin intermediul suitei Transmission Control Protocol/Internet Protocol (TCP/IP). Aceasta gestionează toate interacțiunile de rețea, facilitând comunicarea între dispozitive prin rețele locale și globale.
IPv6 și antetele de extensie
IPv6 a fost dezvoltat pentru a aborda limitările IPv4. Acesta a introdus diverse îmbunătățiri, cum ar fi modularitatea și flexibilitatea prin intermediul antetelor de extensie. Antetele, poziționate între antetul IPv6 și sarcina utilă, acceptă date opționale și caracteristici avansate.
Principalele antete de extensie IPv6 includ:
- Opțiuni Hop-by-Hop (antetul următor = 0)
- Antetul de rutare (Antetul următor = 43)
- Antetul fragmentului (Antetul următor = 44)
- Antetul opțiunilor de destinație (Antetul următor = 60)
- Antetul de autentificare (AH) (Antetul următor = 51)
- Sarcina utilă de securitate încapsulată (ESP) (Antetul următor = 50)
Fiecare antet de extensie trimite la următorul prin intermediul câmpului Next Header, creând un lanț secvențial. Această modularitate introduce complexitate în procesul de manipulare a pachetelor și potențiali vectori de exploatare.
Curgere inferioară a numărului întreg
O curgere inferioară a unui număr întreg apare atunci când un calcul produce o valoare mai mică decât valoarea minimă reprezentabilă pentru un tip de date. De exemplu, scăderea unei valori mai mari dintr-o valoare mai mică la un număr întreg fără semn poate face ca rezultatul să devină o valoare pozitivă foarte mare.
O depășire a numărului întreg are loc atunci când valoarea depășește limita maximă a tipului de date și se "revarsă" înapoi la valoarea minimă reprezentabilă (de exemplu, 0 într-un interval 0-10). Ambele scenarii se produc din cauza manipulării necorespunzătoare a condițiilor limită în operațiile aritmetice, ceea ce conduce la vulnerabilități grave în sistemele software.
Analiza vulnerabilității
Fluxul de lucru al procesării IPv6
După primirea unui pachet IPv6, Windows analizează mai întâi antetul IPv6. Apoi, funcția IppReceiveHeaderBatch verifică valoarea câmpului Next Header pentru a alege gestionarul adecvat pentru antetele următoare. Pentru fiecare antet de extensie din lanț, IppReceiveHeaderBatch invocă rutina corespunzătoare pentru a procesa antetul respectiv.
În ciuda concepției flexibile și modulare a acestui mecanism, el introduce un potențial vector de atac. În IPv6, pachetele fragmentate sunt de obicei reasamblate la destinație, unde există o vulnerabilitate în procesul de reasamblare a fragmentelor și în gestionarea antetului.
Un atacator poate induce o gestionare greșită a memoriei și poate declanșa o depășire a bufferului prin trimiterea a numeroase pachete malformate cu antete de extensie manipulate. Acest lucru permite ca datele în exces să suprascrie regiuni de memorie neintenționate, ceea ce poate permite executarea de cod arbitrar. Această vulnerabilitate este identificată drept CVE-2024-38063.
Eroare critică în stiva TCP/IP Windows
Patch-ul Microsoft pentru remedierea vulnerabilității CVE-2024-38063 a fost examinat în detaliu de către cercetătorul în securitate Marcus Hutchins. Blogul său tehnic oferă informații detaliate cu privire la cauza principală a acestei vulnerabilități. Pe baza constatărilor sale, colegul nostru a explorat în continuare problema pentru a obține o înțelegere aprofundată a exploatării.
Analiza patch-urilor
Patch-ul a inclus o actualizare a fișierului tcpip.sys, inclusiv o modificare în cadrul funcției Ipv6pProcessOptions. O modificare pe o singură linie a înlocuit un apel de la IppSendErrorList() cu un apel la IppSendError(), indicând că IppSendErrorList() ar fi putut contribui la CVE.
Dimensiune zero a pachetului
O examinare mai atentă a funcției IppSendErrorList() a arătat că aceasta procesează o listă legată de pachete prin invocarea funcției IppSendError() pentru fiecare. Funcția IppSendError() atribuie pachetelor defectuoase statutul STATUS_DATA_NOT_ACCEPTED. Apoi, creează un mesaj de eroare ICMP care conține informații despre pachetul problematic și îl trimite înapoi. Cu toate acestea, atunci când funcția IppSendErrorList() este invocată cu always_send_icmp = true pe mai multe pachete, aceasta stabilește câmpul packet_size la zero pentru fiecare pachet.
Funcția Ipv6pProcessOptions este concepută pentru a procesa antetele de extensie care conțin câmpuri cu valoare de opțiune, inclusiv antetele Hop-by-Hop Options și Destination Options. Prin setarea Option Type la orice valoare mai mare decât 0x80, un atacator poate declanșa o eroare specifică în procesarea antetului opțiunilor, forțând setarea always_send_icmp la true și, în consecință, ducând la setarea dimensiunii pachetului la zero.
În timp ce un pachet de dimensiune zero este de obicei respins, un atacator poate manipula câmpul Next Header din pachetul IPv6 original. Această manipulare permite atacatorilor să obțină controlul asupra modului de interpretare a pachetului în etapele ulterioare de prelucrare, evitând respingerea imediată și creând o oportunitate de exploatare.
Depășirea inferioară a numărului întreg în procesarea fragmentelor
Prin setarea câmpului Next Header la 44, indicând un Fragment Header, un pachet este tratat de rutinele de fragmentare sau reasamblare IPv6. Atunci când pachetul ajunge la analizorul de fragmente, Ipv6pReceiveFragment(), acesta specifică că:
- Dimensiunea pachetului este zero.
- Antetul fragmentului indică faptul că rămân date suplimentare de prelucrat.
În funcția Ipv6pReceiveFragment(), dimensiunea alocării pentru fragment_size este calculată prin scăderea 0x30 (lungimea antetului pachetului) din dimensiunea pachetului fără nicio validare. În cazul în care dimensiunea pachetului este zero, această scădere este insuficientă, rezultând o valoare mare pe 16 biți (în jur de 0xFFD0 sau 65488), determinând analizorul să proceseze o memorie excesivă în afara limitelor valide ale pachetului și ducând la coruperea memoriei.
De la insuficiență la depășire și nepotrivire în alocare
Funcția Ipv6pReassemblyTimeout() este responsabilă de curățarea fragmentelor IPv6 incomplete după un timp specificat, utilizând aritmetica pe 16 biți pentru a determina dimensiunile tamponului și operațiunile de copiere. Din cauza debitului insuficient din etapa anterioară, când packet_length sau fragment_size devin 0xFFD0, se produce o depășire în timpul alocării.
Calculul rezultat face ca registrul să fie resetat la zero, ceea ce duce la alocarea a numai 48 de octeți de memorie. Cu toate acestea, deoarece cantitatea de date copiate (65 488 de octeți din reasamblare->payload) nu corespunde memoriei alocate, se produce o depășire controlabilă a bufferului în bazinul kernelului.
Această discrepanță permite atacatorilor să execute coduri malițioase prin intermediul unui pachet special creat care exploatează vulnerabilitatea în procesarea IPv6.
CVE-2024-38963 Proof of Concept
În încercarea de a reproduce vulnerabilitatea CVE-2024-38963, colegii noștri au creat o serie de pachete malformate menite să exploateze deficiența. Procesul pe care l-au urmat a fost următorul:
1. Crearea pachetelor IPv6 malformate
Introduceți un antet de extensie IPv6 Destination Options (tip 60) după antetul IPv6 de bază, apoi încorporați o opțiune invalidă (de exemplu, tipul de opțiune 0x81).
Această manipulare forțează nucleul Windows (tcpip.sys) să seteze always_send_icmp = true, declanșând generarea de erori ICMPv6 prin rutina IppSendErrorList().
2. Prelucrarea forțată a listei de buffer net (NBL)
Inundarea țintei cu rafale rapide de astfel de pachete malformate a crescut șansele ca nucleul să grupeze mai multe pachete într-o singură Net-Buffer List (NBL). Atunci când două sau mai multe pachete sunt grupate, bucla vulnerabilă IppSendErrorList() se activează, resetarea incorectă a metadatelor DataLength și Offset în fragmentele ulterioare (dimensiunea pachetului este acum zero).
3. Injectarea pachetelor IPv6 fragmentate
În urma transmiterii pachetelor malformate, sunt trimise pachete IPv6 fragmentate care includ antete de extensie Fragment. Aceste fragmente sunt prelucrate utilizând valorile DataLength deja corupte.
4. Exploatarea timeout-ului de reasamblare
Nucleul reține fragmentele timp de 60 de secunde (gestionat de Ipv6pReassemblyTimeout) pentru a permite reasamblarea pachetelor. În timpul acestui timp de așteptare, valorile DataLength corupte declanșează o subdimensionare a numărului întreg în Ipv6pReceiveFragment, rezultând o dimensiune a fragmentului calculată incorect (excesiv de mare).
5. Declanșarea Heap Buffer Overflow
Nucleul alocă un buffer heap pe baza valorilor subdepășite. În timpul procesului de reasamblare au loc două calcule diferite: unul determină dimensiunea alocării memoriei (care, din cauza unei depășiri a limitei de 16 biți, devine prea mică), iar celălalt calculează lungimea copierii folosind valoarea mare, care nu a fost depășită.
Această neconcordanță duce la o scriere în afara limitelor, cauzând o depășire a bufferului bazat pe heap care poate fi exploatată pentru a declanșa o negare de serviciu (DoS) sau o execuție de cod la distanță.
Codul sursă utilizat pentru a reproduce acest CVE pentru un atac de tip Denial-of-Service:
Atunci când această vulnerabilitate este exploatată de un atacator, sistemul victimei se poate bloca imediat, rezultând un ecran albastru al morții:
Remediere
Neglijarea actualizării regulate a sistemului de operare expune dispozitivul dvs. la amenințări de securitate, inclusiv la cele legate de CVE (Vulnerabilități și expuneri comune). Pentru a reduce aceste riscuri, MetaDefender Endpoint™ oferă o protecție solidă prin detectarea versiunii sistemului de operare și verificarea vulnerabilităților, inclusiv a CVE-urilor cunoscute, cum ar fi CVE-2024-38063.
MetaDefender Endpoint este conceput pentru a proteja dispozitivele din interiorul rețelelor critice IT/OT de amenințările periferice și ale mediilor amovibile. Se asigură că sistemul de operare și aplicațiile instalate sunt actualizate, semnalează orice versiune depășită sau vulnerabilă și listează aplicațiile cu vulnerabilități cunoscute și CVE, împreună cu soluțiile recomandate. De asemenea, ajută la protejarea dispozitivelor împotriva riscurilor legate de mediile amovibile prin blocarea accesului la unitățile USB până când sunt scanate și găsite curate cu ajutorul mai multor motoare anti-malware, efectuând în același timp Deep CDR™ pe mai mult de 180 de tipuri de fișiere.
Discutați astăzi cu unul dintre experții noștri pentru a vedea cum MetaDefender Endpoint vă poate transforma postura de securitate cu informații de vârf din industrie.