news 2026/4/16 13:39:34

这个 Node.js 漏洞可能导致 React 和 Next.js 崩溃

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
这个 Node.js 漏洞可能导致 React 和 Next.js 崩溃

上周我才知道一件挺反直觉的事:在 Node.js 里,栈溢出(Maximum call stack size exceeded)通常是“可抓住”的——你try/catch,服务照样跑。

但有个边界情况会让你当场破防: 只要启用了async_hooks(很多框架/监控工具都会启用),同样的栈溢出会变成进程级崩溃,Node 直接exit code 7退出,catch 不到、uncaughtException 也帮不上

这不是“理论 bug”。它会影响现实世界里一堆常见组合:React Server Components、Next.js、APM(Datadog / New Relic / OpenTelemetry 等)

1)正常的栈溢出行为

你以为世界应该这样运转:

function recursive() { return recursive(); } try { recursive(); } catch (err) { console.log('Caught stack overflow', err.message); }

通常会抛RangeError: Maximum call stack size exceeded,然后被 catch,服务继续跑。

2)真正吓人的情况

async_hooks开着时,某些路径下的栈溢出会触发 Node 的“致命异常处理”,直接让进程退出,catch 根本没机会执行。

复现长得像这样(用createHook().enable()模拟 APM 的行为):

import { createHook } from 'node:async_hooks'; createHook({ init() {} }).enable(); function recursive() { new Promise(() => {}); // 触发 async_hooks 路径 return recursive(); } try { recursive(); } catch (err) { console.log('This NEVER runs'); }

现象是:进程直接退出,exit code 7

3)为什么 React / Next.js / APM 特别容易踩中

因为它们大量依赖AsyncLocalStorage(底层基于async_hooks)去做“请求上下文追踪”:谁的请求、谁的 cookies、谁的 headers、链路追踪怎么串起来。

  • React Server Components:用类似AsyncLocalStorage的机制跟踪渲染/请求上下文(概念上是这样)

  • Next.js:在请求处理里用 ALS 保存 request context(cookies、headers 等)

  • APM:为了跨 async 边界串链路,常常启用async_hooks/ALS

所以现实里只要你:

  • 用 RSC / Next.js

  • 或者require('dd-trace')这类 APM 初始化

你大概率已经把async_hooks相关路径打开了。

4)真实攻击面

最狠的地方是:这不是“你写了死递归”才会发生。 **只要你有递归处理用户输入,而且深度可控,就有 DoS 风险。

比如 Next.js API route 里递归解析用户 JSON:

export default async function handler(req, res) { try { const result = processNestedData(req.body); res.json({ success: true }); } catch (err) { res.status(500).json({ error: 'Failed' }); // 可能根本走不到 } } function processNestedData(data) { if (Array.isArray(data)) { return data.map(processNestedData); } return data.value; }

攻击者丢一个深到离谱的嵌套数组(几万层),在启用了async_hooks的情况下可能直接把进程打挂。

一句话:一条恶意请求 = 整个 Node 进程下线。

5)官方修复:Node.js 已在 2026 年 1 月公告并修补

Node 官方在 2026 年 1 月发布了安全公告,说明当async_hooks启用且发生栈溢出时,旧行为会导致立即退出 code 7,并且跳过常规异常处理。

公告同时给出已修复版本(按官方描述的修补线):

  • Node 20.20.0+

  • Node 22.22.0+

  • Node 24.13.0+建议尽快升级。

另外官方也强调:“栈溢出可恢复”本来就是 best-effort 的未指定行为,别把它当安全边界

6)别只升级 Node

升级是第一步,但别自信过头——生产里真正稳的做法是:不要让用户输入控制递归深度

✅ 方案 A:硬性深度限制

function processNestedData(data, depth = 0) { if (depth > 100) throw new Error('Nesting too deep'); if (Array.isArray(data)) { return data.map(item => processNestedData(item, depth + 1)); } return data.value; }

✅ 方案 B:改成迭代(别让调用栈背锅)

function processNestedDataIterative(data) { const stack = [data]; while (stack.length) { const item = stack.pop(); if (Array.isArray(item)) { for (const child of item) stack.push(child); } } }

✅ 方案 C:输入层防御(非常实用)

  • 限制 body 大小(JSON payload 不要无限大)

  • 校验结构复杂度(例如最大嵌套层级、最大节点数)

  • 针对“用户可控递归”的逻辑做 fuzz / 压测

  • 开启 APM/Tracing 的情况下做一次专门的压力回归(因为这类坑就藏在“工具开启后”的路径里)

你现在该做什么(按优先级)

  1. 确认 Node 版本是否已在官方修复线之上(20.20.0+ / 22.22.0+ / 24.13.0+)

  2. 搜索代码库里所有“递归处理用户输入”的地方(JSON、AST、树、嵌套数组、markdown 解析、路由匹配等)

  3. 给这些逻辑加深度/规模上限,或改迭代

  4. 在“真实生产配置”(Next/RSC + APM)下跑一次最坏输入测试

如果你愿意,我可以按你的技术栈给你一个更贴地的“排查清单”:

  • Next.js(App Router / RSC)常见递归点

  • 常见依赖里可能引入深递归的库(解析器、schema validator、markdown 等)

  • 一套可以直接丢进 CI 的“深度炸弹”测试用例模板

全栈AI·探索:涵盖动效、React Hooks、Vue 技巧、LLM 应用、Python 脚本等专栏,案例驱动实战学习,点击二维码了解更多详情。

最后:

CSS终极指南

Vue 设计模式实战指南

20个前端开发者必备的响应式布局

深入React:从基础到最佳实践完整攻略

python 技巧精讲

React Hook 深入浅出

CSS技巧与案例详解

vue2与vue3技巧合集

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/10 23:53:19

用Unsloth微调后的模型能在CPU上流畅运行

用Unsloth微调后的模型能在CPU上流畅运行 1. 引言:为什么要在CPU上运行大模型? 你有没有遇到过这样的情况:好不容易微调了一个中文对话模型,结果部署时发现服务器没有GPU,或者想在本地笔记本上跑一跑试试效果&#x…

作者头像 李华
网站建设 2026/4/16 9:08:44

DLSS性能监控完全指南:从零开始配置游戏帧率指示器

DLSS性能监控完全指南:从零开始配置游戏帧率指示器 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 还在为游戏画面是否真正启用了DLSS技术而烦恼吗?DLSS指示器作为NVIDIA显卡的"性能仪表盘…

作者头像 李华
网站建设 2026/4/16 9:06:14

LeagueAkari终极指南:从青铜到王者的智能游戏助手完全手册

LeagueAkari终极指南:从青铜到王者的智能游戏助手完全手册 【免费下载链接】LeagueAkari ✨兴趣使然的,功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 还在…

作者头像 李华
网站建设 2026/4/16 9:02:45

英雄联盟智能助手League Akari:3分钟解决你的游戏烦恼

英雄联盟智能助手League Akari:3分钟解决你的游戏烦恼 【免费下载链接】LeagueAkari ✨兴趣使然的,功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 你是否曾…

作者头像 李华
网站建设 2026/4/15 22:04:47

首次加载慢正常吗?HeyGem模型预热机制揭秘

首次加载慢正常吗?HeyGem模型预热机制揭秘 你有没有遇到过这种情况:第一次点击“开始生成”按钮时,系统卡了几分钟才动起来,而第二次、第三次处理同样的任务却快得多?如果你正在使用 Heygem数字人视频生成系统批量版w…

作者头像 李华
网站建设 2026/4/16 9:08:33

Blender MMD插件终极指南:3步搞定专业级动画制作

Blender MMD插件终极指南:3步搞定专业级动画制作 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools 还在为…

作者头像 李华