Lokale Eskalation Eskalation Ausnutzung für den CPU-Z-Kernel-Fahrer.
Die CPU-Z-Anwendung installiert einen gefährdeten signierten Treiber, um auf Kernel-Daten von UsMode zuzugreifen. Vor dem V1.81 enthüllte der CPU-Z-Treiber drei IOCTLs, mit denen die Anwendungsanwendung Steuerregister lesen, Dwords aus dem physischen Speicher lesen und DWORDS in den physischen Speicher schreiben kann. Wir missbrauchen diese Funktionalität, um den vollständigen Kernel -Modus -Codeausführung zu erhalten und eine Systemschale als Beweis für das Konzept zu erzeugen.
Dieser Exploit unterstützt Windows XP - Windows 10 1607:
Dieser Exploit wurde auf den folgenden Systemen mit CPU-Z v1.76 getestet:
* Unter Windows 1703 und späterem Kernel Control Flow Guard (CFG) ist standardmäßig [1] aktiviert, was zu einer Kernel_security_Check_Failure -Fehlerprüfung führt.
Um diesen Exploit auszuführen, starten Sie die CPU-Z-Anwendung und führen Sie exploit.exe von einer Eingabeaufforderung als normaler Benutzer aus. Wenn es erfolgreich ist, sollte es einen neuen CMD.exe -Prozess hervorbringen, der als System ausgeführt wird. Beachten Sie, dass dieser Exploit fehlschlägt, wenn er aufgrund der Verwendung von NTQuerysysteminformation aus einem niedrigen Integritätsprozess ausgeführt wird.
Der CPU-Z-Kernel-Treiber vor V1.81 ermöglicht es jeder Usmode-Anwendung, Steuerregister zu lesen, DWords aus dem physischen Speicher zu lesen und DWORS in den physischen Speicher zu schreiben. Wir missbrauchen diese Funktionalität, um CR3 zu lesen und die Seitentabellen zu durchqueren, um einen willkürlichen Lese-/Schreiben primitiv über den gesamten virtuellen Speicherplatz zu erstellen.
Mit vollem Lese-/Schreiben drehen wir das Benutzer/Supervisor -Bit auf der Seite Tabelle Eintrag (PTE) mit unserer Nutzlast zu KernelMode, um die Ausführung der Vorbeugung des Supervisor -Modus (SMEP) zu umgehen. Anschließend überschreiben wir einen Funktionszeiger bei NT! Haldispatchtable [1] und lösen die Nutzlast aus, indem Sie NtQueryIntervalprofile aufrufen.
Als Proof of Concept weist die Nutzlast dem System -Token einem suspendierten CMD.exe -Prozess zu und fährt den Prozess fort. Dies sollte zu einer neuen Eingabeaufforderung führen, die als NT -Autorität/-system ausgeführt wird. Die Nutzlast stützt sich nicht auf statische Offsets und sollte somit unter Windows XP+funktionieren.
In den letzten zwei Jahren wurde eine Reihe von Minderungen eingeführt, die die Wirksamkeit dieses Exploits einschränken. Eine kurze Beschreibung finden Sie unten.
Ab Version 1.81 wurde der mit CPU-Z gelieferte Treiber gepatcht, um den Satz der Anrufer zu begrenzen, die sein Geräteobjekt öffnen können, und einige IOCTL-Implementierungen wurden entfernt. Bei Anfragen zum Öffnen des Geräteobjekts des Fahrers wird prüft, ob der aktuelle Vorgang das SeloaddriverPrivilege aktiviert ist. Wenn dieses Priviliete fehlt oder deaktiviert wird, lehnt der Treiber die Anforderung mit STATUS_ACCESS_DENIED ab. Beachten Sie, dass es beim Ausführen als Administrator trivial ist, dieses Privileg von UsMode zu aktivieren. Darüber hinaus wurde das IOCTL zum Lesen von Kontrollregistern entfernt (obwohl die physischen Speicher -Lese-/Schreibimplementierungen bestehen). Ohne die Möglichkeit, die Seitenbasis von CR3 auszulesen, ist die Ausbeutungsmethode in diesem Projekt nicht mehr machbar. Beachten Sie, dass der CPU-Z-Treiber zahlreiche andere IOCTLs bereitstellt, die für die Nutzung verwendet werden können, z. B. das Lesen und das Schreiben von willkürlichen modellspezifischen Registern.
Ab Windows 10 1703 (Creators Update) ist der Kernel Control Flow Guard standardmäßig auf x86_64 aktiviert. Anrufe durch den HaldispatchTable führen zu einer Kernel_security_Check_Failure -Fehlerprüfung, da sie durch CFG geschützt ist. Wenn die virtualisierungsbasierte Sicherheit (VBS) nicht aktiviert ist, sollte es möglich sein, die Nutzlast als gültiges Anrufziel für die Umgehung von CFG hinzuzufügen.
Wenn die virtualisierungsbasierte Sicherheit (VBS) aktiviert ist, wird der Großteil dieses Exploits abgebildet. Die PTE -Manipulation, die zur Deaktivierung von SMEP verwendet wird, ist nicht mehr möglich, da die PTEs vom Hypervisor geschützt werden. Zusätzlich wird auf X86_64 ein CFG -Bypass benötigt, um die Codebehandlung über den HaldispatchTable zu erhalten, da der Kernel CFG -Bitmap nicht beschreibbar ist.
Die in diesem Exploit verwendeten Schwachstellen sind in CVE-2017-15302 und CVE-2017-15303 aufgeführt. Ein weiterer Beweis des Konzepts kann bei CPUZ-DSEFIX [5] betrachtet werden.
[1] https://community.osr.com/discussion/283374/control-flow-guard-question
[2] https://www.cvedetails.com/cve/cve-2017-15302/
[3] https://www.cvedetails.com/cve/cve-2017-15303/
[4] https://github.com/akayn/bugs/blob/master/cpuid/cve-2017-15302/readme.md
[5] https://github.com/samlarenn/cpuz-dsefix
Darüber hinaus ist die in diesem Exploit verwendete HaldispatchTable -Überschreibemethode ein häufig verwendeter Vektor, um eine Codeausführung aus einem Kernel -Lese-/Schreibprimitiv zu erhalten. Weitere Details zu dieser Technik finden Sie in den folgenden Ressourcen.
[6] http://poppopret.blogspot.com/2011/07/windows-kernel-exploitation-basics-tml
[7] https://www.abatchy.com/2018/01/kernel-exploitation-7
[8] https://osandamalith.com/2017/06/14/windows-kernel-exploitation-barbitrary-overwrite/
[9] https://rootkits.xyz/blog/2017/09/kernel-write-what-where/