Désactiver l’Hyper-Threading pour se protéger des failles

Avec la dernière faille en date dans les processeurs d’Intel, Apple propose une solution assez radicale pour éviter les problèmes : désactiver l’Hyper-Threading.

Je vais essayer de faire clair (en simplifiant un peu). Dans les processeurs Intel, depuis un moment maintenant, la société a intégré une fonction qui s’appelle Hyper-Threading. Elle simule deux coeurs à partir d’un seul, en prenant en compte le fait qu’un processeur contient différentes unités. Le but, c’est que si vous avez un programme qui utilise essentiellement des calculs sur les entiers, la partie dédiée aux calculs sur les flottants puisse travailler. En simulant un second coeur, on peut effectuer des calculs sur les entiers et les flottants en même temps. C’est résumé et un peu simplifié, mais l’idée est là : utiliser au maximum le processeur. Le problème, depuis plusieurs mois, c’est que des failles liées à ce fonctionnement existent. Là aussi en simplifiant, elles utilisent l’Hyper-Threading pour essayer de lire des données qui sont gérée par un autre threads. La solution bête et méchante pour éviter les soucis consiste donc à désactiver l’Hyper-Threading.

Et comme il n’y a pas d’EFI accessible aux utilisateurs sur les Mac, ça passe par une mise à jour de l’OS (10.14.5 ou les mises à jour de sécurité de High Sierra et Sierra) et des commandes précises.

Il faut démarrer sur la partition de restauration (command + R au démarrage), lancer le Terminal (Utilitaires -> Terminal) et taper deux lignes.

nvram boot-args="cwae=2"
nvram SMTDisable=%01

Au redémarrage, comme le montre mes captures sur un MacBook Air, l’Hyper-Threading est bien désactivé et il se retrouve avec deux coeurs visibles au lieu de quatre.

Avant


Avant


Après


Après

Pour revenir au comportement classique, il faut faire un reset de la NVRAM (option + command + P + R au démarrage). Attention aussi, ça ne fonctionne qu’avec macOS Sierra, High Sierra et Mojave, et uniquement avec un OS à jour. Si vous avez El Capitan (par exemple) ou Windows, rien ne change. Visiblement, la commande indique à l’OS de désactiver l’Hyper-Threading, ce n’est pas l’EFI qui le fait.

La solution d’Apple est tout de même violente. Parce que désactiver l’Hyper-Threading implique une perte de performances assez élevés. Sur certains calculs, l’Hyper-Threading donne des gains de l’ordre de 30 à 40 %. Qui plus est, ça ne règle pas tout : le problème vient aussi du fait que l’exécution OoO (Out of Order) pose des soucis en général. Là aussi en résumé, l’OoO permet au CPU d’exécuter les instructions dans le désordre pour optimiser les performances, en essayant de deviner (avec un taux de réussite élevé) le meilleur ordre possible. Revenir à une architecture sans OoO n’est absolument pas envisageable, tant les performances diminueraient. Chez Intel, l’OoO existe depuis le Pentium Pro (vers 1996) et en-dehors des Atom – bas de gamme, lent -, tous les CPU le font. Apple, avec les processeurs ARM de l’iPhone (et bientôt des Mac) n’est donc pas totalement à l’abri. Les failles liées à l’Hyper-Threading ne touchent évidemment pas les puces Apple (qui n’ont même pas de SMT à ma connaissance) par contre.

A noter que le problème de l’Hyper-Threading ne touche logiquement pas les Mac en Core 2 Duo vu qu’ils ne possèdent pas la fonction. Ca touche uniquement les machines à base de Core ix. Et c’est visiblement aussi le moment d’abandonner El Capitan, qui n’a pas reçu de mise à jour.

Enfin, la question qui fâche : faut-il désactiver l’Hyper-Threading ? Globalement, non. Safari contient une protection qui suffit pour un usage classique, et les risques sont extrêmement faibles. Sauf si votre Mac sert pour un usage vraiment important qui nécessite une sécurité hors-norme, désactiver l’Hyper-Threading n’a pas de sens.