Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !
CVE-2021-21220 — Présentation pédagogique détaillant l'exploitation de CVE-2021-21220, une confusion de type JIT V8 conduisant à un accès hors limites et à une exécution de code à distance via WebAssembly, avec analyse des mesures d'atténuation. | Kitploit
Présentation pédagogique détaillant l'exploitation de CVE-2021-21220, une confusion de type JIT V8 conduisant à un accès hors limites et à une exécution de code à distance via WebAssembly, avec analyse des mesures d'atténuation.
Du comportement JIT incorrect à l'exécution de code à distance
Aperçu
Cette présentation explique l'exploitation de CVE-2021-21220, une vulnérabilité dans le moteur JavaScript V8 de Google Chrome causée par des hypothèses incorrectes du compilateur JIT lors de l'optimisation.
La présentation aborde les points suivants :
Comment V8 effectue la compilation Just-In-Time (JIT)
Comment un bug de confusion entre signé et non signé apparaît lors de l'optimisation
Comment le bug conduit à une primitive de dépassement de tableau (out-of-bounds, OOB)
Comment les attaquants peuvent exploiter l'accès OOB pour fuiter des adresses et obtenir des écritures mémoire arbitraires
Comment WebAssembly (Wasm) devient une cible pour l'exécution de code natif
Les mitigations existantes et les défenses des navigateurs modernes
Objectifs de la présentation
L'objectif de cette présentation est de montrer comment une erreur d'optimisation subtile dans un moteur JavaScript moderne peut dégénérer en :
Corruption mémoire
Primitives de lecture/écriture arbitraires
Modification de code natif
Exécution de code à distance potentielle (RCE)
La chaîne d'exploitation souligne comment les moteurs JIT équilibrent performance et sécurité, et comment des hypothèses d'optimisation incorrectes peuvent devenir exploitables.
Sujets abordés
1. Architecture de V8
La présentation présente les composants majeurs de V8 :
Interpréteur Ignition
Exécute le bytecode JavaScript
Collecte les retours d'exécution
Stocke les informations de type dans des vecteurs de rétroaction
Optimiseur TurboFan
Construit des graphes optimisés à partir des retours d'exécution
Insère des hypothèses spéculatives et des gardes
Effectue des passes d'optimisation agressives
Backend de code machine
Émet des instructions CPU natives
Produit du code machine optimisé pour les fonctions « chaudes »
Le diagramme d'architecture dans la présentation illustre comment JavaScript passe de :
root@kitploit:~
Analyse → Bytecode → Optimisation → Exécution
2. Pourquoi JavaScript est difficile à optimiser
JavaScript est difficile à exécuter avec des performances élevées car :
Les variables changent de type dynamiquement
Les tableaux changent de structure et de types d'éléments
Les opérateurs comme + peuvent avoir plusieurs significations
Les vérifications à l'exécution sont coûteuses
V8 utilise la compilation JIT pour optimiser les motifs d'exécution courants en spéculant sur le comportement à l'exécution.
3. Cause racine de CVE-2021-21220
La vulnérabilité provient d'une inadéquation entre entier signé et non signé lors de l'optimisation JIT.
Concepts clés présentés :
Uint32Array
Word32Xor
Propagation de type incorrecte
ChangeInt32ToInt64
Sélection d'instruction assembleur erronée
L'exploitation abuse de la valeur :
root@kitploit:~
0x80000000
qui définit le bit de signe d'un entier 32 bits.
4. Inadéquation d'optimisation
La vulnérabilité survient car TurboFan optimise :
root@kitploit:~
x ^ 0
en l'éliminant complètement.
Lors de cette optimisation :
L'opération XOR disparaît
L'information de type est perdue
Les valeurs signées sont interprétées comme non signées
Le comportement JIT diverge du comportement de l'interpréteur
Cela entraîne une génération de code machine incorrecte et des valeurs contrôlées par l'attaquant.
5. Construction d'une primitive OOB
L'exploitation convertit le résultat JIT incorrect en contrôle sur le comportement des tableaux.
La présentation démontre :
Mauvaise valeur entière optimisée
Conversion en variable de contrôle i
Inadéquation entre l'exécution d'échauffement et celle de déclenchement
Dépassement de capacité de la longueur de Array.shift()
Création d'un tableau capable d'accès OOB
Concepts d'exploitation importants présentés :
Échauffement d'optimisation
Optimisation spéculative
Confusion de type
Corruption de la longueur du tableau
6. Accès hors limites (Out-of-Bounds)
Une fois la longueur du tableau devenue -1, l'attaquant obtient :
Lectures hors limites
Écritures hors limites
Accès aux objets V8 voisins sur le tas
L'exploitation démontre ensuite :
Fuite de pointeurs
Découverte d'adresses d'objets
Chevauchement de tableaux
Extraction de pointeurs V8 bruts
7. Abus de WebAssembly
La présentation explique comment les attaquants peuvent cibler :
Les pages de code compilé de WebAssembly
La mémoire exécutable native générée par V8
Flux d'attaque :
Créer une fonction Wasm
Localiser la mémoire exécutable
Remplacer le code machine compilé
Réexécuter Wasm
Obtenir une exécution native arbitraire
Cela montre comment un bug du moteur JavaScript peut déboucher sur une exécution de code au niveau du processus.
Défenses et mitigations
La dernière section couvre les défenses modernes des navigateurs :
Pointeurs compressés
Réduire l'exposition directe des pointeurs et la prédictibilité du tas.
Indirection des pointeurs
Empêcher l'accès direct aux adresses mémoire brutes.
Bac à sable du tas (Heap Sandboxing)
Isoler les régions mémoire et réduire l'impact de l'exploitation.
W^X (Write XOR Execute)
Empêcher les pages d'être à la fois inscriptibles et exécutables.
La présentation inclut également le diff du patch V8 montrant le correctif pour le problème d'extension de signe.
Points clés à retenir
Cette présentation montre comment :
De petites erreurs d'optimisation peuvent devenir des vulnérabilités critiques
Les compilateurs JIT augmentent considérablement la complexité de la surface d'attaque
La spéculation à l'exécution peut introduire des incohérences dangereuses
WebAssembly change le paysage de l'exploitation
Les navigateurs modernes nécessitent plusieurs couches de défense
Technologies abordées
JavaScript
Moteur Google V8
TurboFan
Ignition
WebAssembly (Wasm)
Compilation JIT
Corruption mémoire
Accès hors limites
Exploitation de navigateur
Objectif pédagogique
Ce matériel est destiné strictement à :
La recherche en sécurité
Les démonstrations éducatives
L'apprentissage des internes des navigateurs
L'analyse de vulnérabilités
N'utilisez pas ces informations contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas l'autorisation de tester.