
Windows에서 Zenbleed(CVE-2023-20593) MSR 해결 방법을 적용하는 PowerShell 스크립트
새로 발견된 Zenbleed 취약점(CVE-2023-20593)은 AMD의 모든 Zen2 프로세서에 영향을 줍니다. 안타깝게도 AMD는 2023년 11월 또는 12월까지 많은 프로세서에 마이크로코드 업데이트를 제공하지 않을 예정입니다. 그 사이 어떻게 안전을 유지할 수 있을까요? 다행히도 소프트웨어 해결 방법이 있습니다. Linux에서는 소프트웨어 해결 방법을 적용하는 것이 한 줄이면 되지만, Windows에서는 상황이 더 복잡합니다.
소프트웨어 해결 방법을 적용하려면 MSR CPU 레지스터의 특정 비트(치킨 비트 DE_CFG[9])를 설정해야 합니다.
Travis Ormandy가 지적한 바와 같이 다음 명령을 사용하면 Linux에서 Zenbleed를 피할 수 있습니다:
# wrmsr -a 0xc0011029 $(($(rdmsr -c 0xc0011029) | (1<<9)))
Windows에서 MSR 레지스터를 설정하는 것은 더 어렵습니다. 커널 수준 드라이버만 MSR 레지스터에 쓸 수 있습니다. 게다가 커널 수준 드라이버를 로드하려면 서명이 필요합니다. 그래서 우리는 OpenLibSys.org의 기존 WinRing0 드라이버를 사용하기로 결정했습니다. WinRing0을 로드하고, 드라이버에 적절한 MSR 쓰기 요청을 보낸 다음, 즉시 WinRing0 드라이버를 언로드하는 PowerShell 스크립트를 작성했습니다. 현재 우리의 PowerShell 스크립트는 Hyper-V가 비활성화된 경우에만 작동합니다. 우리의 PowerShell 스크립트는 여기에 호스팅되어 있습니다: https://github.com/sbaresearch/stop-zenbleed-win
PowerShell 스크립트에는 몇 가지 주의사항이 있음을 유의하시기 바랍니다. 스크립트를 사용하기 전에 '주의사항' 섹션을 읽고 사용자 환경에 맞는 위험 분석을 수행하시기 바랍니다.
Stop-Zenbleed.ps1을 실행합니다.NT AUTHORITY\SYSTEM 권한으로의 권한 상승이 가능합니다.
실제 수정은 WinRing0 드라이버의 변경과 그에 따른 새로운 서명이 필요하므로 복잡합니다.
OpenHardwareMonitor 라이브러리는 해결 방법으로 드라이버를 로드한 직후 액세스 권한을 수정합니다(https://github.com/openhardwaremonitor/openhardwaremonitor/commit/0e435cafc61fe84d429e8a9500d666e34e3de67b).
우리의 PowerShell 스크립트는 치킨 비트를 설정한 후 드라이버를 즉시 언로드하여 CVE-2020–14979를 우회합니다.
그러나 스크립트가 실행될 때마다 작은 시간 창의 공격 기회가 존재합니다.
치킨 비트 설정은 영구적이지 않으므로 재부팅할 때마다 스크립트를 실행해야 합니다.
우리의 위험 분석에서는 (원격으로 발생할 수 있는) Zenbleed에 대한 보호의 이점이 로컬 권한 상승의 위험보다 다시 한번 중요하다고 판단했습니다.
또한 사용자 프로세스에 의한 악용 가능성을 제한하기 위해 부팅 프로세스에서 가능한 한 빨리 스크립트를 실행할 것을 권장합니다.
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
PowerShell 스크립트를 실행한 후에는 POC 익스플로잇이 더 이상 출력을 생성하지 않아야 합니다.
Stop-Zenbleed.ps1은 GNU GPL v3.0 라이선스로 제공됩니다: LICENSE