
Outils pour tester l'atténuation du noyau Linux pour CVE-2018-3639 (alias Variant 4) en utilisant la fonctionnalité Speculative Store Bypass Disable (SSBD) des processeurs x86
Le projet ssbd-tools est une collection de programmes qui utilisent la fonctionnalité de désactivation du contournement de magasin spéculatif (SSBD) fournie par les processeurs x86. SSBD est une mitigation basée sur le processeur pour l'attaque de contournement de magasin spéculatif, appelée Variant 4 et identifiée par CVE-2018-3639. Le noyau Linux a introduit des contrôles par processus pour utiliser SSBD et ces outils peuvent être utilisés pour exploiter ces contrôles et aider à vérifier leur exactitude.
Le noyau Linux fournit plusieurs modes de fonctionnement différents, qui peuvent être sélectionnés au démarrage avec le paramètre noyau spec_store_bypass_disable, pour SSBD sur un système x86. La documentation des paramètres du noyau les décrit bien. Voici un extrait de ce document décrivant les options :
on - Unconditionally disable Speculative Store Bypass
off - Unconditionally enable Speculative Store Bypass
auto - Kernel detects whether the CPU model contains an
implementation of Speculative Store Bypass and
picks the most appropriate mitigation. If the
CPU is not vulnerable, "off" is selected. If the
CPU is vulnerable the default mitigation is
architecture and Kconfig dependent. See below.
prctl - Control Speculative Store Bypass per thread
via prctl. Speculative Store Bypass is enabled
for a process by default. The state of the control
is inherited on fork.
seccomp - Same as "prctl" above, but all seccomp threads
will disable SSB unless they explicitly opt out.
Not specifying this option is equivalent to
spec_store_bypass_disable=auto.
Default mitigations:
X86: If CONFIG_SECCOMP=y "seccomp", otherwise "prctl"
La fonctionnalité SSBD est activée/désactivée en définissant un seul bit dans un registre spécifique au modèle (MSR) du processeur. L'emplacement exact du MSR et du bit à l'intérieur du MSR diffère selon les fabricants de processeurs, parmi les familles de processeurs d'un même fabricant, et selon que le noyau s'exécute ou non sous un hyperviseur. Ces outils suivent les directives publiées par Intel et AMD pour décider où se trouve le bit SSBD pour l'environnement d'exécution actuel.
Certains systèmes peuvent ne pas avoir le support SSBD disponible. Cela peut être dû à un certain nombre de raisons :
intel-microcode et amd64-microcode pour Debian/Ubuntu). Les processeurs AMD des familles 15h, 16h et 17h ne nécessitent pas de microcode mis à jour.Le programme ssbd-exec utilise les contrôles SSBD par processus avant d'exécuter un autre programme. Il peut utiliser le prctl PR_SET_SPECULATION_CTRL pour autoriser la spéculation (-p enable pour utiliser PR_SPEC_ENABLE), interdire la spéculation via SSBD (-p disable pour utiliser PR_SPEC_DISABLE), ou interdire définitivement la spéculation dans tous les futurs processus enfants via SSBD (-p force-disable pour utiliser PR_SPEC_FORCE_DISABLE).
Il peut également charger un filtre seccomp permissif (-s empty) qui, par défaut sur x86, inclut le processus dans la mitigation SSBD. Il existe également une option (-s spec-allow) pour charger un filtre permissif qui n'inclut pas le processus dans SSBD.
$ ./ssbd-exec -- grep Spec /proc/self/status
Speculation_Store_Bypass: thread vulnerable
$ ./ssbd-exec -p disable -- grep -e Spec -e Seccomp /proc/self/status
Seccomp: 0
Speculation_Store_Bypass: thread mitigated
$ ./ssbd-exec -s empty -- grep -e Spec -e Seccomp /proc/self/status
Seccomp: 2
Speculation_Store_Bypass: thread force mitigated
Le programme ssbd-verify valide que le bit SSBD réel, dans le MSR et le décalage de bit spécifiques à votre processeur, a la valeur attendue. 0 signifie que SSBD n'est pas utilisé tandis que 1 signifie qu'il est utilisé.
Le programme peut également être utilisé pour valider que la valeur prctl PR_GET_SPECULATION_CTRL de la tâche est définie pour autoriser la spéculation (-p enable pour vérifier PR_SPEC_ENABLE), interdire la spéculation via SSBD (-p disable pour vérifier PR_SPEC_DISABLE), ou interdire définitivement la spéculation dans tous les futurs processus enfants via SSBD (-p force-disable pour vérifier PR_SPEC_FORCE_DISABLE).
Le programme peut être configuré pour vérifier à plusieurs reprises la valeur du bit SSBD à l'aide de l'option -t SECONDS. Si SECONDS est 0, le programme boucle indéfiniment tout en vérifiant le bit SSBD. Une valeur non nulle pour SECONDS fait vérifier le bit SSBD pendant le temps spécifié.
Ce programme nécessite que le module noyau msr soit chargé et que l'utilisateur dispose des privilèges root pour lire le bit SSBD à partir du MSR approprié.
$ sudo ./ssbd-verify 0
$ sudo ./ssbd-verify 1
FAIL: SSBD bit verification failed (expected 1, got 0)
$ ./ssbd-exec -p disable -- sudo ./ssbd-verify 1
$ sudo ./ssbd-exec -s empty -- ./ssbd-verify 1
Remarque : La commande ci-dessus nécessite l'utilisation de sudo sur ssbd-exec car NO_NEW_PRIVS est utilisé avant de charger le filtre seccomp. sudo ne pourrait pas élever les privilèges s'il était utilisé après que NO_NEW_PRIVS soit défini.
Le programme ssbd-toggle bascule simplement le bit SSBD entre l'état activé et désactivé dans une boucle infinie jusqu'à ce que le programme soit terminé. Il peut être utilisé conjointement avec ssbd-verify pour s'assurer que le processus ssbd-verify a toujours la valeur de bit SSBD attendue lorsque le noyau passe à sa tâche.
Ce programme nécessite que le module noyau msr soit chargé et que l'utilisateur dispose des privilèges root pour lire et écrire dans le MSR approprié.
$ sudo ./ssbd-toggle
^C
Pour construire les outils, exécutez make :
$ make
Pour exécuter quelques tests automatisés de base pour vous assurer que SSBD fonctionne comme prévu sur votre système, exécutez la cible check en tant que root :
$ sudo make check
PASS