Новости Анализ CVE-2025-6554: движок возвращал “невидимое” значение вместо ошибки — и открыл память

NewsMaker

I'm just a script
Премиум
19,402
40
8 Ноя 2022
История одной "дыры", ставшей эксплойтом.


w1rf91v2ftlh4rnl3ildt70axdyhye8a.jpg


В июне 2025 года в JavaScript-движке V8 была обнаружена Для просмотра ссылки Войди или Зарегистрируйся . Она связана с особенностями обработки переменных, находящихся в состоянии "временной мёртвой зоны" (TDZ), и уже Для просмотра ссылки Войди или Зарегистрируйся до выхода исправления от Google.

Исследователь с ником @DarkNavyOrg Для просмотра ссылки Войди или Зарегистрируйся , демонстрирующий суть проблемы. В центре уязвимости — функция, в которой переменная <code>y</code> используется до объявления. В JavaScript это должно приводить к ошибке ReferenceError, поскольку переменные, объявленные через <code>let</code> и <code>const</code>, недоступны до момента инициализации. Однако в Для просмотра ссылки Войди или Зарегистрируйся обрабатываются особым образом — вместо ошибки движок возвращает скрытое значение под названием "hole", которое служит маркером незаполненного места в массиве или недоступной переменной.

В демонстрационном коде Для просмотра ссылки Войди или Зарегистрируйся возникает при удалении свойства с помощью конструкции <code>delete x?.[y]?.a</code>, где переменная <code>y</code> ещё не определена. В нормальной ситуации обращение к ней должно завершиться ошибкой. Однако из-за недоработки в логике байткода, когда <code>x</code> имеет значение <code>undefined</code>, движок пропускает проверку <code>y</code> на наличие значения <code>hole</code> и просто возвращает его, позволяя использовать это значение в дальнейшем.

В прошлом аналогичная уязвимость уже возникала в 2023 году — тогда Для просмотра ссылки Войди или Зарегистрируйся "hole" для обхода защиты и выполнения произвольного кода. В текущем случае проблема повторилась, но в другой части движка. В ходе анализа выяснилось, что проблема кроется в генерации байткода. В момент выполнения <code>delete</code>-операции проверка на наличие "hole" происходит корректно, но затем результат сохраняется и воспринимается как проверенный, даже при последующих обращениях. Это приводит к тому, что при возврате значения <code>y</code> из функции соответствующая проверка уже не выполняется, и движок возвращает необработанный "hole".

Причина кроется в механизме управления так называемыми "bitmap'ами" проверки hole-состояний. Эти структуры фиксируют, какие переменные уже были проверены на наличие "дыры", чтобы не дублировать проверки и не снижать производительность. Однако если проверка выполняется вне нужной области видимости, она может ошибочно считаться глобальной. В результате при следующем обращении к переменной проверка пропускается, и движок возвращает значение, которое по идее не должно было попасть в руки пользователя.

Патч, выпущенный Google, корректирует этот механизм. Теперь каждый участок байткода имеет изолированную область для контроля hole-проверок, и возврат значения переменной снова сопровождается корректной валидацией. Это исключает возможность утечки "дыры" в обход стандартных защитных механизмов.

Сама уязвимость выглядит как нечто технически сложное и специфическое, но последствия её эксплуатации могут быть весьма серьёзными. Получив доступ к скрытым внутренним значениям V8, атакующий может сконструировать примитивы для чтения и записи произвольной памяти, что в итоге приводит к выполнению произвольного кода в контексте браузера. Это особенно опасно в случае атак через JavaScript в браузерах Chrome и других продуктах на базе Chromium.

Инцидент показывает, насколько важно точно и строго соблюдать логику обработки ошибок и промежуточных состояний даже на уровне генерации байткода. В данном случае одна незащищённая переменная оказалась точкой входа для полноценной Для просмотра ссылки Войди или Зарегистрируйся , уже используемой в реальных атаках.
 
Источник новости
www.securitylab.ru

Похожие темы