TLBleed : pourquoi OpenBSD a désactivé l’hyper-threading ?

L’équipe d’OpenBSD a discrètement publié un correctif qui a mis la puce à l’oreille de certains curieux. Des discussions sur la liste de diffusion confirment ces inquiétudes, donc au final ce n’est pas si discret que cela.

Pour la seconde fois durant ce mois de juin, il est découvert une faille spécifique aux processeurs Intel. La précédente est la « Lazy FPU state restore » qui touche la partie de gestion des calculs en vigule flottante (corrigée sur Linux avant que la faille soit connue, et courant juin pour les autres dérivés Unix, le tout avec un faible impact sur les performances, voir impact nul).

La faille TLBleed est liée à la gestion de l’hyper-threading et permet de très efficaces fuites de données. Ben GRAS indique qu’en 17 secondes il récupère une clef secrète EdDSA de 256 bits dans 98 % des cas. C’est aussi grave que les gigantesque failles Spectre et Meltdown d’il y a quelques mois mais… cette fois il est facile de lutter contre : il suffit de désactiver l’hyper-threading.

Pour l’instant les processeurs AMD sont hors de cause, et vu la méthode d’extraction des données il est peu probable qu’ils soient impactés. Cela n’exclut pas qu’une faille différente affecte l’hyper-threading des AMD, mais les recherches sont pour le moment infructueuses, ce qui est plutôt bon signe.

Sur un serveur cloud ou un serveur de virtualisation, l’hyper-threading est en principe déjà désactivé car statistiquement il fait perdre de la puissance. Cela dit l’immense majorité des ingénieurs systèmes ne prennent pas le soin de désactiver cette fonction, et d’ailleurs l’immense majorité ne sait même pas que l’hyper-threading n’est plus un avantage depuis des années sur ces machines.
Pour les serveurs « traditionnels » et les postes de travail, l’hyper-threading est en général activé car il procure un léger gain de performances. Il faut désormais le désactiver, le plus simple et efficace étant la désactivation via le BIOS/UEFI.

Sur un serveur qu’on n’a pas le loisir de redémarrer à volonté, il n’est pas possible de désactiver l’hyper-threading via le BIOS/UEFI. Avec Linux (et les BSD, méthode légèrement différente) il est relativement facile de le faire à la volée pendant que la machine fonctionne. Il faut repérer quels threads appartiennent à quels cœurs : cat /proc/cpuinfo | grep –extended-regexp ‘processor|core id’
On obtient alors pour chaque thread un couple numéro de thread virtuel / numéro de cœur physique. On ne garde alors qu’un thread par cœur physique. En général il faut désactiver la seconde moitié de la liste.
Pour désactiver un thread : echo 0 > /sys/devices/system/cpu/cpuX/online (remplacer X par le numéro du thread). Et voilà, faille colmatée.

Pensez à ajouter dans votre système de monitoring la vérification que l’hyper-threading est bien désactivé !