
Étude de cas pédagogique et parcours de développement d'exploit pour CVE-2022-0185, un dépassement de tampon basé sur le tas du noyau Linux permettant une escalade de privilèges locale. Inclut un POC, un débogage QEMU et un exploit Ubuntu avec une analyse technique détaillée.
Cette étude de cas est le résultat d'un travail dans le cadre du cours ECE 9069: Introduction to Hacking : https://whisperlab.org/introduction-to-hacking/
CVE-2022-0185 est un défaut de dépassement de tampon basé sur le tas (heap-based buffer overflow) découvert dans la manière dont la fonction legacy_parse_param de la fonctionnalité Filesystem Context du noyau Linux vérifiait la longueur des paramètres fournis. Un utilisateur local non privilégié (dans le cas où les espaces de noms non privilégiés sont activés, sinon nécessite le privilège CAP_SYS_ADMIN dans l'espace de noms) capable d'ouvrir un système de fichiers qui ne prend pas en charge l'API Filesystem Context (et qui retombe donc sur la gestion héritée) pourrait exploiter ce défaut pour élever ses privilèges sur le système. [1]
Après la divulgation de cette vulnérabilité, un correctif a été publié pour résoudre ce bogue :
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=722d94847de2
https://ubuntu.com/security/CVE-2022-0185#impact-score
Il existe un article détaillé de l'explorateur : https://www.hackthebox.com/blog/CVE-2022-0185:_A_case_study
Dans ce dépôt, j'expliquerai les étapes de base et les informations contextuelles associées pour reproduire cette vulnérabilité. De plus, si quelque chose vous semble flou, vous pouvez m'envoyer un courriel à [email protected], je serai ravi de répondre à vos questions.
La vulnérabilité CVE-2022-0185 a été publiée le 11/02/2022, avec un score de base CVSS 3.x de 8,4 (Élevé). [1] Cette vulnérabilité est un dépassement de tampon basé sur le tas, causé par un dépassement négatif d'entier non signé (unsigned integer underflow).
La vulnérabilité a été introduite dans le noyau Linux v5.1, affectant toutes les distributions Linux avec des versions de noyau supérieures à 5.1. Par exemple, Ubuntu 20.04 LTS (focal) était vulnérable à ce bogue. Cependant, un correctif a été publié et est disponible depuis la version 5.4.0-96.109. [3]
L'exploitation de cette vulnérabilité permet à un utilisateur local non privilégié d'élever ses privilèges sur le système, compromettant potentiellement l'ensemble du système. [1] [2] Voici une analyse détaillée du score CVSS : Score de base : 8,4, indiquant un risque de sécurité significatif nécessitant une attention immédiate. Score d'impact : 5,9, suggérant des dégâts potentiels substantiels en cas d'exploitation. Les valeurs élevées de confidentialité, d'intégrité et de disponibilité contribuent à ce score. Score d'exploitabilité : 2,5, suggérant une exploitabilité relativement élevée. Le vecteur d'attaque local, ainsi que les valeurs élevées d'intégrité et de disponibilité, contribuent à ce score.
Les tableaux 1.1 et 1.2 fournissent plus d'informations sur ces scores et leurs composants.
| Gravité CVSS v3.1 | Valeur |
|---|---|
| Score de base | 8,4 ÉLEVÉ |
| Score d'impact | 5,9 |
| Score d'exploitabilité | 2,5 |
Tableau 1.1 Scores de gravité CVSS[1]
| Métriques CVSS v3.1 | Valeur |
|---|---|
| Vecteur d'attaque (AV) | Local |
| Privilèges requis (PR) | Aucun |
| Interaction utilisateur (UI) | Aucune |
| Confidentialité (C) | Élevée |
| Intégrité (I) | Élevée |
| Disponibilité (A) | Élevée |
Tableau 1.2 Vecteur CVSS[1]
Il existe deux types d'entiers dans les ordinateurs modernes : signés et non signés. La représentation des nombres signés implique généralement une opération appelée complément à deux. [4] "Le complément à deux utilise le chiffre binaire ayant la plus grande valeur de position comme signe pour indiquer si le nombre binaire est positif ou négatif" [4]
L'introduction du complément à deux permet de convertir le calcul de la soustraction en addition, simplifiant ainsi la conception et l'implémentation du CPU. La génération du complément à deux d'un entier implique trois étapes : [4]
La figure 2.1.1.1 montre le processus de conversion dans un schéma avec un exemple concret de conversion de "-6" au format complément à deux.

Fig 2.1.1.2 Addition à l'aide du complément à deux
La figure 2.1.1.2 montre le processus d'ajout du complément à deux de '-6' à '+6'. Cela démontre comment l'utilisation du complément à deux permet d'utiliser l'addition comme substitut de la soustraction.

Fig 2.1.1.2 Addition à l'aide du complément à deux
À partir de la section 2.1.1, nous comprenons déjà ce qu'est le complément à deux. Examinons maintenant le scénario du dépassement négatif d'un entier non signé dans les ordinateurs. Dans les ordinateurs modernes, lors de l'utilisation de nombres non signés, le bit le plus significatif n'est pas traité comme un bit de signe ; il fait plutôt partie du nombre non signé lui-même. Cette situation signifie que lors de l'exécution d'une soustraction avec un nombre non signé, nous devons être prudents, car cela peut conduire à une condition connue sous le nom de dépassement négatif d'entier non signé. [5]
La figure 2.1.2.1 illustre la situation de soustraction de 6 à 5 pour un nombre non signé de 8 bits. Le résultat final est 255 en raison du bouclage du nombre non signé. Lorsque ce dépassement négatif se produit dans une instruction conditionnelle, il peut potentiellement perturber le fonctionnement de cette instruction.

Fig 2.1.2.1 Dépassement négatif d'entier non signé
Dans le noyau Linux, l'allocateur de Slabs est un mécanisme de gestion de la mémoire utilisé pour l'allocation et la désallocation efficaces de petits blocs de mémoire. Il offre des performances en maintenant plusieurs caches de Slabs, chacun contenant des blocs de mémoire de taille fixe. Typiquement, kmalloc-32 alloue 32 octets de mémoire, c'est un slab kmalloc-32, tandis que kmalloc-4k alloue 4096 octets de mémoire, c'est un slab kmalloc-4k. [6]
De plus, l'allocation par slabs dans le noyau Linux implique généralement l'allocation de mémoire à partir d'un espace d'adressage contigu au sein de la région de mémoire tas du noyau. Cette adresse contiguë est gérée par le noyau et est utilisée pour allouer de la mémoire à divers objets et structures de données du noyau. La figure 2.2.1.1 montre la disposition des slabs dans la mémoire du noyau Linux.

Fig 2.2.1.1 Allocateur de Slabs dans Linux [7] (L'auteur de cette figure est https://leviathan.vip/)
Si vous souhaitez reproduire le processus avec un noyau Linux compilé vous-même, veuillez lire les fichiers markdown suivants pour obtenir les informations contextuelles :