CVE-2026-85046 : faille zero-day de confusion de types V8 Maglev/TurboFan dans Google Chromium
HERMES THREAT SCORE & EXPLOITABILITÉ OPÉRATIONNELLE
Cible :Google Chrome & Moteur V8 Chromium (Windows, macOS, Linux) Élevé à 95 EXTREME par Hermes en raison d'une exploitation zero-day confirmée dans la nature, de l'inscription au catalogue CISA KEV (4 septembre 2026) et de son intégration dans des attaques ciblées de type point d'eau (watering hole).
CVE-2026-85046: Google Chromium V8 Maglev/TurboFan Type Confusion Zero-DayVULNÉRABILITÉ
Software platform affected by security vulnerabilities and agentic attack patterns.
🔍 Pourquoi cette relation ? (Preuves & Provenance)
“Confirmed security vulnerability in Google Chromium / V8 Engine documented in Hermes dossier.”
- [vulnerability_report]
- [government_confirmation]CISA verified active exploitation in the wild and mandated federal remediation deadline in KEV entry. — Source : Cybersecurity & Infrastructure Security Agency (CISA): CISA Adds CVE-2026-59822 to Known Exploited Vulnerabilities Catalog (Fiabilité : VERY_HIGH)
Analyse de la cause racine
Section intitulée « Analyse de la cause racine »Dans les moteurs JavaScript modernes comme V8, la performance repose sur la compilation spéculative. Pour éliminer le surcoût lié au boxing des variables, V8 structure la disposition des objets via des classes internes cachées nommées Maps (v8::internal::Map) et sépare les tableaux d’éléments selon leur typage :
| Type d’éléments | Disposition en mémoire | État de l’étiquetage de pointeurs (pointer tagging) |
|---|---|---|
PACKED_SMI_ELEMENTS | Entiers signés 31 bits denses | Entier décalé (valeur << 1, bit de poids faible 0) |
PACKED_DOUBLE_ELEMENTS | Nombres flottants IEEE-754 64 bits | Flottants binaires bruts sans étiquetage |
PACKED_ELEMENTS | Références d’objets, chaînes, symboles | Pointeurs compressés 32 bits avec bit de poids faible 1 |
Architecture du tas V8 et défaillance de transition de types :
Flux normal d'optimisation spéculative : [Tableau JS initialisé : [1, 2, 3]] ──────► ElementsKind : PACKED_SMI_ELEMENTS │ Modification du tableau : arr[0] = {} ───► Transition vers : PACKED_ELEMENTS (Pointeurs) │ Invalidation de boucle par le compilateur JIT : ┌────────────────────────────────────────────────────────────────────────┐ │ Phase Maglev / TurboFan : Élimination de vérification de Map │ │ │ │ Le compilateur suppose que la Map du tableau est invariante : │ │ [DÉFAILLANCE CRITIQUE DE TRANSITION] │ │ Le tableau stocke désormais des pointeurs d'objets │ │ MAIS le JIT conserve la Map : PACKED_SMI_ELEMENTS │ └────────────────────────────────────────────────────────────────────────┘ │ ▼ [CONFUSION DE TYPES CRITIQUE (CWE-843)] Le moteur traite l'adresse d'un pointeur mémoire comme un entier (Smi) Le moteur traite un entier fourni par l'attaquant comme une adresse mémoireLe bogue d’inférence de cartes dans Maglev et TurboFan
Section intitulée « Le bogue d’inférence de cartes dans Maglev et TurboFan »Lors des optimisations avancées de boucles dans les compilateurs Maglev (tier intermédiaire) et TurboFan (optimiseur de pointe), V8 évalue les vérifications de cartes via des nœuds CheckMaps.
Lorsqu’un tableau passe d’un état d’entiers purs à un état d’objets complexes, V8 exécute la routine JSObject::TransitionElementsKind(). Cependant, dans des conditions spécifiques de désoptimisation combinées à des accesseurs de prototypes personnalisés (Object.prototype.__defineGetter__), le compilateur JIT omettait d’émettre l’opérateur de contrôle CheckMaps avant l’écriture en ligne des éléments.
En conséquence :
- Élision erronée du contrôle : le code machine compilé continuait d’effectuer des écritures et lectures rapides selon la logique des petits entiers (Smis).
- Effet de bord non propagé : un effet de bord modifiait le tampon sous-jacent pour y stocker des références d’objets.
- Confusion de déréférencement : l’absence de barrière de validation permettait d’interpréter des pointeurs d’adresses d’objets comme de simples valeurs numériques.
V8 utilisant l’étiquetage de pointeurs (où les entiers ont leur bit 0 à 0, et les pointeurs ont leur bit 0 à 1), lire un pointeur sous forme d’entier permet de fuiter directement l’adresse mémoire du tas (contournement ASLR). À l’inverse, écrire un entier calculé force le moteur à le déréférencer comme un pointeur d’objet valide, donnant naissance aux deux primitives clés de l’exploitation V8 : addrof et fakeobj.
Mécanique d’exploitation et primitives de tas
Section intitulée « Mécanique d’exploitation et primitives de tas »L’exploitation de CVE-2026-85046 nécessite d’amener une cible à visiter une page HTML spécifiquement forgée. La chaîne d’attaque s’exécute intégralement dans le processus de rendu de l’onglet :
1. Déclenchement de la confusion de types
Section intitulée « 1. Déclenchement de la confusion de types »L’attaquant conçoit une fonction exécutée dans une boucle chaude afin de forcer sa compilation et son optimisation par TurboFan :
// Schéma conceptuel du déclenchement JITfunction trigger_confusion(arr, val) { arr[0] = val; return arr[0];}
// Entraînement du compilateur JIT pour PACKED_SMI_ELEMENTSfor (let i = 0; i < 20000; i++) { let smis = [1, 2, 3, 4]; trigger_confusion(smis, 42);}
// Déclenchement : passage d'un objet alors que le contrôle de Map a été élidélet target_arr = [1, 2, 3, 4];let victim_obj = { leak_me: 0x1337 };
trigger_confusion(target_arr, victim_obj);2. Construction de la primitive addrof
Section intitulée « 2. Construction de la primitive addrof »En lisant la référence d’un objet à travers un tableau que V8 traite comme contenant des entiers Smis, l’adresse brute du pointeur de victim_obj est renvoyée à l’espace JavaScript décalée de 1 bit :
function addrof(obj) { confused_arr[0] = obj; // Lecture du pointeur d'objet en tant qu'entier Smi let tagged_ptr = confused_arr[0]; return tagged_ptr >> 1; // Décalage inverse pour obtenir l'adresse offset 32 bits}3. Construction de la primitive fakeobj
Section intitulée « 3. Construction de la primitive fakeobj »En écrivant une valeur entière dans un second tableau confus que le moteur considère comme contenant des objets, V8 déréférence l’entier injecté comme un pointeur d’objet actif :
function fakeobj(addr) { // Injection de l'adresse avec le bit 0 fixé à 1 (tag HeapObject) confused_arr_obj[0] = (addr << 1) | 1; return confused_arr_obj[0]; // Retourne la référence vers le faux objet injecté}4. Lecture et écriture arbitraires et exécution de shellcode
Section intitulée « 4. Lecture et écriture arbitraires et exécution de shellcode »Grâce à addrof et fakeobj, l’attaquant forge une fausse structure Float64Array dont le pointeur de données (external_pointer) pointe vers une région arbitraire de la mémoire du processus :
- Fuite de l’adresse d’un objet modèle via
addrof(). - Forgeage d’un faux objet
ArrayBufferdont le tampon pointe vers une table de fonctions ou une zone WebAssembly (rwx). - Écriture directe des instructions shellcode pour obtenir l’exécution de code arbitraire au sein du processus de rendu (renderer).
5. Chaînage et évasion du bac à sable
Section intitulée « 5. Chaînage et évasion du bac à sable »Chromium isolant chaque site web dans un bac à sable restreint (AppContainer sous Windows, seccomp-bpf sous Linux), les groupes d’attaquants avancés chaînent CVE-2026-85046 avec une faille d’élévation de privilèges du noyau de l’OS (ex. Win32k) pour s’échapper du navigateur et obtenir un contrôle persistant au niveau SYSTEM ou root.
Indicateurs forensiques et analyse DFIR
Section intitulée « Indicateurs forensiques et analyse DFIR »Les équipes de réponse aux incidents (DFIR) enquêtant sur une compromission potentielle doivent surveiller les signaux suivants :
1. Lignée des processus et anomalies comportementales
Section intitulée « 1. Lignée des processus et anomalies comportementales »L’indicateur le plus franc d’une exploitation réussie de V8 réside dans l’apparition de processus enfants anormaux directement engendrés par le processus de rendu Chromium :
- Windows :
chrome.exe(exécuté avec l’argument--type=renderer) engendrantcmd.exe,powershell.exe,wscript.exe,certutil.exeourundll32.exe. - Linux : les workers de bac à sable Chromium engendrant
/bin/sh,/bin/bashou ouvrant des connexions réseau sortantes non sollicitées. - macOS : les processus auxiliaires Google Chrome engendrant
/bin/zsh,curlouosascript.
Lignée normale :[explorer.exe] ──► [chrome.exe (Parent Navigateur)] ──► [chrome.exe (--type=renderer)]
Lignée compromise (échappement de bac à sable / injection) :[chrome.exe (--type=renderer)] │ ├─► [svchost.exe (Injection de thread / Process Hollowing)] └─► [cmd.exe /c powershell.exe -enc <Charge Utile Base64>]2. Artefacts de crash dumps et mémoire
Section intitulée « 2. Artefacts de crash dumps et mémoire »Inspectez les rapports d’erreur Crashpad situés dans :
C:\Users\<utilisateur>\AppData\Local\Google\Chrome\User Data\Crashpad\reports\- Signatures d’exception
STATUS_ACCESS_VIOLATION(0xC0000005) ciblant des plages mémoires JIT V8 (0x00007ff*). - Altération des pointeurs de
Mapdans les vidages de mémoire du tas JavaScript.
Liens croisés : cyber-renseignement et playbooks associés
Section intitulée « Liens croisés : cyber-renseignement et playbooks associés »| Référence du recueil | Périmètre d’analyse | Alignement et impact opérationnel |
|---|---|---|
| Triage EDR | Triage des alertes EDR | Qualification et confinement des processus suspects issus des navigateurs web. |
| Courtiers d’accès | Courtiers d’accès initial (IAB) | Utilisation des failles de navigateurs pour l’accès initial et la revente d’accès. |
| Studio interactif | AgentThreat Studio | Modélisation des moteurs de rendu web comme périmètres non fiables dans les architectures IA. |
| Étude comparative | Limites de rétro-ingénierie SRE-Bench | Analyse des techniques avancées d’analyse de binaires et de décompilation JIT. |
Suite d’ingénierie de la détection
Section intitulée « Suite d’ingénierie de la détection »title: Processus de rendu Chrome engendrant un interpréteur suspect (CVE-2026-85046)id: f98a72b1-4089-4e2b-b850-460000085046-frstatus: stabledescription: Détecte la création de processus fils anormaux par un processus de rendu Chrome ou Chromium, symptomatique d'une exploitation de type CVE-2026-85046.references: - https://chromereleases.googleblog.com/2026/09/stable-channel-update-for-desktop.html - https://www.cisa.gov/known-exploited-vulnerabilities-catalogauthor: Équipe de détection Hermes Codexdate: 2026-09-08logsource: category: process_creation product: windowsdetection: selection_parent: ParentImage|endswith: - '\chrome.exe' - '\msedge.exe' - '\brave.exe' - '\opera.exe' ParentCommandLine|contains: '--type=renderer' selection_child: Image|endswith: - '\cmd.exe' - '\powershell.exe' - '\pwsh.exe' - '\wscript.exe' - '\cscript.exe' - '\rundll32.exe' - '\regsvr32.exe' - '\mshta.exe' - '\certutil.exe' condition: selection_parent and selection_childfalsepositives: - Outils internes rares d'automatisation de tests web (vérifier la ligne de commande).level: criticaltags: - attack.execution - attack.t1203 - attack.t1059.001 - cve.2026.85046rule Exploit_Chromium_V8_TypeConfusion_CVE_2026_85046 { meta: description = "Détecte les schémas d'exploitation JavaScript exploitant la confusion de types V8 et le contournement de transition d'éléments" author = "Hermes Codex CTI" date = "2026-09-08" reference = "CVE-2026-85046" score = 85 strings: $smi_array = /\[\s*(1|0)\s*,\s*(2|1)\s*,\s*(3|2)\s*,\s*(4|3)\s*\]/ $hot_loop = /for\s*\(\s*var\s+[a-zA-Z0-9_]+\s*=\s*0\s*;\s*[a-zA-Z0-9_]+\s*<\s*(10000|20000|50000)\s*;/ $addrof_fn = /function\s+addrof\s*\(|function\s+fakeobj\s*\(/ $wasm_rwx = "WebAssembly.Instance" $f64_view = "Float64Array" $bigint_ptr= "BigInt64Array" condition: filesize < 500KB and ($addrof_fn or ($hot_loop and $smi_array and $wasm_rwx and ($f64_view or $bigint_ptr)))}DeviceProcessEvents| where InitiatingProcessFileName in~ ("chrome.exe", "msedge.exe", "brave.exe", "opera.exe")| where InitiatingProcessCommandLine has "--type=renderer"| where FileName in~ ("cmd.exe", "powershell.exe", "pwsh.exe", "rundll32.exe", "certutil.exe", "whoami.exe", "cscript.exe", "wscript.exe", "mshta.exe")| project Timestamp, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, FileName, ProcessCommandLine, AccountName| order by Timestamp descindex=endpoint sourcetype="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=1(ParentImage="*\\chrome.exe" OR ParentImage="*\\msedge.exe") ParentCommandLine="*--type=renderer*"Image IN ("*\\cmd.exe", "*\\powershell.exe", "*\\rundll32.exe", "*\\certutil.exe", "*\\whoami.exe")| stats count earliest(_time) as premier_vu latest(_time) as dernier_vu by Computer, User, ParentImage, ParentCommandLine, Image, CommandLine| sort - count<#.SYNOPSIS Vérifie les versions des navigateurs Chromium installés sur les postes Windows pour détecter CVE-2026-85046.#>$Paths = @( "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\chrome.exe", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\msedge.exe", "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\brave.exe")
foreach ($RegPath in $Paths) { if (Test-Path $RegPath) { $Exe = (Get-ItemProperty -Path $RegPath).'(default)' if ($Exe -and (Test-Path $Exe)) { $Ver = (Get-Item $Exe).VersionInfo.ProductVersion $Name = (Get-Item $Exe).Name $IsVulnerable = $false if ($Name -eq "chrome.exe" -and [version]$Ver -lt [version]"152.0.7977.82") { $IsVulnerable = $true } if ($Name -eq "msedge.exe" -and [version]$Ver -lt [version]"152.0.3540.84") { $IsVulnerable = $true }
[PSCustomObject]@{ Navigateur = $Name Version = $Ver Vulnérable = $IsVulnerable Emplacement = $Exe } } }}Matrice de remédiation et correctifs
Section intitulée « Matrice de remédiation et correctifs »1. Mises à jour officielles des navigateurs
Section intitulée « 1. Mises à jour officielles des navigateurs »Les organisations doivent immédiatement mettre à niveau tous les postes de travail vers les versions corrigées :
| Navigateur | Plateforme | Version corrigée minimale |
|---|---|---|
| Google Chrome | Windows / macOS | 152.0.7977.82 ou 152.0.7977.83 |
| Google Chrome | Linux | 152.0.7977.82 |
| Microsoft Edge | Windows / macOS / Linux | 152.0.3540.84 ou supérieure |
| Brave Browser | Toutes plateformes | Version 1.82.164 (Chromium 152.0.7977.82) |
| Opera | Toutes plateformes | Version 118.0.5432.48 ou supérieure |
2. Durcissement des politiques d’entreprise
Section intitulée « 2. Durcissement des politiques d’entreprise »- Activer l’isolation stricte de sites : forcer
--site-per-processpar stratégie GPO / MDM pour isoler rigoureusement les origines web dans des processus distincts. - Vérifier l’activation de V8SANDBOX : s’assurer que la sandbox en mémoire du moteur V8 (
--enable-v8-sandbox) n’a pas été désactivée par des drapeaux expérimentaux. - Surveillance EDR Active : maintenir des règles d’alerte immédiate sur tout processus dérivé des processus enfants des navigateurs.
Sources et références techniques
Section intitulée « Sources et références techniques »- Catalogue CISA KEV : directive opérationnelle BOD 26-04 pour CVE-2026-85046
- Blog officiel Google Chrome releases : mise à jour du canal stable pour Desktop (2026-09-03)
- National Vulnerability Database (NVD) : fiche détaillée CVE-2026-85046
- Suivi des anomalies Chromium : ticket de sécurité 40092147 — V8 Maglev/TurboFan Type Confusion
- Playbooks Hermes associés : triage des alertes EDR et Courtiers d’accès initial (IAB)