
Скрипт PowerShell для применения обходного решения MSR для Zenbleed (CVE-2023-20593) в Windows
Недавно обнаруженная уязвимость Zenbleed (CVE-2023-20593) затрагивает все процессоры AMD Zen2. К сожалению, AMD не предоставит обновления микрокода для многих своих процессоров до ноября или декабря 2023 года. Как оставаться в безопасности в промежутке? К счастью, существует программный обходной путь. Хотя применение программного обходного пути в Linux — это одна команда, в Windows дела обстоят сложнее.
Для применения программного обходного пути необходимо установить определённый бит (chicken bit DE_CFG[9]) в регистре CPU MSR.
Как указал Трэвис Орманди, следующая команда может использоваться для предотвращения Zenbleed в Linux:
# wrmsr -a 0xc0011029 $(($(rdmsr -c 0xc0011029) | (1<<9)))
В Windows установка регистра MSR более сложна. Только драйверы уровня ядра имеют право записывать в регистр MSR. Кроме того, для загрузки драйвера уровня ядра он должен быть подписан. Именно поэтому мы решили использовать существующий драйвер WinRing0 от OpenLibSys.org. Мы написали PowerShell-скрипт, который загружает WinRing0, отправляет соответствующие запросы на запись в MSR драйверам и сразу после этого выгружает драйвер WinRing0. В настоящее время наш PowerShell-скрипт работает только при отключённом Hyper-V. Наш PowerShell-скрипт размещён здесь: https://github.com/sbaresearch/stop-zenbleed-win
Обратите внимание, что PowerShell-скрипт имеет ряд предостережений. Пожалуйста, прочитайте раздел «Предостережения» и проведите анализ рисков для вашего конкретного окружения перед использованием скрипта.
Stop-Zenbleed.ps1 в PowerShell 5.x с правами администратораNT AUTHORITY\SYSTEM.
Настоящее исправление потребовало бы изменения драйвера WinRing0 и, следовательно, новой подписи, что сложно.
Библиотека OpenHardwareMonitor в качестве обходного пути исправляет права доступа сразу после загрузки драйвера (https://github.com/openhardwaremonitor/openhardwaremonitor/commit/0e435cafc61fe84d429e8a9500d666e34e3de67b).
Наш PowerShell-скрипт обходит CVE-2020–14979, немедленно выгружая драйвер после установки chicken bit.
Однако при каждом выполнении скрипта существует небольшое временное окно для атаки.
Поскольку установка chicken bit не сохраняется, скрипт необходимо запускать при каждой перезагрузке.
В нашем анализе рисков преимущества защиты от 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