Atacuri cibernetice bazate pe IA: Cum să detectați, să preveniți și să vă apărați împotriva amenințărilor inteligente

Citește acum
Utilizăm inteligența artificială pentru traducerile site-urilor și, deși ne străduim să fim exacți, este posibil ca acestea să nu fie întotdeauna 100% precise. Apreciem înțelegerea dumneavoastră.

Remedierea vulnerabilității CVE-2024-0517 în Google Chrome

Powered by MetaDefender Endpoint
de OPSWAT
Împărtășește această postare
Fotografia participanților la programul de burse OPSWAT , Hoai Nam Do și Minh Quan Le
Participanții la programul de burse OPSWAT

Despre CVE-2024-0517

CVE-2024-0517 este o vulnerabilitate de scriere în afara limitelor în motorul JavaScript V8 din Google Chrome înainte de versiunea 120.0.6099.224, care permite atacatorilor de la distanță să exploateze corupția heap printr-o pagină HTML creată. Vulnerabilitatea a fost raportată pentru prima dată de Toan (Suto) Pham de la Qrious Secure. 

Captură de ecran care arată un scor de bază de severitate CVSS 3.x de 8,8 (ridicat) cu o descriere detaliată a vectorului din NVD
CVE-2024-0517 în baza națională de date privind vulnerabilitățile (NVD)

Această vulnerabilitate provine din confuzia de tip, care apare atunci când o aplicație alocă sau inițializează o resursă, cum ar fi un pointer, un obiect sau o variabilă, folosind un tip, dar ulterior accesează acea resursă folosind un tip care este incompatibil cu tipul inițial (CWE-843). În acest CVE, confuzia de tip este declanșată în timpul unui proces de alocare a memoriei numit alocare pliată, care este utilizat pentru optimizarea memoriei de către Maglev, un compilator optimizator pentru motorul JavaScript V8. 

Exploatând confuzia de tip și scriind coduri shell arbitrare prin WebAssembly, un atacator poate executa comenzi pe computerul victimei. 

Fazele atacului

Atacatorii pot găzdui un site web care conține o pagină HTML modificată și pot păcăli utilizatorii să îl acceseze prin e-mailuri de phishing sau rețele sociale. Atunci când utilizatorii vizitează site-ul folosind o versiune vulnerabilă de Google Chrome, codul malițios încorporat va executa comenzi arbitrare. 

Diagrama care prezintă un proces în patru pași pentru exploatarea unei vulnerabilități folosind un e-mail de phishing cu un fișier HTML rău intenționat care duce la executarea codului de la distanță
Campanie ofensivă pas cu pas 

Motor JavaScript V8 

Atacatorii pot găzdui un site web care conține o pagină HTML modificată și pot păcăli utilizatorii să îl acceseze prin e-mailuri de phishing sau rețele sociale. Atunci când utilizatorii vizitează site-ul folosind o versiune vulnerabilă de Google Chrome, codul malițios încorporat va executa comenzi arbitrare. 

Maglev și alocarea pliată

Maglev, un compilator optimizator în V8, îmbunătățește execuția codului și alocarea memoriei. Maglev rulează numai atunci când codul este executat frecvent și marcat ca fiind "fierbinte", indicând necesitatea unei execuții mai rapide prin compilare, mai degrabă decât o interpretare mai lentă linie cu linie. 

De obicei, alocările au loc în regiuni de memorie necontigue, ceea ce conduce la o utilizare dispersată și ineficientă a memoriei. Pentru a rezolva această problemă, V8 utilizează o tehnică numită alocare pliată, care alocă mai multe variabile în mod continuu și simultan. Maglev optimizează, de asemenea, alocările prin utilizarea alocării pliate în progresul său. 

Diagrama care prezintă reprezentări cu coduri de culori ale alocărilor de dosare cu și fără dosare alocate
Malev și alocarea dosarelor

Colectarea generațională a gunoiului 

Pentru a curăța regiunile de memorie neutilizate, V8 utilizează o tehnică generațională de colectare a gunoiului (GC), împărțind memoria în două spații: generația tânără și generația veche. În plus, există două colectori de gunoi: colectorul de gunoi minor, care este responsabil de curățarea spațiului tânăr, și colectorul de gunoi major, care se ocupă de curățarea spațiului vechi. Generația tânără este zona de memorie în care sunt alocate inițial obiectele nou create, iar generația veche este o regiune de memorie în care sunt stocate obiectele de lungă durată. Obiectele care au supraviețuit mai multor cicluri GC minore în generația tânără sunt în cele din urmă promovate în generația veche. 

Diagrama care prezintă procesul de alocare a obiectelor în generațiile de memorie tânără, intermediară și veche în timpul colectării gunoiului (GC)
Spații de memorie: generația tânără și generația veche

Analiza vulnerabilității

Prezentare generală

Vulnerabilitatea apare atunci când un obiect este creat dintr-o clasă moștenită de la o clasă de bază fără constructor definit explicit (constructor implicit de bază), iar ulterior este creat un alt obiect. Datorită alocării pliate, alocarea primului obiect poate fi urmată de alocarea celui de-al doilea obiect. Dacă între aceste două alocări are loc un eveniment cum ar fi colectarea gunoiului, poate apărea o vulnerabilitate de confuzie de tip.

Analiza cauzelor principale 

OPSWAT Graduate Fellows au efectuat o analiză detaliată a fluxului de lucru V8 în timpul procesului de alocare și au stabilit că următoarele funcții sunt invocate în timpul acestui proces: 

Diagrama care ilustrează fluxul de lucru al V8 în timpul procesului de alocare a obiectelor, de la găsirea constructorului la extinderea alocării brute
Fluxul de lucru V8 în timpul procesului de alocare 

În cadrul acestui proces, a fost identificată o problemă în funcția TryBuildFindNonDefaultConstructorOrConstruct: Funcția BuildAllocateFastObject extinde current_raw_allocation_ (un pointer către regiunea de memorie alocată pentru mai multe variabile simultan) pentru a construi instanța clasei copil, dar nu reușește să o șteargă prin setarea acesteia la null. 

Ca urmare, următorul obiect creat este întotdeauna alocat imediat după memoria indicată de current_raw_allocation_, indiferent de orice eveniment anterior celei de-a doua alocări. 

Diagrama care arată crearea unui nou obiect în memorie, trecând de la "alocarea brută curentă" la "următorul obiect"
"current_raw_allocation" și "Next object" în regiunea de memorie

Dacă GC este invocat, regiunea de memorie adiacentă memoriei adiacente la current_raw_allocation_ poate fi atribuită altor obiecte. Acest lucru poate duce la o situație în care, după ce GC este declanșat și este creat un alt obiect, doi pointeri fac trimitere la aceeași regiune de memorie, dar au tipuri de date diferite, ceea ce duce la o vulnerabilitate de confuzie de tip.

O diagramă care prezintă un proces de vulnerabilitate de tip confuzie, ilustrând declanșarea colectării gunoiului și alocarea obiectelor care conduc la probleme potențiale
Vulnerabilitate de tip confuzie 

Exploatare

Pentru a exploata această vulnerabilitate, OPSWAT Graduate Fellows au creat instanțe WebAssembly conținând cod shell și au încercat să declanșeze confuzia de tip prin GC pentru a controla memoria și a executa codul shell: 

O diagramă pas cu pas a modului de declanșare a execuției de cod de la distanță prin confuzie de tip în motorul V8, de la declanșarea confuziei de tip la executarea codului shell
Pași pentru a declanșa o execuție de cod la distanță în motorul V8 

Confuzia tipului de declanșator

În timpul inițializării, definim mai întâi un array (_arrayObject) care conține obiecte goale. În continuare, construim o instanță a clasei copil, precum și un trigger garbage collector. În cele din urmă, definim un alt array cu un număr în virgulă mobilă, denumit _arrayDouble. 

Un fragment de cod care demonstrează o funcție care declanșează garbage collection în JavaScript, creând un buffer array

Aceste construcții trebuie să fie repetate astfel încât codul să fie executat de mai multe ori, determinând V8 să îl marcheze ca "fierbinte" și să declanșeze compilatorul Maglev. Obținem acest lucru prin invocarea constructorului clasei copil în cadrul unei bucle, după cum urmează: 

Un scurt fragment de cod JavaScript care ilustrează o buclă care creează mai multe instanțe ale unei clase copil

Confuzia de tip va fi declanșată după inițializarea repetată a acestor obiecte într-o buclă.

Crearea de primitive de citire și scriere

După declanșarea cu succes a confuziei de tip, execuția codului shell necesită citirea memoriei și suprascrierea memoriei la o adresă controlată. Pentru a face acest lucru, am creat primitive de citire și scriere. Primitivele de exploatare vor profita de metadatele din obiecte pentru a ne oferi regiuni de memorie arbitrare de citire/scriere și le vor utiliza pentru a executa cod arbitrar. 

O reprezentare vizuală a primitivelor de citire și scriere, care arată regiunile de memorie și valorile care sunt suprascrise
Citire și scriere primitivă 

Primitivele de citire și scriere din acest pas ne vor permite să controlăm pointerul tabelului Jump al instanței WebAssembly în pasul următor. 

Crearea instanțelor WebAssembly

În continuare, am creat două instanțe WebAssembly: una pentru stocarea codului secret și alta pentru declanșarea acestuia. Pentru a evita scrierea directă a codului shell în memoria instanței WebAssembly prin intermediul primitivelor de citire și scriere, definim unele valori constante în virgulă mobilă în cadrul instanței WebAssembly. 

Un fragment de cod scris în WebAssembly care ilustrează accesul la memorie și funcțiile de stocare

Pointerul tabelei de salt de control al instanței WebAssembly

Utilizând primitive de citire și scriere, ajustăm pointerul tabelului de salt al celei de-a doua instanțe WebAssembly pentru a sări peste câțiva octeți din codul compilat al constantelor din prima instanță WebAssembly, astfel încât constantele în virgulă mobilă să fie interpretate ca fiind codul de cochilie dorit:

Fragment de cod de asamblare care prezintă instrucțiuni pentru mutarea datelor în registre

Rulați instanța WebAssembly pentru a executa codul Shell 

În cele din urmă, după declanșarea confuziei de tip și utilizarea primitivelor de citire/scriere pentru a controla indicatorii tabelei de salturi a instanțelor WebAssembly, am invocat funcția exportată a celei de-a doua instanțe WebAssembly, care determină executarea codului shell din prima instanță WebAssembly. 

Codul shell pe care îl folosim este conceput pentru a termina toate procesele de pe o mașină Linux, ca prin următoarea comandă: 

Un fragment simplu de comandă de terminal cu comanda "kill" pentru terminarea proceselor

Codul de asamblare pentru executarea acestei comenzi, convertit din numere în virgulă mobilă, va fi după cum urmează: 

Un fragment de cod de asamblare pentru un syscall care termină un proces folosind comanda "kill

Simularea vulnerabilității de securitate 

Pentru a simula această exploatare într-un scenariu real, OPSWAT Graduate Fellows au creat o pagină HTML creată în mod malițios. 

Un fragment de cod WebAssembly conceput pentru a executa shellcode prin accesarea memoriei și manipularea datelor

Victimei i se trimite un e-mail de phishing cu un link către domeniul care găzduiește această pagină HTML trucată. 

Captură de ecran care prezintă un e-mail de phishing alături de un instrument de monitorizare a sistemului, demonstrând executarea atacului

Dacă victima accesează link-ul utilizând versiunea vulnerabilă a Google Chrome, shellcode-ul este executat, provocând terminarea tuturor proceselor. Ca urmare, utilizatorul este deconectat, după cum se arată mai jos: 

Captură de ecran a ecranului de autentificare pentru Kali Linux

Remediere

MetaDefender Endpoint™ a fost utilizat pentru a atenua în mod proactiv acest CVE prin utilizarea capacității sale "Aplicație vulnerabilă". Soluția identifică și afișează în mod eficient toate CVE-urile asociate pentru aplicațiile Google Chrome din mediul endpoint. Pentru a neutraliza amenințarea, utilizatorii pot dezinstala imediat Chrome sau pot aplica cel mai recent patch de securitate. Prin punerea în aplicare a ambelor contramăsuri, CVE este complet izolat, reducând semnificativ riscul unui atac cibernetic de succes asupra punctului final.

Interfața MetaDefender Endpoint prezintă vulnerabilitățile Google Chrome, inclusiv detalii privind CVE-urile

Securitatea Endpoint de nivel următor 

Descoperiți de ce organizațiile, instituțiile și entitățile din întreaga lume au încredere în MetaDefender Endpoint pentru a proteja punctele finale critice. Discutați astăzi cu un expert pentru a afla mai multe și convingeți-vă cu o demonstrație gratuită.  


Rămâneți la curent cu OPSWAT!

Înscrieți-vă astăzi pentru a primi cele mai recente actualizări ale companiei, povești, informații despre evenimente și multe altele.