Im Juni 2019 entdeckten und analysierten ESET Forscher einen Zero-Day Exploit, welcher in einer zielgerichteten Attacke in Osteuropa zum Einsatz kam.

Der Exploit missbraucht eine “Local Privilege Escalation” Schwachstelle in Microsoft Windows zum Erlangen von höheren Nutzerrechten. Im Detail handelt es sich dabei um eine „NULL Pointer Dereference“ der win32k.sys Komponente. Sofort nach Entdeckung und Analyse des Exploits wurden die Erkenntnisse an das Microsoft Security Response Center übergeben. So konnte die Lücke geschlossen und ein entsprechendes Update veröffentlicht werden.

Die Schwachstelle betrifft die folgenden Windows-Versionen:

  • Windows 7 32-Bit Service Pack 1
  • Windows 7 64-Bit Service Pack 1
  • Windows Server 2008 32-Bit Service Pack 2
  • Windows Server 2008 64-Bit Service Pack 2
  • Windows Server 2008 IA-64- Service Pack 2
  • Windows Server 2008 R2 64-Bit Service Pack 1
  • Windows Server 2008 R2 IA-64 Service Pack 1

Dieser Blog-Artikel konzentriert sich auf die technischen Details der Schwachstelle und ihre Ausnutzung. Ein weiterer Artikel morgen widmet sich dann dem gefundenen Malware-Sample und den weiteren Auswirkungen.

Die Ausnutzung

Wie bei einer Reihe anderer veröffentlichter Schwachstellen von win32k.sys nutzt der aktuelle Exploit Popup Menüobjekte. Die bekannte Sednit-Gruppe benutzte ganz ähnliche Menüobjekte und Techniken in einem Rechte-Exploit, dass wir bereits 2017 analysiert haben.

Dieser Exploit erzeugt nun zwei Fenster. Jeweils eins für die erste und zweite Phase der Ausnutzung. Für das erste Fenster erstellt er Popup-Menüobjekte und fügt Menü-Items durch die entsprechenden Funktionen CreatePopupMenu und AppendMenu. Zusätzlich setzt er noch WH_CALLWNDPROC und EVENT_SYSTEM_MENUPOPUPSTART Hooks.

Danach wird ein Menü über die TrackPopupMenu Funktion angezeigt. In genau diesem Moment wird der Code, der in EVENT_SYSTEM_MENUPOPUPSTART gehookt wurde, ausgeführt. Dieser Code versucht, als erstes verfügbares Item im Menü geöffnet zu werden. Dazu sendet er eine Sequenz an MN_SELECTITEM, MN_SELECTFIRSTVALIDITEM und MN_OPENHIERARCHY Nachrichten an das Menü.

Der nächste Schritt ist entscheidend zum Auslösen der Schwachstelle. Der Exploit muss genau den Moment abpassen, wenn das ursprüngliche Menü bereits erstellt wurde, das Sub-Menü aber noch erstellt werden soll. Dazu verfügt der Exploit über Code, der die WM_NCCREATE Nachricht im WH_CALLWNDPROC Hook überwacht. Wenn dieser Code nun erkennt, dass sich das System im gewünschten Zustand befindet, sendet es eine MN_CANCELMENUS (0x1E6) Nachricht an das erste Menü, welches das aktuelle Menü abbricht. Dies gilt aber nicht für das Sub-Menü des nun abgebrochenen Menüs, das (für das System) immer noch erstellt werden soll.

Wenn wir uns nun das Sub-Menü-Objekt im Kernel Mode anschauen, sehen wir, dass tagPOPUPMENU‑>ppopupmenuRoot gleich 0 ist. Dieser Zustand erlaubt dem Angreifer, das Element in der Kernel Struktur als NULL Pointer Dereference zu benutzen. Der Exploit weist der Adresse 0x0 eine neue Seite zu und die Adresse wird durch den Kernel als tagPOPUPMENU Objekt behandelt (siehe Bild 1).

Bild 1. Die tagPOPUPMENU Kernelstruktur

Bild 1. Die tagPOPUPMENU Kernelstruktur

In diesem Moment setzen die Angreifer das zweite Fenster ein. Das Hauptziel des Exploits ist das Umschalten des bServerSideWindowProc Bits in der tagWND Struktur des zweiten Fensters. Dadurch wird eine WndProc Prozedur im Kernel Mode ausgeführt.

Dazu ermitteln und nutzen die Angreifer die Kernel Speicheradresse der tagWND Struktur des zweiten Fensters. Dies schaffen sie durch den Aufruf der nicht exportierten HMValidateHandle Funktion in der user32.dll Library. Anschließend erstellt der Exploit ein gefälschtes tagPOPUPMENU Objekt auf der NULL Seite und sendet eine MN_BUTTONDOWN Nachricht an ein Sub-Menü.

Danach ruft der Kernel die win32k!xxxMNOpenHierarchy Funktion auf.

Bild 2. Disassemblierter Code der win32k!xxxMNOpenHierarchy Funktion

Bild 2. Disassemblierter Code der win32k!xxxMNOpenHierarchy Funktion

Diese Funktion leitet ein präpariertes Objekt auf der NULL Seite an win32k!HMAssignmentLock weiter. Das bServerSideWindowProc Bit wird in der win32k!HMDestroyUnlockedObject Funktion gesetzt, welche sich ein paar Aufrufe tiefer in win32k!HMAssignmentLock befindet.

Bild 3. Disassemblierter Code der win32k!HMDestroyUnlockedObject Funktion

Bild 3. Disassemblierter Code der win32k!HMDestroyUnlockedObject Funktion

Nun kann der Exploit eine spezielle Nachricht an das zweite Fenster senden, wodurch WndProc im Kernel Mode ausgeführt wird.

In einem finalen Schritt ersetzt der Exploit den Token des aktuellen Prozesses mit dem Token des Systems.

Mit dem veröffentlichten Patch wurde unter anderem eine Überprüfung auf einen NULL-Pointer in der Funktion win32k! XxxMNOpenHierarchy hinzugefügt.

Unterschiede im Code der zwei win32k.sys-Versionen - Original links, gepatcht rechts

Unterschiede im Code der zwei win32k.sys-Versionen - Original links, gepatcht rechts

Fazit

Der Exploit funktioniert nur mit älteren Versionen von Microsoft Windows, da seit Windows 8 Nutzer-Prozesse nicht mehr die NULL Seite mappen dürfen. Diese Schutzmaßnahme hat Microsoft nun auf Windows 7 für x64-Systems zurückportiert.

Nutzer, die immer noch die 32-Bit Version von Windows 7 nutzen, sollten ein Upgrade auf neuere Betriebssysteme erwägen, da der erweiterte Support für Windows 7 SP1 am 14. January 2020 endet. Das bedeutet, dass Windows 7 Nutzer keine kritischen Updates mehr erhalten. Lücken, wie die aktuelle werden also nicht geschlossen.

 

Der Microsoft Artikel und das Sicherheitsupdate ist unter folgendem Beitrag zu finden:

CVE-2019-1132 | Sicherheitsanfälligkeit in Win32k bezüglich Rechteerweiterungen

 

Indicators of Compromise (IoCs)

SHA-1 hash ESET detection name
CBC93A9DD769DEE98FFE1F43A4F5CADAF568E321 Win32/Exploit.CVE-2019-1132.A