În iunie 2019, cercetătorii ESET au identificat un exploit de tip zero day, utilizat într-un atac direcționat din Europa de Est.
Exploit-ul abuzează de o vulnerabilitate locală de tip privilege escalation în Microsoft Windows, în special o dereferență a indicatorului NULL în componenta win32k.sys. Odată ce exploit-ul a fost descoperit și analizat, acesta a fost raportat către Microsoft Security Response Center, care a reparat imediat vulnerabilitatea și a lansat un patch pentru aceasta.
Vulnerabilitatea afectează următoarele versiuni de Windows:
- Windows 7 pentru sistemele de 32 de biți Service Pack 1
- Windows 7 pentru sistemele bazate pe 64 de biți Service Pack 1
- Windows Server 2008 pentru sistemele de 32 de biți Service Pack 2
- Windows Server 2008 pentru sistemele bazate pe Itanium Service Pack 2
- Windows Server 2008 pentru sistemele bazate pe 64 de biți Service Pack 2
- Windows Server 2008 R2 pentru sistemele bazate pe Itanium Service Pack 1
- Windows Server 2008 R2 pentru sistemele bazate pe 64 de biți Service Pack 1
Această postare de blog se concentrează asupra detaliilor tehnice ale vulnerabilității descoperite și asupra posibilităților de exploatare ale acesteia. O viitoare postare va analiza un eșantion al malware-ului și implicațiile sale mai largi.
Exploatarea
Ca în cazul mai multor alte vulnerabilități Win32k.sys din Microsoft Windows descoperite în ultimii ani, acest exploit utilizează obiecte din meniul pop-up. De exemplu, exploit-ul de escaladare a privilegiilor locale folosit de grupul Sednit, pe care l-am analizat în 2017, a folosit obiecte din meniu și tehnici de exploatare, care sunt foarte asemănătoare exploit-ului curent.
Acest exploit creează două ferestre; unul pentru prima etapă și altul pentru a doua etapă a procesului de exploatare. Pentru prima fereastră, creează obiecte din meniul pop-up și se anexează elemente de meniu utilizând funcțiile CreatePopupMenu și AppendMenu. În plus, exploit-ul instalează hook-urile WH_CALLWNDPROC și EVENT_SYSTEM_MENUPOPUPSTART.
Apoi, exploit-ul afișează un meniu utilizând funcția TrackPopupMenu. În acest moment, este executat codul conectat la EVENT_SYSTEM_MENUPOPUPSTART. Acest cod încearcă să se deschidă primul element disponibil din meniu, trimițând o secvență de mesaje MN_SELECTITEM, MN_SELECTFIRSTVALIDITEM și MN_OPENHIERARCHY către meniu.
Următorul pas este foarte important pentru activarea acestei vulnerabilități. Exploit-ul trebuie să prindă un moment bun, când meniul inițial este deja creat, iar submeniul este pe cale să fie creat. Pentru aceasta, exploit-ul are un cod care gestionează mesajul WM_NCCREATE în cârligul WH_CALLWNDPROC. Când codul de exploatare detectează că sistemul este în această stare, acesta trimite mesajul MN_CANCELMENUS (0x1E6) în primul meniu, care anulează meniul respectiv. Cu toate acestea, submeniul său este încă pe cale să fie creat.
Acum, dacă verificăm acest obiect din submeniu în modul kernel, vom vedea că tagPOPUPMENU-> ppopupmenuRoot este egal cu 0. Această stare permite atacatorului să folosească acel element din această structură a kernel-ului ca o dereferență a indicatorului NULL. Exploit-ul alocă o nouă pagină la adresa 0x0, iar această adresă va fi tratată ca un obiect tagPOPUPMENU (vezi Figura 1) de către kernel.
În acest punct, atacatorii se folosesc de a doua fereastră. Principalul obiectiv al exploit-ului este de a schimba poziția bitului bServerSideWindowProc în structura tagWND a celei de-a doua ferestre. Aceasta determină executarea unei proceduri WndProc în modul kernel.
Pentru a efectua acest lucru, atacatorii preiau adresa de memorie kernel a structurii tagWND a celei de-a doua ferestre prin apelarea funcției HMValidateHandle care nu este exportată în biblioteca user32.dll. Apoi exploit-ul arborează un obiect tagPOPUPMENU fals pe pagina NULL și trimite un mesaj MN_BUTTONDOWN către un submeniu.
După aceasta, kernelul va executa în cele din urmă funcția win32k! XxxMNOpenHierarchy.
Această funcție transmite un obiect arborat la pagina NULL către win32k!HMAssignmentLock. Bitul bServerSideWindowProc este setat în interiorul funcției win32k!HMDestroyUnlockedObject, care este localizată undeva mai adânc în win32k!HMAssignmentLock.
Asta este tot! Acum exploit-ul poate trimite un mesaj specific către a doua fereastră, pentru a executa WndProc în modul kernel.
Ca un pas final, exploit-ul înlocuiește token-ul procesului curent cu token-ul de sistem.
Patch-ul publicat, printre altele, a adăugat un check la un indicator NULL în funcția win32k!XxxMNOpenHierarchy.
Concluzii
Exploit-ul funcționează numai în cazul versiunilor mai vechi de Windows, întrucât de la versiunea Windows 8 încoace un proces de utilizator nu are permisiunea de a mapa pagina NULL. Microsoft a retro dotat această rezolvare și la Windows 7 pentru sistemele x64.
Persoanele care utilizează în continuare Windows 7 pentru sistemele pe 32 de biți Service Pack 1 ar trebui să aibă în vedere actualizarea la sisteme de operare mai noi, deoarece suportul extins al Windows 7 Service Pack 1 se încheie la data de 14 ianuarie 2020, ceea ce înseamnă că utilizatorii Windows 7 nu vor primi actualizări critice de securitate. Astfel, vulnerabilitățile precum aceasta vor rămâne persistente pentru totdeauna.
Indicatori de compromis
SHA-1 hash | Nume de detecție ESET |
CBC93A9DD769DEE98FFE1F43A4F5CADAF568E321 | Win32/Exploit.CVE-2019-1132.A |
Lasa un comentariu