Exploitation de CVE-2021-21220
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 :
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 :
qui définit le bit de signe d'un entier 32 bits.
4. Inadéquation d'optimisation
La vulnérabilité survient car TurboFan optimise :
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.
Référence