Node.js 漏洞通过 async_hooks 栈溢出导致服务器崩溃
HackerNews 编译,转载请注明出处: Node.js已发布更新,修复了一个被其描述为影响”几乎所有生产环境Node.js应用”的严重安全问题。若被成功利用,该漏洞可能引发拒绝服务条件。 Node.js的Matteo Collina和Joyee Cheung在周二的一份公告中表示:”Node.js/V8会尽力从栈空间耗尽中恢复,并抛出一个可捕获的错误,许多框架已依赖此机制来保证服务可用性。但一个仅在启用async_hooks时才会复现的bug会破坏这种恢复尝试,导致当用户代码中的递归耗尽栈空间时,Node.js会直接退出并返回代码7,而不会抛出可捕获的错误。这使得那些递归深度由未净化的输入控制的应用程序容易遭受拒绝服务攻击。” 该漏洞的核心在于,当启用async_hooks且用户代码发生栈溢出时,Node.js会直接以退出码7(表示内部异常处理程序运行时失败)退出,而不是正常地处理异常。Async_hooks是一个底层的Node.js API,允许开发者跟踪数据库查询、定时器或HTTP请求等异步资源的生命周期。 Node.js表示,由于许多框架和应用程序性能监控工具使用了AsyncLocalStorage(一个构建在async_hooks模块之上的组件,使得在整个异步操作生命周期内存储数据成为可能),该问题影响了多个框架和APM工具,包括React Server Components、Next.js、Datadog、New Relic、Dynatrace、Elastic APM和OpenTelemetry。 该漏洞已在以下版本中得到修复: Node.js 20.20.0 (LTS) Node.js 22.22.0 (LTS) Node.js 24.13.0 (LTS) Node.js 25.3.0 (Current) 此问题还影响从8.x(首个包含async_hooks的版本)到18.x的所有Node.js版本。值得注意的是,代号为Carbon的Node.js 8.0.0版本发布于2017年5月30日。然而,这些版本由于已达到生命终止状态,将不会收到补丁。 已实施的修复会检测栈溢出错误并将其重新抛给用户代码,而不是将其视为致命错误。该漏洞被追踪为CVE-2025-59466(CVSS评分:7.5)。尽管实际影响重大,但Node.js表示,由于以下几个原因,他们仅将此修复视为一种缓解措施: 栈空间耗尽不属于ECMAScript规范的一部分。 V8 JavaScript引擎不将其视为安全问题。 作为异常处理最后一道防线的”uncaughtException”处理程序存在限制。 Node.js表示:”尽管这是对未指定行为的错误修复,但由于其对生态系统的广泛影响,我们选择将其包含在安全版本中。React Server Components、Next.js以及几乎所有的APM工具都受到影响。此修复改善了开发者体验,并使错误处理更具可预测性。” 鉴于该漏洞的严重性,建议相关框架/工具的用户及服务器托管提供商尽快更新。同时,建议库和框架的维护者应用更强大的防御措施来应对栈空间耗尽问题,确保服务可用性。 此次披露之际,Node.js还修复了另外三个高危漏洞(CVE-2025-55131、CVE-2025-55130和CVE-2025-59465),这些漏洞可能分别被利用来实现数据泄漏或损坏、通过精心构造的相对符号链接路径读取敏感文件,以及触发远程拒绝服务攻击。 消息来源:thehackernews; 本文由 HackerNews.cc 翻译整理,封面来源于网络; 转载请注明“转自 HackerNews.cc”并附上原文