
Windows上でZenbleed (CVE-2023-20593) MSRワークアラウンドを適用するPowerShellスクリプト
新しく発見された Zenbleed 脆弱性 (CVE-2023-20593) は、AMD のすべての Zen2 プロセッサに影響を与えます。 残念ながら、AMD は多くのプロセッサについて、2023 年 11 月または 12 月までマイクロコード更新を提供しない予定です。 それまでの間、どうすれば安全を保てるのでしょうか? 幸いなことに、ソフトウェアによる回避策があります。 ソフトウェアによる回避策の適用は Linux では 1 行で済みますが、Windows ではより複雑です。
ソフトウェアによる回避策を適用するには、MSR CPU レジスタ内の特定のビット (chicken bit 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 スクリプトは、chicken bit を設定した直後にドライバをアンロードすることで CVE-2020–14979 を回避しています。
ただし、スクリプトを実行するたびに、悪用される可能性のある小さな時間枠が存在します。
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