
Script PowerShell para aplicar a solução alternativa MSR do Zenbleed (CVE-2023-20593) no Windows.
A vulnerabilidade Zenbleed recentemente descoberta (CVE-2023-20593) afeta todos os processadores Zen2 da AMD. Infelizmente, a AMD não fornecerá atualizações de microcódigo para muitos de seus processadores até novembro ou dezembro de 2023. Como se manter seguro nesse meio tempo? Felizmente, existe uma solução alternativa por software. Embora aplicar a solução alternativa por software seja uma linha de comando no Linux, as coisas são mais complicadas no Windows.
Para aplicar a solução alternativa por software, um determinado bit (o chicken bit DE_CFG[9]) deve ser definido no registrador MSR da CPU.
Como apontado por Travis Ormandy, o seguinte comando pode ser usado para evitar o Zenbleed no Linux:
# wrmsr -a 0xc0011029 $(($(rdmsr -c 0xc0011029) | (1<<9)))
No Windows, definir o registrador MSR é mais difícil. Apenas drivers em nível de kernel podem escrever no registrador MSR. Além disso, para carregar um driver em nível de kernel, ele precisa ser assinado. É por isso que decidimos usar o driver WinRing0 existente do OpenLibSys.org. Escrevemos um script PowerShell que carrega o WinRing0, envia as solicitações de gravação MSR apropriadas para o driver e descarrega o driver WinRing0 imediatamente depois. Atualmente, nosso script PowerShell funciona apenas quando o Hyper-V está desabilitado. Nosso script PowerShell está hospedado aqui: https://github.com/sbaresearch/stop-zenbleed-win
Observe que o script PowerShell tem algumas ressalvas. Leia a seção 'ressalvas' e realize uma análise de risco para seu ambiente específico antes de usar o script.
Stop-Zenbleed.ps1 em um PowerShell 5.x com permissões de administradorNT AUTHORITY\SYSTEM.
Uma correção real exigiria uma alteração no driver WinRing0 e, portanto, uma nova assinatura, o que é complicado.
A biblioteca OpenHardwareMonitor, como solução alternativa, corrige os direitos de acesso imediatamente após carregar o driver (https://github.com/openhardwaremonitor/openhardwaremonitor/commit/0e435cafc61fe84d429e8a9500d666e34e3de67b).
Nosso script PowerShell contorna a CVE-2020–14979 descarregando imediatamente o driver após definir o chicken bit.
No entanto, existe uma pequena janela de oportunidade cada vez que o script é executado.
Como definir o chicken bit não é persistente, o script precisa ser executado a cada reinicialização.
Em nossa análise de risco, os benefícios da proteção contra o Zenbleed (que pode ocorrer remotamente) novamente superam os riscos de um escalonamento local de privilégios.
Além disso, recomendamos executar o script o mais cedo possível no processo de inicialização para limitar a exploração por processos de usuário.
Realize uma análise de risco para seu ambiente específico antes de implantar o 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
Após executar nosso script PowerShell, o exploit de prova de conceito não deve produzir mais saída.
Stop-Zenbleed.ps1 é fornecido sob a licença GNU GPL v3.0: LICENSE