Критическая уязвимость Node.js async_hooks DoS (CVE-2025-59466) — немедленные действия для команд полного стека

ReactNode.jsDevOps

TL;DR — Ошибка Node.js с высоким воздействием (CVE-2025-59466) вызывает необратимое завершение процесса, когда происходит переполнение стека, пока активны обратные вызовы async_hooks. Поскольку AsyncLocalStorage / async_hooks широко используются в React Server Components, Next.js и каждым основным агентом APM, многие серверные JavaScript приложения подвержены легкому отказу в обслуживании. Немедленно обновите до исправленных версий Node.js (выпущенных 13 января 2026 года) и примените краткосрочные меры, если вы не можете сразу установить патч. (nodejs.org)

Что произошло (кратко)

  • Когда включены async_hooks (или AsyncLocalStorage, основанный на нем), определенные переполнения стека (например, глубокая рекурсия, которая выделяет промисы) могут обойти обычную обработку ошибок и вызвать немедленный выход Node.js (код выхода 7) вместо выбрасывания ловимого RangeError. Это делает сбои необратимыми и легко эксплуатируемыми как DoS. (nodejs.org)

Кому это вредит

  • Любому производственному приложению, использующему async_hooks или AsyncLocalStorage. На практике наиболее подверженные группы:
    • React Server Components (RSC) и серверы Next.js, которые используют AsyncLocalStorage для контекста запроса.
    • APM/инструментальные агенты (Datadog, New Relic, Elastic APM, OpenTelemetry и т. д.), которые включают трассировку async_hooks.
    • Любой серверный код, который может быть приведен к глубокой рекурсии внешним вводом. (nodejs.org)

Исправленные версии (что обновить сейчас)

  • Обновления безопасности Node.js с исправлением были выпущены 13 января 2026 года — обновите до соответствующих исправленных версий для вашей линии релиза. Примеры, указанные в уведомлении, включают исправленные сборки в линиях 20.x, 22.x, 24.x и 25.x (см. официальное уведомление Node.js для точных номеров версий для вашей платформы). Приоритизируйте патчинг серверов, доступных из интернета, и CI-агентов, которые выполняют серверный рендеринг или инструментирование. (nodejs.org)

Немедленный операционный контрольный список (высокое воздействие, минимальное трение)

  1. Сначала патч
    • Разверните обновления безопасности Node.js на тестовых и производственных средах как можно скорее. Это рекомендуемое и наименее рискованное решение. (nodejs.org)
  2. Если вы не можете немедленно установить патч
    • Временно отключите сторонние APM/инструментальные агенты на публичных конечных точках (они часто включают async_hooks). Оцените уведомления поставщиков для исправленных версий агентов. (nodejs.org)
    • Добавьте защитную валидацию ввода к конечным точкам, которые разбирают глубоко вложенные данные (ограничьте рекурсию/глубину JSON). Не полагайтесь на выполнение, чтобы сделать переполнения стека восстанавливаемыми. (nodejs.org)
    • Рассмотрите возможность запуска уязвимых сервисов под контроллерами быстрого перезапуска (systemd, k8s probes) только как временную меру — это устраняет сбои, но не предотвращает эксплуатацию. Используйте это только пока вы устанавливаете патч. (nodejs.org)
  3. Для команд на Node.js 24+
    • Node.js 24 повторно реализовал AsyncLocalStorage, используя AsyncContextFrame от V8, что снижает зависимость от обратных вызовов async_hooks; во многих стандартных развертываниях 24+ экземпляры React/Next.js не затрагиваются таким образом. Тем не менее, исправленные версии 24.x все еще были выпущены — обновляйтесь в любом случае. (nodejs.org)

Как быстро обнаружить уязвимость

  • Поиск в вашем дереве зависимостей и логах запуска на использование async_hooks или AsyncLocalStorage.
  • Проверьте наличие APM-агентов, которые включают трассировку; эти агенты обычно вызывают async_hooks.createHook().
  • Мониторинг необъяснимых завершений процессов с кодом выхода 7 и корреляция с недавними запросами, содержащими глубоко вложенные полезные нагрузки. (nodejs.org)

Почему это важно для команд полного стека

  • Серверный рендеринг и распределенная трассировка являются основными частями современных стеков полного стека. Эта ошибка показывает, что низкоуровневые внутренние механизмы выполнения (асинхронный контекст и хуки) могут создавать системные риски доступности на многих уровнях — фреймворк, платформа и телеметрия — и что поведение выполнения не должно рассматриваться как граница безопасности. Исправление выполнения необходимо, но команды также должны укрепить контроль ввода/рекурсии на уровне приложения. (nodejs.org)

Быстрый план действий (один час, один день, одна неделя)

  • Один час: Инвентаризация сервисов, использующих AsyncLocalStorage или APM-агентов; добавьте мониторинг для кода выхода 7. (nodejs.org)
  • Один день: Разверните исправленные сборки Node.js на тестовой среде; координируйте обновления агентов поставщиков; ограничьте или отключите агентов на публичных конечных точках, если это необходимо. (nodejs.org)
  • Одна неделя: Внедрите исправленный Node.js в производственную среду, проверьте поведение приложения под нагрузкой и добавьте ограничения ввода/рекурсии к путям разбора запросов. Задокументируйте инцидент и обновите руководства по эксплуатации. (nodejs.org)

Заключительная заметка

  • Это практическая проблема доступности, касающаяся всей экосистемы (не RCE). Проект Node.js выпустил исправления и рекомендации; команды полного стека должны рассматривать это как операционную чрезвычайную ситуацию для серверного рендеринга и инструментированных производственных сервисов: инвентаризация, патчинг и немедленные меры по смягчению рекурсии, вызванной вводом. (nodejs.org)

Источник: Официальное уведомление Node.js — Смягчение уязвимости отказа в обслуживании из-за необратимого исчерпания пространства стека для пользователей React, Next.js и APM. (nodejs.org)

Ссылка:

Источник

Читать дальше