История одной "дыры", ставшей эксплойтом.
В июне 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.
Инцидент показывает, насколько важно точно и строго соблюдать логику обработки ошибок и промежуточных состояний даже на уровне генерации байткода. В данном случае одна незащищённая переменная оказалась точкой входа для полноценной Для просмотра ссылки Войдиили Зарегистрируйся , уже используемой в реальных атаках.
В июне 2025 года в JavaScript-движке V8 была обнаружена Для просмотра ссылки Войди
Исследователь с ником @DarkNavyOrg Для просмотра ссылки Войди
В демонстрационном коде Для просмотра ссылки Войди
В прошлом аналогичная уязвимость уже возникала в 2023 году — тогда Для просмотра ссылки Войди
Причина кроется в механизме управления так называемыми "bitmap'ами" проверки hole-состояний. Эти структуры фиксируют, какие переменные уже были проверены на наличие "дыры", чтобы не дублировать проверки и не снижать производительность. Однако если проверка выполняется вне нужной области видимости, она может ошибочно считаться глобальной. В результате при следующем обращении к переменной проверка пропускается, и движок возвращает значение, которое по идее не должно было попасть в руки пользователя.
Патч, выпущенный Google, корректирует этот механизм. Теперь каждый участок байткода имеет изолированную область для контроля hole-проверок, и возврат значения переменной снова сопровождается корректной валидацией. Это исключает возможность утечки "дыры" в обход стандартных защитных механизмов.
Сама уязвимость выглядит как нечто технически сложное и специфическое, но последствия её эксплуатации могут быть весьма серьёзными. Получив доступ к скрытым внутренним значениям V8, атакующий может сконструировать примитивы для чтения и записи произвольной памяти, что в итоге приводит к выполнению произвольного кода в контексте браузера. Это особенно опасно в случае атак через JavaScript в браузерах Chrome и других продуктах на базе Chromium.
Инцидент показывает, насколько важно точно и строго соблюдать логику обработки ошибок и промежуточных состояний даже на уровне генерации байткода. В данном случае одна незащищённая переменная оказалась точкой входа для полноценной Для просмотра ссылки Войди
- Источник новости
- www.securitylab.ru