Une vulnérabilité a été identifiée dans le noyau Linux (CVE-2021-33624), permettant d'utiliser le sous-système eBPF pour contourner la protection contre les failles de type Spectre, ce qui permet de déterminer le contenu de la mémoire en créant des conditions pour l'exécution spéculative de certaines opérations. Une attaque Spectre nécessite la présence d'une séquence d'instructions spécifique dans un code privilégié, entraînant l'exécution spéculative d'instructions. Par le biais de la manipulation des programmes BPF à exécuter, il est possible de générer des instructions similaires dans eBPF et d'entraîner une fuite via des canaux secondaires du contenu de la mémoire du noyau et de zones arbitraires de la mémoire physique.
La vulnérabilité est causée par des lacunes dans le vérificateur, qui est utilisé pour détecter les erreurs et les activités inacceptables dans les programmes BPF. Le vérificateur explore les chemins d'exécution possibles du code, mais omet les options de branchement qui sont inacceptables du point de vue sémantique de l'architecture de l'ensemble d'instructions. Lors de l'exécution d'un programme BPF, de telles options de branchement, non prises en compte par le vérificateur, peuvent être mal prédites par le processeur et exécutées en mode spéculatif. Par exemple, lors de l'analyse de l'opération «load», le vérificateur suppose qu'une instruction utilise un registre avec une adresse dont la valeur se trouve toujours dans les limites spécifiées, mais un attaquant peut créer des conditions où le processeur tentera d'exécuter de manière spéculative une opération avec une adresse ne correspondant pas aux conditions de vérification.
Le problème apparaît à partir de la version 4.15 du noyau et est corrigé sous forme de patches (1, 2, 3, 4). Dans les distributions, la vulnérabilité reste pour l'instant non corrigée (Debian, RHEL, Ubuntu, Fedora, SUSE, Arch).
De plus, on peut noter une remarque sur l'impact sur les performances des outils de protection contre les failles de type Spectre. La remarque résume les résultats de l'optimisation du débogueur rr (Record and Replay), initialement développé par Mozilla pour déboguer des erreurs difficiles à reproduire dans Firefox. Le cache des appels système utilisés pour vérifier l'existence de répertoires a permis de réduire le temps d'exécution de l'opération «rr sources» pour un projet de test de 3 minutes et 19 secondes à 36 secondes.
L'auteur de l'optimisation a décidé de vérifier comment la performance changerait après la désactivation de la protection contre Spectre. Après avoir démarré le système avec le paramètre « mitigations=off », le temps d'exécution de « rr sources » sans optimisation était de 2 minutes 5 secondes (une amélioration de 1,6 fois), et avec optimisation — 33 secondes (9 % plus rapide). Il est intéressant de noter que la désactivation de la protection contre Spectre a non seulement réduit le temps d'exécution du code au niveau du noyau de 1,4 fois (de 2m9s à 1m32s), mais également diminué le temps d'exécution en mode utilisateur de moitié (de 1m9s à 0m33s), probablement en raison d'une réduction de l'efficacité du cache CPU et des vidages TLB lorsque la protection contre Spectre est activée.
Source : opennet.ru
