
Script de PowerShell para aplicar la solución alternativa MSR de Zenbleed (CVE-2023-20593) en Windows
La vulnerabilidad Zenbleed recién descubierta (CVE-2023-20593) afecta a todos los procesadores Zen2 de AMD. Desafortunadamente, AMD no proporcionará actualizaciones de microcódigo para muchos de sus procesadores hasta noviembre o diciembre de 2023. ¿Cómo mantenerse seguro mientras tanto? Afortunadamente, existe una solución alternativa de software. Mientras que aplicar la solución alternativa de software es una línea de comando en Linux, las cosas son más complicadas en Windows.
Para aplicar la solución alternativa de software, se debe establecer un bit concreto (el chicken bit DE_CFG[9]) en el registro MSR de la CPU. Como señaló Travis Ormandy, se puede usar el siguiente comando para evitar Zenbleed en Linux:
# wrmsr -a 0xc0011029 $(($(rdmsr -c 0xc0011029) | (1<<9)))
En Windows, configurar el registro MSR es más difícil. Solo los controladores a nivel de kernel pueden escribir en el registro MSR. Además, para cargar un controlador a nivel de kernel, debe estar firmado. Por eso decidimos usar el controlador WinRing0 existente de OpenLibSys.org. Escribimos un script de PowerShell que carga WinRing0, envía las solicitudes de escritura MSR adecuadas al controlador y lo descarga inmediatamente después. Actualmente, nuestro script de PowerShell solo funciona cuando Hyper-V está deshabilitado. Nuestro script de PowerShell está alojado aquí: https://github.com/sbaresearch/stop-zenbleed-win
Tenga en cuenta que el script de PowerShell tiene algunas advertencias. Lea la sección 'Advertencias' y realice un análisis de riesgos para su entorno específico antes de usar el script.
Stop-Zenbleed.ps1 en PowerShell 5.x con permisos de administradorNT AUTHORITY\SYSTEM. Una solución real requeriría un cambio en el controlador WinRing0 y por lo tanto una nueva firma, lo cual es complicado. La librería OpenHardwareMonitor, como solución alternativa, corrige los derechos de acceso inmediatamente después de cargar el controlador (https://github.com/openhardwaremonitor/openhardwaremonitor/commit/0e435cafc61fe84d429e8a9500d666e34e3de67b). Nuestro script de PowerShell sortea CVE-2020–14979 descargando inmediatamente el controlador después de establecer el chicken bit. Sin embargo, existe una pequeña ventana de oportunidad cada vez que se ejecuta el script. Dado que establecer el chicken bit no es persistente, el script debe ejecutarse en cada reinicio. En nuestro análisis de riesgos, los beneficios de una protección contra Zenbleed (que puede ocurrir de forma remota) nuevamente superan los riesgos de una escalada de privilegios local. Además, recomendamos ejecutar el script lo más temprano posible en el proceso de arranque para limitar la explotabilidad por parte de los procesos de usuario. Realice un análisis de riesgos para su entorno específico antes de implementar el script de 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
Después de ejecutar nuestro script de PowerShell, el exploit de prueba de concepto (POC) no debería producir más salida.
Stop-Zenbleed.ps1 se proporciona bajo la licencia GNU GPL v3.0: LICENSE