Каким будет корень из нуля? Ответит даже школьник: 0. Но если задать этот вопрос JIT-компилятору Maglev внутри движка V8, то при определённых обстоятельствах он сначала скажет «ноль», а потом решит сэкономить на проверке безопасности и отдаст злоумышленнику доступ к памяти браузера 🤠
Всем привет, на связи Павел Кузьмин, инженер по информационной безопасности в Яндексе. Я занимаюсь практической безопасностью Яндекс Браузера и проекта Chromium. Сегодня я расскажу про CVE-2025-9864 — уязвимость, которую я нашёл в движке V8.
Она проявлялась только при сочетании двух условий:
🔴 После полной сборки мусора (Major GC), которая освобождала память и меняла состояние контекста
🔴 При компиляции функции в Maglev, когда движок переключался на оптимизированное выполнение
В таком сценарии
Math.sqrt(0) приводил к тому, что узел Float64Sqrt в IR-графе Maglev приобретал тип kHoleyFloat64. Это заставляло преобразовывать результат в HeapNumber (объект в куче), при этом не записав это преобразование в Remembered Sets.Критическая ошибка возникала на следующем шаге. Компилятор видел, что исходно в ячейке хранился
Smi, и пропускал write barrier — механизм, который сообщает сборщику мусора о новых ссылках на объекты в куче.Как итог, если после этого сборка мусора запускалась вновь,
HeapNumber удалялся как неиспользуемый, но указатель на него оставался активным. Получался классический use-after-free, который открывал путь к read/write-примитивам в куче V8.🦾 Как починили?
Мы изменили тип узла
Float64Sqrt с HoleyFloat64 на обычный Float64. Теперь ноль не превращался в HeapNumber, а корректно оставался Smi. Write barrier больше не пропускался, и цепочка разрушилась. Патч уложился в одну строку.⏩️ А полную статью читайте на Хабре. В ней я рассказываю:
🔴 Как устроена архитектура V8
🔴 Почему write barrier — это не просто «галочка», а жизненно важный механизм
🔴 Как превратить use-after-free в read/write-примитивы и модифицировать объекты в памяти
🔴 Почему даже с такой уязвимостью взломать браузер через песочницу — та ещё задача
💡 Материал будет интересен тем, кто работает с безопасностью V8, компиляторами или просто любит разбирать нетривиальные баги.
Подписывайтесь:
💬 @Yandex4Developers
