
Preuve de concept et analyse technique pour CVE-2026-85046, une confusion de type V8 dans le tri en ligne de Array.prototype.sort, incluant la cause racine, le diff du correctif et la chaîne d'exploitation pour Chrome < 152.0.7977.82.
| Champ | Valeur |
|---|
| CVSS | 8,8 (Élevé) |
| CWE | CWE-843 (Confusion de type) |
| Composant | Moteur JavaScript V8 -- tri en ligne Maglev/Turbofan |
| Affecté | Chrome < 152.0.7977.82, tous les navigateurs basés sur Chromium |
| Corrigé | Chrome 152.0.7977.82 (2026-09-03) |
| Commit de correction | e0562d87ad9c17042b581582c99237d798572e67 |
| CISA KEV | Ajouté le 2026-09-04, échéance le 2026-09-18 |
| Exploitation sauvage | Oui (confirmé par Google) |
| Rapporteur | Salvatore Gulizia (Serotav) |
L'optimisation du tri en ligne accepte un retour polymorphique de type d'éléments (PACKED_SMI_ELEMENTS + PACKED_ELEMENTS). Lorsque le comparateur appelle arr.fill(0), V8 migre la carte du récepteur en arrière de PACKED_ELEMENTS vers PACKED_SMI_ELEMENTS. La vérification de carte post-tri réussit car PACKED_SMI_ELEMENTS figurait dans l'ensemble de retours d'origine. La réécriture copie des pointeurs d'objets dans un tableau dont la carte prétend ne contenir que des éléments SMI.
La correction ajoute une condition préalable exigeant que toutes les cartes de récepteurs dans le retour partagent le même elements_kind avant d'inliner le tri.
| Fichier | Description |
|---|---|
patch-analysis.md | Analyse complète du diff du correctif avec cause racine, mécanisme de déclenchement et évaluation des primitives d'exploitation |
patch-analysis.json | Données structurées : hachages de commits, CWE, versions affectées, primitives d'exploitation |
v8-research.md | Plongée approfondie dans les types d'éléments V8, PoC antérieurs (CVE-2020-6418, CVE-2025-2135, CVE-2024-4947, etc.), architecture sandbox, techniques d'évasion |
poc-minimal.js | Déclencheur minimal de confusion de type pour d8 (d8 --allow-natives-syntax poc-minimal.js) |
poc.html | Chaîne d'exploitation complète : confusion de type, primitive addrof, heap spray, fakeobj via chevauchement de stockage de support, fuite d'informations |
exploit-notes.md | Analyse technique : chaîne étape par étape, schémas de disposition du tas, compression des pointeurs, impact sandbox, indicateurs de détection, remédiation |
# Avec les helpers de débogage V8
d8 --allow-natives-syntax poc-minimal.js
# Sans (vérification heuristique via String())
d8 poc-minimal.js
Ouvrez poc.html dans Chrome < 152.0.7977.82. L'exploit s'exécute automatiquement et journalise chaque étape sur la page et dans la console développeur. Étapes :
arr.fill(0) dans le comparateur de triaddrof -- divulgue les pointeurs de tas compressés sous forme d'entiersfakeobj via chevauchement -- forge des références d'objets à partir d'entiers contrôlésEntraînement (2000 itérations)
|
v
Confusion de type : carte PACKED_ELEMENTS -> carte PACKED_SMI_ELEMENTS
(le stockage de support contient toujours des pointeurs d'objets)
|
v
addrof : String(array_confus) divulgue les pointeurs sous forme d'entiers
|
v
fakeobj : le chevauchement double/objet écrit un pointeur contrôlé
|
v
Faux JSArray avec pointeur d'éléments contrôlé -> R/W arbitraire (intra-cage)
|
v
Exécution de code dans la sandbox V8 (nécessite une évasion de sandbox pour un RCE complet)
kMaxInlineSortLength)arr.fill() avec des valeurs SMI pour la migration arrière de cartePACKED_SMI et PACKED_ELEMENTS doivent tous deux être passés pendant l'entraînement