Почему ваш сайт на Node.js может внезапно «лечь»? Всё дело в баге, который разработчики V8 даже не считают за ошибку

Почему ваш сайт на Node.js может внезапно «лечь»? Всё дело в баге, который разработчики V8 даже не считают за ошибку

В зоне риска оказались системы, работающие на каждом втором проекте.

image

Разработчики Node.js выпустили обновления для устранения критической уязвимости, которая способна привести к отказу в обслуживании на большинстве приложений, работающих в продакшене. Проблема связана с некорректной обработкой переполнения стека при включённом модуле async_hooks — механизме, используемом для отслеживания жизненного цикла асинхронных операций.

Ошибка проявляется только при использовании async_hooks. В этом случае при достижении лимита глубины рекурсии из-за неочищенного пользовательского ввода Node.js аварийно завершает работу с кодом 7, не позволяя обработать исключение средствами самого приложения. Такой сбой делает уязвимыми системы, где глубина рекурсии может быть непредсказуемой, особенно если она зависит от внешних данных.

Особую обеспокоенность вызывает тот факт, что модуль AsyncLocalStorage, построенный на базе async_hooks, применяется во множестве популярных фреймворков и средств мониторинга, включая React Server Components, Next.js, а также инструменты от Datadog, New Relic, Dynatrace, Elastic и OpenTelemetry. Проблема затрагивает все версии Node.js, начиная с 8.x (первая с поддержкой async_hooks) и до 18.x включительно. Эти версии уже не поддерживаются, поэтому обновления для них не предусмотрены.

Уязвимость была устранена в версиях Node.js 20.20.0, 22.22.0, 24.13.0 и 25.3.0. Реализация исправления позволяет перехватывать переполнение стека и повторно выбрасывать ошибку в пользовательский код, вместо того чтобы воспринимать её как фатальную.

Несмотря на ощутимое влияние на экосистему, команда Node.js классифицирует исправление как временную меру. Объясняется это тем, что переполнение стека не регулируется стандартом ECMAScript, а движок V8 не считает его уязвимостью. Кроме того, существуют ограничения в обработчике uncaughtException, который изначально задумывался как крайняя мера.

Специалисты подчёркивают, что решение повышает предсказуемость в обработке ошибок и снижает риск внезапного завершения работы приложений. В связи с этим всем пользователям, работающим с затронутыми фреймворками и инструментами, а также хостинг-провайдерам рекомендуется как можно скорее обновиться до защищённых версий. Разработчикам библиотек и фреймворков также советуют усиливать защиту от переполнения стека для сохранения стабильности сервисов.

Одновременно с этим Node.js устранил ещё три уязвимости высокой степени риска. Они позволяли утечку данных, чтение конфиденциальных файлов через символические ссылки и удалённый отказ в обслуживании. Эти проблемы отслеживаются под идентификаторами CVE-2025-55131, CVE-2025-55130 и CVE-2025-59465 соответственно.