ESET a descoperit un exploit Windows folosit în atacuri direcționate


Î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.

Figura 1. Structura kernel tagPOPUPMENU

Î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.

Figura 2. Codul dezasamblat al funcției 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.

Figura 3. Codul dezasamblat al funcției win32k!XxxMNOpenHierarchy

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.

Figura 4. Diferențele de cod între două versiuni win32k.sys - original (stânga) și patched (dreapta)

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

Anton Cherepanov July 12, 2019

Lasa un comentariu