
# Proof-of-concept и технический анализ для CVE-2026-85046, type confusion в V8 в inline Array.prototype.sort, включая первопричину, diff патча и цепочку эксплуатации для Chrome < 152.0.7977.82.
| Поле | Значение |
|---|
| CVSS | 8.8 (High) |
| CWE | CWE-843 (Type Confusion) |
| Компонент | V8 JavaScript Engine -- Maglev/Turbofan inline sort |
| Затронуты | Chrome < 152.0.7977.82, все браузеры на Chromium |
| Исправлено | Chrome 152.0.7977.82 (2026-09-03) |
| Коммит исправления | e0562d87ad9c17042b581582c99237d798572e67 |
| CISA KEV | Добавлено 2026-09-04, срок 2026-09-18 |
| Эксплуатация в дикой природе | Да (подтверждено Google) |
| Автор отчёта | Salvatore Gulizia (Serotav) |
Инлайн-оптимизация sort принимает полиморфную обратную связь по element-kind (PACKED_SMI_ELEMENTS + PACKED_ELEMENTS). Когда компаратор вызывает arr.fill(0), V8 мигрирует map получателя назад с PACKED_ELEMENTS на PACKED_SMI_ELEMENTS. Проверка map после сортировки проходит, потому что PACKED_SMI_ELEMENTS был в исходном наборе обратной связи. Обратная запись (copy-back) записывает указатели на объекты в массив, чья map заявляет элементы только типа SMI.
Исправление добавляет предусловие, требующее, чтобы все map получателя в обратной связи имели одинаковый elements_kind перед инлайн-оптимизацией sort.
| Файл | Описание |
|---|---|
patch-analysis.md | Полный анализ диффа патча с первопричиной, механизмом триггера и оценкой примитивов эксплуатации |
patch-analysis.json | Структурированные данные: хэши коммитов, CWE, затронутые версии, примитивы эксплуатации |
v8-research.md | Глубокое погружение в element kinds V8, предыдущие PoC (CVE-2020-6418, CVE-2025-2135, CVE-2024-4947 и др.), архитектура песочницы, техники побега |
poc-minimal.js | Минимальный триггер путаницы типов для d8 (d8 --allow-natives-syntax poc-minimal.js) |
poc.html | Полная цепочка эксплуатации: путаница типов, примитив addrof, heap spray, fakeobj через перекрытие backing store, утечка информации |
exploit-notes.md | Техническое описание: пошаговая цепочка, схемы раскладки кучи, сжатие указателей, влияние песочницы, индикаторы обнаружения, устранение |
# С V8 debug helpers
d8 --allow-natives-syntax poc-minimal.js
# Без них (эвристическая проверка через String())
d8 poc-minimal.js
Откройте poc.html в Chrome < 152.0.7977.82. Эксплойт запускается автоматически и логирует каждый этап на страницу и в консоль разработчика. Этапы:
arr.fill(0) в компараторе sortaddrof -- утечка сжатых указателей кучи как целых чиселfakeobj через перекрытие -- создание ссылок на объекты из контролируемых целых чиселОбучение (2000 итераций)
|
v
Путаница типов: map PACKED_ELEMENTS -> map PACKED_SMI_ELEMENTS
(backing store всё ещё содержит указатели на объекты)
|
v
addrof: String(confused_array) утекает указатели как целые числа
|
v
fakeobj: перекрытие массивов double/object записывает контролируемый указатель
|
v
Фейковый JSArray с контролируемым указателем elements -> произвольное R/W (внутри каге)
|
v
Выполнение кода внутри песочницы V8 (требуется побег из песочницы для полного RCE)
kMaxInlineSortLength)arr.fill() со значениями SMI для обратной миграции mapPACKED_SMI, так и PACKED_ELEMENTS