
Script PowerShell pour appliquer le correctif MSR de Zenbleed (CVE-2023-20593) sur Windows
La vulnérabilité Zenbleed récemment découverte (CVE-2023-20593) affecte tous les processeurs Zen2 d'AMD. Malheureusement, AMD ne fournira pas de mises à jour du microcode pour bon nombre de ses processeurs avant novembre ou décembre 2023. Comment rester en sécurité en attendant ? Heureusement, il existe un correctif logiciel. Alors que l'application du correctif logiciel se fait en une ligne sous Linux, les choses sont plus compliquées sous Windows.
Pour appliquer le correctif logiciel, un certain bit (le chicken bit DE_CFG[9]) doit être défini dans le registre MSR du CPU. Comme l'a souligné Travis Ormandy, la commande suivante peut être utilisée pour éviter Zenbleed sous Linux :
# wrmsr -a 0xc0011029 $(($(rdmsr -c 0xc0011029) | (1<<9)))
Sous Windows, la configuration du registre MSR est plus difficile. Seuls les pilotes au niveau du noyau sont autorisés à écrire dans le registre MSR. De plus, pour charger un pilote au niveau du noyau, il doit être signé. C'est pourquoi nous avons décidé d'utiliser le pilote WinRing0 existant d'OpenLibSys.org. Nous avons écrit un script PowerShell qui charge WinRing0, envoie les requêtes d'écriture MSR appropriées au pilote et décharge immédiatement le pilote WinRing0 après. Actuellement, notre script PowerShell ne fonctionne que lorsque Hyper-V est désactivé. Notre script PowerShell est hébergé ici : https://github.com/sbaresearch/stop-zenbleed-win
Veuillez noter que le script PowerShell comporte quelques mises en garde. Veuillez lire la section 'mises en garde' et effectuer une analyse des risques pour votre environnement spécifique avant d'utiliser le script.
Stop-Zenbleed.ps1 dans PowerShell 5.x avec des permissions administrateurNT AUTHORITY\SYSTEM est possible. Une correction réelle nécessiterait une modification du pilote WinRing0 et donc une nouvelle signature, ce qui est compliqué. La bibliothèque OpenHardwareMonitor, en tant que solution de contournement, corrige les droits d'accès immédiatement après le chargement du pilote (https://github.com/openhardwaremonitor/openhardwaremonitor/commit/0e435cafc61fe84d429e8a9500d666e34e3de67b). Notre script PowerShell contourne CVE-2020-14979 en déchargeant immédiatement le pilote après avoir défini le chicken bit. Cependant, une petite fenêtre d'opportunité existe à chaque exécution du script. Étant donné que la définition du chicken bit n'est pas persistante, le script doit être exécuté à chaque redémarrage. Dans notre analyse des risques, les avantages d'une protection contre Zenbleed (qui peut se produire à distance) l'emportent à nouveau sur les risques d'une escalade de privilèges locale. De plus, nous recommandons d'exécuter le script le plus tôt possible dans le processus de démarrage pour limiter l'exploitabilité par les processus utilisateur. Veuillez effectuer une analyse des risques pour votre environnement spécifique avant de déployer le 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
Après avoir exécuté notre script PowerShell, l'exploit POC ne devrait plus produire de sortie.
Stop-Zenbleed.ps1 est fourni sous la licence GNU GPL v3.0 : LICENSE