当前位置: 首页 > news >正文

这个 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技巧合集

http://www.cnnetsun.cn/news/727260.html

相关文章:

  • 碧蓝航线Alas自动化脚本新手入门指南:轻松实现游戏全自动管理
  • MMD Tools插件完全指南:从入门到精通的Blender MMD创作秘籍
  • 分开的五年系列之001 | 对不起,我结婚了还有个孩子!
  • Azur Lane AutoScript:新手必备的高效游戏自动化工具完整指南
  • Unsloth中文数据集处理:编码问题解决方案
  • gpt-oss-20b-WEBUI使用避坑指南,新手必看少走弯路
  • ncmdump解密指南:3步解锁网易云音乐NCM文件
  • 碧蓝航线Alas自动化脚本深度解析:从零开始的完整配置指南
  • AI已经这么厉害,我们人类的价值在哪里?
  • Windows平台终极PDF工具:一键部署免安装的Poppler完整解决方案
  • gpt-oss-20b-WEBUI开启Harmony模式,结构化输出太强了
  • 3分钟搞定PotPlayer双语字幕:告别外语观影烦恼的终极方案
  • Blender MMD Tools插件:3D动画创作的跨软件桥梁
  • 百度网盘提取码智能获取工具终极解决方案
  • 大麦抢票神器:3分钟学会Python自动化抢票,告别黄牛高价票
  • 终极Dell G15散热优化指南:释放游戏本全部潜能
  • 10分钟精通小熊猫Dev-C++:零基础搭建C++开发环境全攻略
  • 如何选择最适合你的付费墙解锁工具:4种技术方案深度解析
  • ScreenTranslator完全攻略:跨语言障碍的终极解决方案
  • 如何用LAV Filters实现完美媒体播放?免费开源解码器全面配置指南
  • 企业级RAG知识库实战指南:从零构建智能问答系统
  • cv_unet_image-matting支持TIFF格式吗?高分辨率图像处理实测
  • 突破百度网盘限速:百度网盘解析工具终极指南
  • 如何彻底解决Windows右键菜单加载缓慢问题
  • 亲测GPEN人像修复镜像,老旧照片秒变高清效果惊艳
  • 英雄联盟辅助工具终极指南:快速提升你的峡谷竞争力
  • 3步完成FSMN-VAD部署:极简流程快速验证模型效果
  • 真实体验分享:我用这个镜像做了自己的动漫头像
  • 电商必备:用BSHM镜像快速制作商品主图人像
  • 真实体验分享:用科哥镜像修复模糊证件照