
Prova de conceito e análise técnica para CVE-2026-85046, uma confusão de tipos no V8 em `Array.prototype.sort` inline, incluindo causa raiz, diff do patch e cadeia de exploração para Chrome < 152.0.7977.82.
| Campo | Valor |
|---|
| CVSS | 8.8 (Alto) |
| CWE | CWE-843 (Confusão de Tipo) |
| Componente | V8 JavaScript Engine -- sort inline Maglev/Turbofan |
| Afetados | Chrome < 152.0.7977.82, todos os navegadores baseados em Chromium |
| Corrigido | Chrome 152.0.7977.82 (2026-09-03) |
| Commit da correção | e0562d87ad9c17042b581582c99237d798572e67 |
| CISA KEV | Adicionado em 2026-09-04, prazo 2026-09-18 |
| Exploração ativa | Sim (confirmado pelo Google) |
| Relator | Salvatore Gulizia (Serotav) |
A otimização de sort inline aceita feedback polimórfico de element-kind (PACKED_SMI_ELEMENTS + PACKED_ELEMENTS). Quando o comparador chama arr.fill(0), o V8 migra o mapa do receptor para trás, de PACKED_ELEMENTS para PACKED_SMI_ELEMENTS. A verificação de mapa pós-sort passa porque PACKED_SMI_ELEMENTS estava no conjunto original de feedback. A escrita de retorno grava ponteiros de objeto em um array cujo mapa declara elementos somente SMI.
A correção adiciona uma pré-condição que exige que todos os mapas de receptor no feedback compartilhem o mesmo elements_kind antes de inlinear o sort.
| Arquivo | Descrição |
|---|---|
patch-analysis.md | Análise completa do diff do patch com causa raiz, mecanismo de gatilho e avaliação de primitivas de exploração |
patch-analysis.json | Dados estruturados: hashes de commit, CWE, versões afetadas, primitivas de exploração |
v8-research.md | Mergulho profundo em element kinds do V8, PoCs anteriores (CVE-2020-6418, CVE-2025-2135, CVE-2024-4947, etc.), arquitetura de sandbox, técnicas de escape |
poc-minimal.js | Gatilho mínimo de confusão de tipo para d8 (d8 --allow-natives-syntax poc-minimal.js) |
poc.html | Cadeia de exploração completa: confusão de tipo, primitiva addrof, heap spray, fakeobj via sobreposição de backing store, vazamento de informação |
exploit-notes.md | Documentação técnica: cadeia passo a passo, diagramas de layout de heap, compressão de ponteiros, impacto da sandbox, indicadores de detecção, remediação |
# Com helpers de debug do V8
d8 --allow-natives-syntax poc-minimal.js
# Sem (verificação heurística via String())
d8 poc-minimal.js
Abra poc.html no Chrome < 152.0.7977.82. O exploit é executado automaticamente e registra cada etapa na página e no console do desenvolvedor. Etapas:
arr.fill(0) no comparador do sortaddrof -- vaza ponteiros de heap comprimidos como inteirosfakeobj via sobreposição -- forja referências de objeto a partir de inteiros controladosTreinamento (2000 iter)
|
v
Confusão de tipo: mapa PACKED_ELEMENTS -> mapa PACKED_SMI_ELEMENTS
(backing store ainda contém ponteiros de objeto)
|
v
addrof: String(confused_array) vaza ponteiros como inteiros
|
v
fakeobj: sobreposição de arrays double/object grava ponteiro controlado
|
v
JSArray falso com ponteiro de elementos controlado -> R/W arbitrário (intra-cage)
|
v
Execução de código dentro da sandbox do V8 (requer escape da sandbox para RCE completo)
kMaxInlineSortLength)arr.fill() com valores SMI para migração reversa do mapaPACKED_SMI quanto PACKED_ELEMENTS devem ser passados durante o treinamento