Juunis 2019 tuvastasid ESETi uurijad nullpäevhaavatavuse, mida kasutati väga suunatud rünnakute teostamiseks Ida-Euroopas.

Ära kasutatakse kohaliku privileegi laiendamise haavatavust Microsoft Windowsi platvormil, eriti NULL osuti viite eemaldamist win32k.sys komponendilt. Vea avastamisel ja analüüsimisel anti sellest teada Microsoft Security Response Centerile, kes haavatavuse kiiresti ära parandas ja vastava patch’i avaldas.

Haavatavus puudutab järgnevaid Microsoft Windows versioone:

  • Windows 7 for 32-bit Systems Service Pack 1
  • Windows 7 for x64-based Systems Service Pack 1
  • Windows Server 2008 for 32-bit Systems Service Pack 2
  • Windows Server 2008 for Itanium-Based Systems Service Pack 2
  • Windows Server 2008 for x64-based Systems Service Pack 2
  • Windows Server 2008 R2 for Itanium-Based Systems Service Pack 1
  • Windows Server 2008 R2 for x64-based Systems Service Pack 1

See blogipostitus keskendub haavatavuse tehnilistele detailidele ja nende ärakasutamisele. Homme avaldame teise postituse, kus käsitleme süvitsi leitud pahavara näidist ja selle laiemat mõju.

Haavatavus

Nii nagu mitmete teiste viimastel aastatel tuvastatud Microsoft Windows win32k.sys haavatavuste puhul, kasutatakse ära hüpikmenüü objekte. Näiteks Sedniti grupi kohaliku privileegi laiendamise haavatavus, mida analüüsisime 2017. aastal kasutas menüüobjekte ja tehnikaid, mis on väga sarnased praegusele haavatavusele.

Antud juhul luuakse kaks akent, üks nii haavatavuse kasutamise esimese kui teise etapi jaoks. Esimeses aknas luuakse hüpikmenüü objektid ja menüü elemendid kinnitatakse sellele CreatePopupMenu ja AppendMenu funktsioone kasutades. Lisaks luuakse WH_CALLWNDPROC ja EVENT_SYSTEM_MENUPOPUPSTART haagid.

Seejärel kuvab haavatavus ekraanile menüü TrackPopupMenu funktsiooni kasutades. Sel hetkel käivitatakse kood, mis on seotud EVENT_SYSTEM_MENUPOPUPSTART funktsiooniga. Koodiga üritatakse avada menüü esimest objekti, edastades menüüle sõnumite MN_SELECTITEM ja MN_SELECTFIRSTVALIDITEM ning MN_OPENHIERARCHY jada.

Järgmiseks sammuks on haavatavuse ärakasutamisel väga oluline toiming. Haavatavuse kasutamiseks tuleb tuvastada hetk, mil luuakse algne menüü, kuid alammenüü on alles loomisel. Selleks on haavatavusel kood, mis tegeleb  WM_NCCREATE sõnumiga WH_CALLWNDPROC jadas. See kood tuvastab süsteemi vastava seisundi ja edastab esimesele menüüle MN_CANCELMENUS (0x1E6) sõnumi, mis menüü tühistab. Kuid alammenüü on ikka loomisel.

Nüüd, kui kontrollime seda alammenüü objekti kernel-režiimis, näeksime seda, et tagPOPUPMENU‑>ppopupmenuRoot võrdub 0-ga. Selline seisund võimaldab ründajal kasutada elementi selles kernelstruktuuris NULL osuti viite-eemaldajana. Nii jaotatakse aadressile 0x0 uus leht ja aadressi käsitletakse kerneli poolt tagPOPUPMENU objektina (vt Joonis 1).

Joonis 1. tagPOPUPMENU kernelstruktuur.

Sel hetkel kasutavad ründajad teist akent. Haavatavuse kasutamisel on peamine eesmärk  bServerSideWindowProc bitt muuta teise akna tagWND struktuuris ära. Nii tingitakse WndProc protseduuri teostamine kernelrežiimis.

Selle teostamiseks lekitavad ründajad tagWND struktuuri kernelmälu aadressi teise aknasse, käivitades user32.dll kogus eksportimata HMValidateHandle funktsiooni. Haavatavus loob NULL lehel võltsi tagPOPUPMENU objekti ja saadab MN_BUTTONDOWN sõnumi alammenüüsse.

Seejärel käivitab kernel lõpuks win32k!xxxMNOpenHierarchy funktsiooni.

Joonis 2. Funktsiooni win32k!xxxMNOpenHierarchy lahtivõetud kood.

See funktsioon edastab NULL lehel loodud objekti win32k!HMAssignmentLock juurde. bServerSideWindowProcbitt paigutatakse win32k!HMDestroyUnlockedObject funktsiooni, mis asub mõne kutsungi kaugusel funktsioonis win32k!HMAssignmentLock.

Joonis 3. Funktsiooni win32k!HMDestroyUnlockedObject lahtivõetud kood.

Kõik on tehtud! Nüüd võib haavatavuse ärakasutamisel edastada teise aknasse spetsiifilise sõnumi WndProc teostamiseks kernelrežiimis.

Viimase sammuna asendatakse praeguse protsessi tähis süsteemi tähisega.

Järeldus

Haavatavust on võimalik ära kasutada ainult vanemate Windowsi versioonide puhul, sest Windows 8 kasutajaprotsessidel ei ole lubatud NULL lehte kaardistada. Microsoft on selle lahenduse kasutusele võtnud ka Windows 7 for x64-based süsteemide juures.

Kasutajad, kelle arvutites on veel kasutusel Windows 7 32-bit Service Pack 1 peaksid kaaluma uuematele operatsioonisüsteemidele üleminekut, sest Windows 7 Service Pack 1 jaoks lõpetatakse pikendatud kasutajatugi 14. jaanuaril 2020. See tähendab, et Windows 7 kasutajad ei saa enam kriitilisi turbeuuendusi. See tähendab, et haavatavused nagu see, mida käesolevas artiklis käsitlesime, jäävad alatiseks parandamata.

Kompromissiindikaatorid (IoC-d)

SHA-1 räsiESET tuvastusnimi
CBC93A9DD769DEE98FFE1F43A4F5CADAF568E321
Win32/Exploit.CVE-2019-1132.A

Allikas: Welivesecurity