TGViewer
Yandex for Developers Yandex for Developers @yandex4developers · 28.5K subscribers
Post #1417 7.23K
📎 Как безобидный Math.sqrt(0) чуть не сломал браузеры

Каким будет корень из нуля? Ответит даже школьник: 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
  • 🔥 36
  • 👍 17
  • ❤ 9
More from @yandex4developers
  1. Sep 29, 2026🎉 Создаём Яндекс уже 29 лет Всё это время мы учимся друг у друга, спорим, придумываем, пр…
  2. Sep 26, 2026📕 Разбираемся, зачем ML‑специалистам писать рантайм, как сделать интерактивного ассистент…
  3. Sep 25, 2026🙂 Открываем AliceAI-Foundation-80B-A3B-Base 👋 Всем привет, на связи служба качества прет…
  4. Sep 24, 2026⏯ Подключайтесь к Yandex Scale’26 🎥 Уже сегодня мы соберёмся на Yandex Scale — флагманско…
  5. Sep 18, 2026🐾 Яндексоиды рассказывают про свои пет-проекты: браузерная MMORPG Показываем красивое нов…
  6. Sep 17, 2026🐾 Яндексоиды рассказывают про свои пет-проекты: ktoml и diktat Хотим познакомить вас с пр…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →