
Script PowerShell per applicare il workaround MSR di Zenbleed (CVE-2023-20593) su Windows
La vulnerabilità Zenbleed scoperta di recente (CVE-2023-20593) colpisce tutti i processori Zen2 di AMD. Purtroppo, AMD non fornirà aggiornamenti del microcodice per molti dei suoi processori fino a novembre o dicembre 2023. Come restare al sicuro nel frattempo? Fortunatamente, esiste una soluzione alternativa software. Mentre applicare la soluzione alternativa software su Linux è un comando singolo, la situazione su Windows è più complicata.
Per applicare la soluzione alternativa software, un determinato bit (il chicken bit DE_CFG[9]) deve essere impostato nel registro MSR della CPU.
Come indicato da Travis Ormandy, il seguente comando può essere utilizzato per evitare Zenbleed su Linux:
# wrmsr -a 0xc0011029 $(($(rdmsr -c 0xc0011029) | (1<<9)))
Su Windows, impostare il registro MSR è più difficile. Solo i driver a livello kernel possono scrivere nel registro MSR. Inoltre, per caricare un driver a livello kernel, questo deve essere firmato. Ecco perché abbiamo deciso di utilizzare il driver WinRing0 esistente di OpenLibSys.org. Abbiamo scritto uno script PowerShell che carica WinRing0, invia le appropriate richieste di scrittura MSR ai driver e scarica immediatamente dopo il driver WinRing0. Attualmente, il nostro script PowerShell funziona solo quando Hyper-V è disabilitato. Il nostro script PowerShell è ospitato qui: https://github.com/sbaresearch/stop-zenbleed-win
Si prega di notare che lo script PowerShell presenta alcune avvertenze. Si prega di leggere la sezione 'Avvertenze' ed eseguire un'analisi dei rischi per il proprio ambiente specifico prima di utilizzare lo script.
Stop-Zenbleed.ps1 in PowerShell 5.x con permessi di amministratoreNT AUTHORITY\SYSTEM.
Una vera correzione richiederebbe una modifica al driver WinRing0 e quindi una nuova firma, il che è complicato.
La libreria OpenHardwareMonitor, come soluzione alternativa, corregge i diritti di accesso immediatamente dopo il caricamento del driver (https://github.com/openhardwaremonitor/openhardwaremonitor/commit/0e435cafc61fe84d429e8a9500d666e34e3de67b).
Il nostro script PowerShell aggira CVE-2020–14979 scaricando immediatamente il driver dopo aver impostato il chicken bit.
Tuttavia, esiste una piccola finestra di opportunità ogni volta che lo script viene eseguito.
Poiché l'impostazione del chicken bit non è persistente, lo script deve essere eseguito a ogni riavvio.
Nella nostra analisi dei rischi, i benefici di una protezione contro Zenbleed (che può avvenire da remoto) superano ancora i rischi di un'escalation dei privilegi locale.
Inoltre, consigliamo di eseguire lo script il prima possibile durante il processo di avvio per limitare la sfruttabilità da parte dei processi utente.
Si prega di effettuare un'analisi dei rischi per il proprio ambiente specifico prima di distribuire lo script PowerShell.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
Dopo aver eseguito il nostro script PowerShell, l'exploit POC non dovrebbe produrre più alcun output.
Stop-Zenbleed.ps1 è fornito sotto licenza GNU GPL v3.0: LICENSE