La technique Zenbleed
(lock.cmpxchg8b.com)- Zenbleed est une vulnérabilité qui exploite la restauration incorrecte d’un
vzerouppermal prédit sur les processeurs AMD Zen 2, permettant de lire les données restantes dans le fichier de registres vectoriels du même cœur physique - Elle est répertoriée sous CVE-2023-20593 et affecte la famille Zen 2, notamment Ryzen 3000/4000/5000 with Radeon Graphics/7020 with Radeon Graphics, Ryzen PRO, Threadripper 3000, EPYC « Rome »
- L’attaque fonctionne lorsque XMM Register Merge Optimization, le renommage de registres et un
vzerouppermal prédit s’enchaînent dans une fenêtre temporelle étroite ; des opérations de base commestrlen,memcpyetstrcmppeuvent également être observées - Une variante optimisée peut exfiltrer environ 30 Ko par seconde et par cœur ; le partage du fichier de registres sur un même cœur physique pose problème au-delà des frontières entre VM, sandbox, conteneurs et processus
- Il est recommandé d’appliquer la mise à jour du microcode AMD ; temporairement, il est possible de définir le chicken bit
DE_CFG[9], mais cela peut avoir un coût en performances et désactiver SMT ne suffit pas à lui seul
Les unités d’exécution ciblées par Zenbleed
- Les CPU x86-64 disposent de registres vectoriels XMM de 128 bits, que les CPU modernes étendent jusqu’aux YMM de 256 bits et aux ZMM de 512 bits
- Les registres vectoriels sont utilisés non seulement pour le calcul numérique, mais aussi dans les fonctions de la bibliothèque C standard de glibc comme
strcmp,memcpyetstrlen - L’implémentation
strlenoptimisée AVX2 de glibc combine plusieurs instructions vectorielles pour trouver la position du premier octet nul dans une chaînevpxor xmm0,xmm0,xmm0met à zéro la partie basse deymm0vpcmpeqb ymm1,ymm0,[rdi]compare les octets de la chaîne avec des octets à zérovpmovmskb eax,ymm1transfère le résultat de la comparaison dans un registre généraltzcnt eax,eaxcalcule la position du premier octet nul
vzeroupper et le fichier de registres
vzeroupperest une instruction qui met à zéro les bits hauts des registres vectoriels- Lorsque des registres
XMMetYMMsont utilisés conjointement, un registreXMMest promu à la largeur complète, ce qui peut créer une dépendance aux bits hauts - glibc utilise
vzeroupperpour éviter des stalls inutiles et faire en sorte que les résultats ultérieurs ne dépendent pas des bits hauts - Le CPU ne place pas chaque registre à un emplacement physique fixe : il gère l’allocation des registres physiques via le Register File et la Register Allocation Table
- Lorsqu’un registre
XMMest mis à zéro, le CPU peut ne pas stocker les bits réels et se contenter de définir un drapeau z-bit dans la RAT- Ce drapeau peut être appliqué indépendamment aux parties haute et basse d’un registre
YMM vzeroupperpeut définir le z-bit puis libérer la ressource correspondante dans le fichier de registres
- Ce drapeau peut être appliqué indépendamment aux parties haute et basse d’un registre
La vulnérabilité créée lors de la restauration de l’exécution spéculative
- Les CPU modernes utilisent l’exécution spéculative : les opérations exécutées sur une branche mal prédite doivent donc être annulées
- Le problème est qu’après l’exécution d’un
vzerouppermal prédit, lors de la restauration, annuler seulement le z-bit ne permet pas de restaurer correctement l’état des ressources du fichier de registres déjà libérées - Avec un ordonnancement précis, il est possible de faire en sorte que certains processeurs se restaurent incorrectement après un
vzerouppermal prédit - Cette technique correspond à CVE-2023-20593 et affecte toute la famille Zen 2
- AMD Ryzen 3000 Series Processors
- AMD Ryzen PRO 3000 Series Processors
- AMD Ryzen Threadripper 3000 Series Processors
- AMD Ryzen 4000 Series Processors with Radeon Graphics
- AMD Ryzen PRO 4000 Series Processors
- AMD Ryzen 5000 Series Processors with Radeon Graphics
- AMD Ryzen 7020 Series Processors with Radeon Graphics
- AMD EPYC “Rome” Processors
Conditions d’attaque et périmètre des fuites
- Pour déclencher le bug, XMM Register Merge Optimization, le renommage de registres et un
vzerouppermal prédit doivent s’enchaîner dans une fenêtre temporelle précise - Une séquence d’instructions d’exemple utilise la structure suivante
vcvtsi2s{s,d}déclenche la merge optimizationvmovdqadéclenche le renommage de registres- Si une branche conditionnelle est taken mais que le CPU prédit le chemin not-taken,
vzeroupperest exécuté à tort de manière spéculative et le bug se produit
- Comme des opérations de base telles que
strlen,memcpyetstrcmputilisent les registres vectoriels, elles peuvent être observées où qu’elles s’exécutent sur le système - Comme le fichier de registres est partagé sur un même cœur physique, d’autres VM, sandbox, conteneurs et processus entrent également dans le périmètre d’impact
- Deux hyperthreads partagent le même fichier de registres physiques
- Une variante optimisée de l’attaque peut exfiltrer environ 30 Ko par seconde et par cœur, un débit suffisant pour surveiller les clés de chiffrement et les mots de passe d’un utilisateur connecté
- L’avis technique et le code associé sont publiés dans le security research repository de Google
- Le code de test est fourni pour Linux, mais le bug ne dépend pas d’un système d’exploitation particulier : tous les systèmes d’exploitation sont affectés
Méthode de découverte : fuzzing CPU et Oracle Serialization
- La vulnérabilité a été découverte par fuzzing
- L’industrie des CPU réalise elle aussi une validation après fabrication du silicium (Post-Silicon Validation) afin de trouver des défauts matériels
- Contrairement au fuzzing classique fondé sur la couverture, les CPU n’ont pas de métrique correspondant directement à la couverture de code
- À la place, des performance counters sont utilisés pour fournir au fuzzer un retour sur des événements architecturaux intéressants
- Cette méthode permet d’explorer des séquences d’instructions difficiles à découvrir par hasard
- Elle a permis de découvrir automatiquement des fonctionnalités comme la merge optimization
- Le fuzzing logiciel recherche généralement des crashs, mais dans des programmes CPU générés aléatoirement, un crash peut lui-même être un comportement correct
- Une approche existante, reversi, génère l’opération inverse de chaque instruction aléatoire et vérifie si l’état final diffère de l’état initial
- Sur une architecture CISC comme x86, la génération de cas de test devient complexe
- Une autre méthode consiste à utiliser un oracle pour comparer les résultats du CPU testé avec ceux d’un autre CPU ou d’un simulateur
- Oracle Serialization combine ces deux idées
- Un programme aléatoire est généré, puis automatiquement transformé sous une forme sérialisée
- Des éléments de sérialisation comme store/load barrier, speculation fence et cache line flush sont ajoutés
- Le programme original et le programme sérialisé doivent produire la même sortie, même si leurs caractéristiques de performance diffèrent
- Si les états finaux ne correspondent pas, il peut s’agir d’une erreur d’exécution microarchitecturale, et cette divergence a mené à la découverte de Zenbleed
Correctifs et limites de la détection
- La vulnérabilité a été signalée à AMD le 15 mai 2023
- AMD a publié une mise à jour du microcode pour les processeurs affectés
- Les fournisseurs de BIOS ou de systèmes d’exploitation peuvent déjà proposer des correctifs incluant cette mise à jour
- La mesure recommandée est d’appliquer la mise à jour du microcode
- Lorsqu’il n’est pas possible d’appliquer la mise à jour, il est possible, comme contournement logiciel, de définir le chicken bit
DE_CFG[9]- Cela peut avoir un coût en performances
- Sous Linux, il est possible de le définir sur tous les cœurs avec
msr-tools - Sous FreeBSD, il faut utiliser
cpucontrol(8) - Pour les autres systèmes d’exploitation, si vous ne savez pas comment configurer les MSR, une assistance du fournisseur est nécessaire
- Désactiver SMT ne suffit pas
- Aucune technique fiable de détection d’attaque n’est connue
- Parce qu’aucun appel système ni privilège particulier n’est nécessaire
- Il n’est pas non plus possible de détecter statiquement un usage inapproprié de
vzeroupper
1 commentaires
Avis de Hacker News
C’est vraiment impressionnant, et cela pourrait devenir un cas d’école montrant qu’exécuter quelque chose dans une VM ne le rend pas sûr pour autant
Les évasions de VM ont toujours été connues, mais ici il s’agit d’une vulnérabilité à grande échelle, simple à exploiter et très rentable, même sans évasion
Le fait que ce bug soit corrigé par du microcode ne signifie pas qu’il n’existe pas d’autres bugs similaires. Beaucoup de 0-day sont souvent connus des mercenaires black hats bien avant d’être rendus publics
Vulnérabilités CPU découvertes ces dernières années :
https://en.wikipedia.org/wiki/Meltdown_(security_vulnerability)
https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)
https://aepicleak.com/
https://en.wikipedia.org/wiki/Software_Guard_Extensions#SGAxe
https://en.wikipedia.org/wiki/Software_Guard_Extensions#LVI
https://en.wikipedia.org/wiki/Software_Guard_Extensions#Plundervolt
https://en.wikipedia.org/wiki/Software_Guard_Extensions/…
https://en.wikipedia.org/wiki/Software_Guard_Extensions#Enclave_attack
https://en.wikipedia.org/wiki/Software_Guard_Extensions/…
https://www.vusec.net/projects/crosstalk/
https://en.wikipedia.org/wiki/Hertzbleed
https://securityweek.com/amd-processors-expose-sensitive-data-new-squi…
Elle n’interprète pas les instructions via un grand
switch; elle les exécute sur le CPU réel et s’appuie sur quelques flags matériels par lesquels le CPU garantit que les données ou les instructions ne se chevauchent pas. Le CPU le promet, mais dans la réalité il est difficile de tenir ce genre de promesseDans leur cas, le CPU faisait exactement ce qu’il était censé faire, mais cela a rendu possible une forme d’attaque entièrement nouvelle basée sur le timing ; Zenbleed ressemble davantage à un bug traditionnel où des données qui ne devraient pas s’y trouver restent dans des registres
Je pense que beaucoup de ces vulnérabilités viennent du fait que le logiciel et le matériel ne se parlent pas correctement. Côté logiciel, on fait des hypothèses sur les garanties d’isolation ; côté matériel, on ne signale pas assez clairement quand de telles hypothèses risquent d’apparaître
La prédiction de branchement semble soit intrinsèquement trop complexe, au point d’être toujours exposée à ce type de vulnérabilité, soit trop éloignée de notre manière intuitive de comprendre les chemins de code et l’exécution des instructions, ce qui rend difficile d’imaginer les cas limites avant qu’il ne soit trop tard
La complexité des architectures CPU finira-t-elle, à partir d’un certain point, par devenir trop difficile à raisonner, au point que nous accepterons la perte de performance liée au fait de les garder plus simples ?
Je l’ai signalé et recommandé de les isoler physiquement sur des hyperviseurs séparés, mais on m’a toujours ignoré. Au final, ce sera sans doute leur problème
Le README du fichier tar de l’exploit contient davantage de détails ainsi que le calendrier de divulgation
2023-05-09Un composant du pipeline de validation CPU produit un résultat anormal2023-05-12Le problème est isolé et reproduit avec succès, l’enquête se poursuit2023-05-14La portée et la gravité du problème sont déterminées2023-05-15Rédaction d’un bref rapport d’état et partage avec l’AMD PSIRT2023-05-17AMD confirme la réception du rapport et reconnaît que le problème est reproductible2023-05-17Développement d’un PoC fiable terminé et partagé avec AMD2023-05-19Début de la notification aux principaux fournisseurs de noyaux et d’hyperviseurs2023-05-23Réception d’une mise à jour de microcode bêta pour Rome de la part d’AMD2023-05-24Confirmation que la mise à jour corrige le problème et information transmise à AMD2023-05-30AMD indique avoir envoyé un avis de sécurité à ses partenaires2023-06-12Réunion avec AMD pour discuter de l’état et des détails2023-07-20AMD publie le correctif sans préavis, avant la date d’embargo convenue2023-07-21Puisque le correctif est public, proposition d’informer en privé les principales distributions afin qu’elles préparent des mises à jour de leurs paquets de firmware2023-07-24divulgation publiqueLe correctif a été publié avant l’embargo convenu, puis seulement ensuite la démarche est devenue d’informer en privé les principales distributions qu’elles devaient préparer leurs paquets de firmware
amd-ucode 20230625.ee91452d-5d’Arch Linux inclut la mise à jour de microcode qui corrige ce problèmehttps://archlinux.org/packages/core/any/amd-ucode/ a été mis à jour pour la dernière fois le 2023-07-25 à 11:48 UTC, et https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin... indique que la version corrigée date du 2023-07-18
Au début, à cause de
_tag=20230625dans le PKGBUILD et desource=("git+[https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin...](<https://git.kernel.org/pub/scm/…;)"), je pensais qu’il utilisait encore le firmware 20230625Mais le tableau
_backportscontient deux commits cherry-pick modifiés il y a 20 heures, etb250b32ab1d044953af2dc5e790819a7703b7ee6dans https://gitlab.archlinux.org/archlinux/packaging/packages/li... correspond au commit kernel.org lié plus haut ; on peut donc espérer qu’Arch à jour ne soit pas vulnérable à ZenbleedC’est vraiment effrayant. Sur ma machine Zen 2, un Ryzen 3600, j’ai exécuté l’exploit avec un utilisateur non privilégié, puis copié-collé une chaîne dans un éditeur de texte en arrière-plan (Kate) : en quelques secondes, des fragments de cette chaîne étaient enregistrés dans la sortie de zenbleed
Heureusement, cet exploit dépend fortement d’une routine assembleur précise, donc il semble très difficile à exploiter depuis le JS ou le WASM d’un navigateur. Sinon, il suffirait sans doute de laisser un onglet malveillant ouvert en arrière-plan pendant quelques heures pour provoquer facilement une fuite
J’attends que les mainteneurs Fedora publient le nouveau microcode afin que le noyau puisse le charger au démarrage
En même temps, j’espère que des correctifs logiciels dans V8 et SpiderMonkey arriveront plus tôt et apporteront une atténuation supplémentaire
Cela dit, un exploit JS aurait aussi besoin d’une méthode pour exfiltrer les données, et il me semble assez difficile de la dissimuler complètement
"No such file or directory"et une erreur 127Le fait qu’OpenBSD ait ajouté le chargement du microcode AMD au cours des trois derniers jours ne ressemble pas à une coïncidence
https://news.ycombinator.com/item?id=36838511
La formulation selon laquelle AMD aurait publié une mise à jour du microcode pour les processeurs affectés ne me semble pas exacte
AMD a publié une mise à jour du microcode[0] pour les modèles family 17h
0x31et0xa0, ce qui correspond, d’après WikiChip[1], à Rome, Castle Peak et MendocinoJusqu’à présent, il ne semble pas y avoir de mise à jour du microcode pour Renoir, Grey Hawk, Lucienne, Matisse ni Van Gogh. Heureusement, le nouveau kernel peut simplement définir le chicken bit pour ceux-ci, et c’est effectivement ce qu’il fait[2]
[0] https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin...
[1] https://en.wikichip.org/wiki/amd/cpuid#Family_23_.2817h.29
[2] https://github.com/torvalds/linux/commit/522b1d69219d8f08317...
good_revsse trouve ici : https://github.com/torvalds/linux/commit/522b1d69219d8f08317...Les révisions actuellement publiques (
Patch) sont consultables ici, à partir du HEAD de git : https://git.kernel.org/pub/scm/linux/kernel/git/firmware/lin...Au moment où j’écris ceci, seules deux des cinq
good_revsont publiquesCe Celeron était célèbre pour son overclocking de 50 % : https://ark.intel.com/content/www/us/en/ark/products/codenam...
En regardant la partie concernée, cette technique correspond à CVE-2023-20593, fonctionne sur tous les processeurs de classe Zen 2 et inclut au moins les produits suivants
AMD Ryzen 3000 Series Processors
AMD Ryzen PRO 3000 Series Processors
AMD Ryzen Threadripper 3000 Series Processors
AMD Ryzen 4000 Series Processors with Radeon Graphics
AMD Ryzen PRO 4000 Series Processors
AMD Ryzen 5000 Series Processors with Radeon Graphics
AMD Ryzen 7020 Series Processors with Radeon Graphics
AMD EPYC “Rome” Processors
Est-il possible que la même technique, ou une technique similaire, fonctionne aussi sur des cœurs Zen/Zen+ plus anciens ou Zen 3 plus récents, sans que cela ait encore été démontré ?
Mon
AMD Ryzen 9 5950x Desktop Processora lui aussi l’air d’être en Zen 3, donc ça devrait allerJe n’exécute pas de workloads non fiables, mais comme on dit, la chance sourit aux gens préparés
Le site est en train de mourir sous le trafic : https://web.archive.org/web/20230724143835/https://lock.cmpx...
Dans la plupart des cas, le trafic de HN atteint à peine 100 pages vues par seconde
https://www.amd.com/en/resources/product-security/bulletin/a...
D’après le bulletin de sécurité d’AMD, les mises à jour de firmware pour les CPU non EPYC ne sortiront pas avant la fin de l’année. D’ici là, les utilisateurs doivent-ils désactiver le chicken bit et accepter la perte de performances ?
Aussi impressionnant qu’effrayant. J’ai fait tourner un échantillon de 10 Mo pendant 1 minute, et j’ai pu « divulguer » une partie de mon mot de passe Bitwarden, mon mot de passe de connexion ssh et des fragments d’identifiants bancaires, qui étaient faciles à reconstituer
L’article était vraiment excellent. J’ai particulièrement aimé la partie qui explique comment déterminer si un programme généré aléatoirement s’est exécuté correctement.
L’approche évidente consiste à l’exécuter sur un oracle, comme un autre processeur ou un simulateur, pour vérifier qu’il se comporte de la même manière.
Mais pour observer des effets microarchitecturaux dans une fenêtre temporelle étroite, on peut aussi écrire le même programme en y insérant divers
stall,fence,nop, etc. Dans du code monothread, cela ne devrait pas affecter la sortie, mais en interne, le CPU finit par faire des choses assez différentes au niveau microarchitectural. Ainsi, le CPU peut devenir son propre oracle.J’ai aussi bien aimé le chicken bit.