
Анализ первопричины и рабочий эксплойт для CVE-2026-78938 — путаницы типов в V8 TurboFan, приводящей к произвольному чтению/записи в пределах сжатой кучи. Включает PoC для воспроизведения сбоя и примитивы с адресацией во время выполнения.
Анализ первопричины и эксплойт для CVE-2026-78938, type confusion в устранении загрузок TurboFan в V8, исправленная в Chrome 152.0.7977.64 (V8 15.2.124.18). Ошибка была зарегистрирована как эксплуатируемая в реальных атаках.
Эксплойт превращает ошибку в выход за границы Float64Array, а затем
в addrof / fakeobj и произвольное чтение/запись по сжатой куче V8.
Всё после начальной записи определяется во время выполнения — в стадии
чтения/записи нет жёстко заданных смещений кучи.
50597b0bb48a — "[compiler] Invalidate tracked fields on
CheckMaps with instance migration"Протестировано на macOS arm64 с локально собранным d8 обеих версий.
| файл | что это |
|---|
pocs/crash.js | Минимальный триггер. SIGBUS на уязвимой сборке, чистое завершение на исправленной. |
pocs/rw_final.js | Полный эксплойт, этап 1: триггер + массив OOB. Заморожен — см. «Воспроизведение» ниже. |
pocs/logic_final.js | Полный эксплойт, этап 2: addrof/fakeobj/произвольное чтение/запись, загружается во время выполнения этапом 1. |
WRITEUP.md | Полный анализ первопричины и заметки по эксплуатации. |
Соберите две версии d8 (точные коммиты и аргументы GN см. в WRITEUP.md),
затем из корня репозитория:
# PoC краха: SIGBUS на уязвимой, чистое завершение на исправленной
out/vuln/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/crash.js
out/patched/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/crash.js
# полное чтение/запись: работает на уязвимой, чисто завершается на исправленной
out/vuln/d8 --allow-natives-syntax --homomorphic-ic --max-valid-polymorphic-map-count=4 pocs/rw_final.js
Ожидаемый вывод на уязвимой сборке:
[+] OOB Float64Array len=0x7f000004
[+] after write: victim2.z = 2.5
[+] fakeobj(hn|1) typeof=number
[+] ALL PRIMITIVES VERIFIED
Важны две вещи:
--homomorphic-ic --max-valid-polymorphic-map-count=4 формируют полиморфную обратную связь
по картам так, чтобы путь миграции выполнялся в оптимизированном коде.
Без них триггер молча ничего не делает.pocs/rw_final.js побайтово заморожен. Единственная повреждающая
запись попадает в смещение относительно кучи, которое зависит от того,
где размещён массив-жертва, а это, в свою очередь, зависит от точных
байтов и пути скрипта. Редактирование файла (или его переименование)
делает встроенное смещение недействительным; в WRITEUP.md описано, как
выполнить повторную калибровку. pocs/logic_final.js загружается после
срабатывания триггера, поэтому его можно свободно редактировать.pocs/rw_final.js, по
причинам, указанным выше.Этот репозиторий предназначен для образовательных и защитных исследований. Ошибка исправлена в текущем Chrome; подробности публично доступны в исходном коде V8.