CVE-2026-9697CVE-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,表明该漏洞可通过网络利用,无需认证和用户交互,但攻击复杂度较高(需要中间人位置),对机密性和完整性有高影响,不影响可用性。