Condition de concurrence dans le garbage collector du noyau Linux pouvant conduire à une élévation de privilèges

Jann Horn de l'équipe Google Project Zero, qui a identifié les vulnérabilités Spectre et Meltdown, a publié une technique pour exploiter une vulnérabilité (CVE-2021-4083) dans le garbage collector du noyau Linux. La vulnérabilité est due à une condition de concurrence critique lors du nettoyage des descripteurs de fichiers sur les sockets Unix et permet potentiellement à un utilisateur local non privilégié d'exécuter son code au niveau du noyau.

Le problème est intéressant car la fenêtre de temps pendant laquelle la condition de concurrence se produit a été estimée trop courte pour créer de véritables exploits, mais l'auteur de l'étude a montré que même de telles vulnérabilités initialement sceptiques peuvent devenir la source de véritables attaques si le créateur de l'exploit a les compétences et le temps nécessaires. Yann Horn a montré comment, à l'aide de manipulations en filigrane, vous pouvez réduire la condition de concurrence critique qui se produit lors de l'appel simultané des fonctions close() et fget() en une vulnérabilité d'utilisation après libération entièrement exploitable et accéder à des données déjà libérées. structure à l’intérieur du noyau.

Une condition de concurrence critique se produit lors du processus de fermeture d'un descripteur de fichier lors de l'appel simultané de close() et de fget(). L'appel à close() peut s'exécuter avant fget(), ce qui perturbera le garbage collector car, selon le refcount, la structure du fichier n'aura pas de références externes, mais restera attachée au descripteur de fichier, c'est-à-dire Le garbage collector pensera qu'il a un accès exclusif à la structure, mais en fait, pendant une courte période, l'entrée restante dans la table des descripteurs de fichiers indiquera toujours que la structure est en cours de libération.

Pour augmenter la probabilité d'entrer dans une condition de concurrence, plusieurs astuces ont été utilisées, ce qui a permis d'augmenter la probabilité de réussite de l'exploitation à 30 % lors de l'introduction d'optimisations spécifiques au système. Par exemple, pour augmenter le temps d'accès à une structure avec des descripteurs de fichiers de plusieurs centaines de nanosecondes, les données étaient évincées du cache du processeur en jonchant le cache d'activité sur un autre cœur du CPU, ce qui permettait de récupérer la structure depuis la mémoire plutôt que depuis le cache CPU rapide.

La deuxième fonctionnalité importante était l'utilisation d'interruptions générées par un temporisateur matériel pour augmenter le temps de condition de concurrence. Le moment a été choisi pour que le gestionnaire d'interruption se déclenche lorsqu'une condition de concurrence critique se produit et interrompt l'exécution du code pendant un certain temps. Pour retarder davantage le retour du contrôle, environ 50 XNUMX entrées dans la file d'attente ont été générées à l'aide d'epoll, ce qui a nécessité une recherche via le gestionnaire d'interruption.

La technique permettant d'exploiter la vulnérabilité a été divulguée après une période de non-divulgation de 90 jours. Le problème apparaît depuis le noyau 2.6.32 et a été corrigé début décembre. Le correctif a été inclus dans le noyau 5.16 et a également été transféré vers les branches LTS du noyau et les packages de noyau fournis dans les distributions. Il est à noter que la vulnérabilité a été identifiée lors de l'analyse d'un problème similaire CVE-2021-0920, qui se manifeste dans le garbage collector lors du traitement de l'indicateur MSG_PEEK.

Source: opennet.ru

Ajouter un commentaire