Node.js opublikował aktualizacje zabezpieczeń usuwające krytyczną lukę, którą opisano jako wpływającą na „praktycznie każdą produkcyjną aplikację Node.js” i która w przypadku wykorzystania może doprowadzić do odmowy usługi (DoS). Wydawcy ostrzegają, że problem występuje, gdy rekursje w kodzie użytkownika wyczerpią przestrzeń stosu w środowisku, które używa mechanizmów śledzenia asynchronicznych zasobów.
Jak wyjaśnili Matteo Collina i Joyee Cheung w komunikacie, Node.js/V8 stara się odzyskać kontrolę przy wyczerpaniu przestrzeni stosu, zgłaszając możliwy do przechwycenia błąd, na którym wiele frameworków polega w celu utrzymania dostępności usług. Błąd pojawia się tylko, gdy włączone są async_hooks — niskopoziomowe API pozwalające śledzić cykl życia zasobów asynchronicznych — i w takiej sytuacji mechanizm odzyskiwania zostaje złamany: proces Node.js zamiast wyrzucić przechwytywalne wyjątki kończy działanie z kodem wyjścia 7, co odpowiada Internal Exception Handler Run-Time Failure. W praktyce oznacza to, że aplikacje, których głębokość rekursji jest kontrolowana przez niesprawdzone dane wejściowe, mogą zostać łatwo spowolnione lub wyłączone przez atakującego.
W szczególności problem dotyczy także AsyncLocalStorage — komponentu zbudowanego na async_hooks, umożliwiającego przechowywanie stanu przez czas trwania operacji asynchronicznej — dlatego na liście podatnych znajdują się popularne frameworki i narzędzia do monitorowania wydajności aplikacji (APM). Wymienione technologie to m.in. React Server Components, Next.js, Datadog, New Relic, Dynatrace, Elastic APM oraz OpenTelemetry.
Poprawka została wprowadzona w następujących wersjach Node.js:
- Node.js 20.20.0 (LTS)
- Node.js 22.22.0 (LTS)
- Node.js 24.13.0 (LTS)
- Node.js 25.3.0 (Current)
Warto podkreślić, że problem dotyczy wszystkich wydań Node.js począwszy od 8.x — pierwszej wersji zawierającej async_hooks — aż do 18.x. Wersje te pozostają jednak niezałatane, ponieważ osiągnęły status end-of-life (EoL). Dla przypomnienia, Node.js 8.0.0 (kodowa nazwa Carbon) został wydany 30 maja 2017 roku.
Fix zastosowany w kodzie wykrywa błędy przepełnienia stosu i ponownie wyrzuca je do kodu użytkownika zamiast traktować je jako błąd krytyczny wymagający zakończenia procesu. Zaś problem jest śledzony pod identyfikatorem CVE-2025-59466 i oceniony ogólną wagą CVSS na 7,5. Mimo praktycznie istotnego wpływu na ekosystem, zespół Node.js kwalifikuje poprawkę jako ograniczenie (mitigację) — z jednej strony jest to naprawa zachowania nieokreślonego, z drugiej jej włączenie do wydania bezpieczeństwa uzasadniono szerokim wpływem na środowisko deweloperskie: poprawia przewidywalność obsługi błędów i doświadczenie programistów.
Z powodu powagi luki zaleca się jak najszybszą aktualizację użytkownikom dotkniętych frameworków i narzędzi oraz dostawcom serwerów. Opiekunom bibliotek i frameworków zaleca się wprowadzenie dodatkowych mechanizmów zabezpieczających przed wyczerpaniem przestrzeni stosu, aby zapewnić dostępność usług nawet przy złośliwych lub błędnych danych wejściowych.
W ogłoszeniu poinformowano też o poprawkach dla trzech innych wad o wysokiej wadze: CVE-2025-55131, CVE-2025-55130 oraz CVE-2025-59465. Mogły one umożliwić wyciek lub uszkodzenie danych, odczyt wrażliwych plików przy użyciu spreparowanych względnych dowiązań symbolicznych (symlinków) oraz zdalne wywołanie odmowy usługi, odpowiednio.