
PowerShell-Skript zur Anwendung des Zenbleed (CVE-2023-20593) MSR-Workarounds unter Windows
Die kürzlich entdeckte Zenbleed-Schwachstelle (CVE-2023-20593) betrifft alle Zen2-Prozessoren von AMD. Leider wird AMD bis November oder Dezember 2023 keine Mikrocode-Updates für viele seiner Prozessoren bereitstellen. Wie kann man in der Zwischenzeit sicher bleiben? Glücklicherweise gibt es einen Software-Workaround. Während das Anwenden des Software-Workarounds unter Linux eine einzige Zeile ist, gestaltet sich die Sache unter Windows komplizierter.
Um den Software-Workaround anzuwenden, muss ein bestimmtes Bit (das Chicken-Bit DE_CFG[9]) im MSR-CPU-Register gesetzt werden.
Wie von Travis Ormandy hervorgehoben, kann der folgende Befehl verwendet werden, um Zenbleed unter Linux zu vermeiden:
# wrmsr -a 0xc0011029 $(($(rdmsr -c 0xc0011029) | (1<<9)))
Unter Windows ist das Setzen des MSR-Registers schwieriger. Nur Kernel-Level-Treiber dürfen auf das MSR-Register schreiben. Darüber hinaus muss ein Kernel-Level-Treiber signiert sein, um geladen zu werden. Aus diesem Grund haben wir uns entschieden, den vorhandenen WinRing0-Treiber von OpenLibSys.org zu verwenden. Wir haben ein PowerShell-Skript geschrieben, das WinRing0 lädt, die entsprechenden MSR-Schreibanforderungen an die Treiber sendet und den WinRing0-Treiber sofort danach entlädt. Derzeit funktioniert unser PowerShell-Skript nur, wenn Hyper-V deaktiviert ist. Unser PowerShell-Skript wird hier gehostet: https://github.com/sbaresearch/stop-zenbleed-win
Bitte beachten Sie, dass das PowerShell-Skript einige Einschränkungen mit sich bringt. Bitte lesen Sie den Abschnitt 'Einschränkungen' und führen Sie eine Risikoanalyse für Ihre spezifische Umgebung durch, bevor Sie das Skript verwenden.
Stop-Zenbleed.ps1 in einer PowerShell 5.x mit Administratorrechten aus.NT AUTHORITY\SYSTEM-Rechten möglich.
Eine echte Behebung würde eine Änderung im WinRing0-Treiber und damit eine neue Signatur erfordern, was kompliziert ist.
Die OpenHardwareMonitor-Bibliothek behebt als Workaround die Zugriffsrechte unmittelbar nach dem Laden des Treibers (https://github.com/openhardwaremonitor/openhardwaremonitor/commit/0e435cafc61fe84d429e8a9500d666e34e3de67b).
Unser PowerShell-Skript umgeht CVE-2020–14979, indem es den Treiber sofort nach dem Setzen des Chicken-Bits entlädt.
Es besteht jedoch jedes Mal, wenn das Skript ausgeführt wird, ein kleines Zeitfenster der Angreifbarkeit.
Da das Setzen des Chicken-Bits nicht persistent ist, muss das Skript bei jedem Neustart ausgeführt werden.
In unserer Risikoanalyse überwiegen die Vorteile des Schutzes vor Zenbleed (das aus der Ferne geschehen kann) erneut die Risiken einer lokalen Privilegieneskalation.
Darüber hinaus empfehlen wir, das Skript so früh wie möglich im Startvorgang auszuführen, um die Ausbeutbarkeit durch Benutzerprozesse einzuschränken.
Bitte führen Sie eine Risikoanalyse für Ihre spezifische Umgebung durch, bevor Sie das PowerShell-Skript einsetzen.PS C:\stop-zenbleed-win> powershell -ExecutionPolicy RemoteSigned .\Stop-Zenbleed.ps1
[>] Installing driver...
[SC] CreateService SUCCESS
[>] Starting driver...
SERVICE_NAME: WinRing0_1_2_0
TYPE : 1 KERNEL_DRIVER
STATE : 4 RUNNING
(STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
PID : 0
FLAGS :
[>] Opening driver...
[+] Driver access OK, handle: 2456
[>] Try 1 to apply fix on processor 1
[+] Fix is applied on processor 1 (MSR 0xC0011029=0x300C310E08202)
[+] Fix is applied on processor 2 (MSR 0xC0011029=0x300C310E08203)
[>] Try 1 to apply fix on processor 3
[+] Fix is applied on processor 3 (MSR 0xC0011029=0x3004310E08202)
[+] Fix is applied on processor 4 (MSR 0xC0011029=0x300C310E08203)
[>] Try 1 to apply fix on processor 5
[+] Fix is applied on processor 5 (MSR 0xC0011029=0x300C310E08202)
[+] Fix is applied on processor 6 (MSR 0xC0011029=0x300C310E08203)
[>] Try 1 to apply fix on processor 7
[+] Fix is applied on processor 7 (MSR 0xC0011029=0x300C310E08202)
[+] Fix is applied on processor 8 (MSR 0xC0011029=0x300C310E08203)
[>] Try 1 to apply fix on processor 9
[+] Fix is applied on processor 9 (MSR 0xC0011029=0x300C310E08202)
[+] Fix is applied on processor 10 (MSR 0xC0011029=0x300C310E08203)
[>] Try 1 to apply fix on processor 11
[+] Fix is applied on processor 11 (MSR 0xC0011029=0x300C310E08202)
[+] Fix is applied on processor 12 (MSR 0xC0011029=0x300C310E08203)
[>] Try 1 to apply fix on processor 13
[+] Fix is applied on processor 13 (MSR 0xC0011029=0x300C310E08202)
[+] Fix is applied on processor 14 (MSR 0xC0011029=0x300C310E08203)
[>] Try 1 to apply fix on processor 15
[+] Fix is applied on processor 15 (MSR 0xC0011029=0x300C310E08202)
[+] Fix is applied on processor 16 (MSR 0xC0011029=0x300C310E08203)
[>] Closing driver...
[>] Stopping driver...
SERVICE_NAME: WinRing0_1_2_0
TYPE : 1 KERNEL_DRIVER
STATE : 1 STOPPED
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
[>] Uninstalling driver...
[SC] DeleteService SUCCESS
Nach Ausführung unseres PowerShell-Skripts sollte der POC-Exploit keine weiteren Ausgaben mehr erzeugen.
Stop-Zenbleed.ps1 wird unter der GNU GPL v3.0-Lizenz bereitgestellt: LICENSE