IPBUF安全漏洞报告
English
CVE-2026-9679 CVSS 5.9 中危

CVE-2026-9679 undici cookie解析器HTTP响应头注入漏洞

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

漏洞信息

漏洞编号
CVE-2026-9679
漏洞类型
HTTP响应头注入 / 缓存投毒
CVSS评分
5.9 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
undici (Node.js HTTP客户端)

相关标签

undiciNode.jsHTTP响应头注入cookie解析缓存投毒开放重定向会话固定CRLF注入百分号解码中危漏洞

漏洞概述

CVE-2026-9679是undici HTTP客户端库中cookie解析器存在的一个安全漏洞。该漏洞源于undici的parseSetCookie函数在解析Set-Cookie头时,通过qsUnescape对cookie值进行了百分号解码(percent-decoding),将类似%0D%0A、%00、%3B、%3D等编码序列转换为其对应的字面字节。然而,根据RFC 6265 §5.4规范,cookie值不应进行任何解码处理,浏览器也不会对其进行解码。这一不当的解码行为导致了一个严重的安全问题:当应用程序解析上游服务器返回的Set-Cookie头后,将解析后的cookie值转发到下游响应头中(如代理中间件、SSR框架等场景),攻击者控制的恶意上游服务器可以通过精心构造的cookie值注入任意的Set-Cookie、Location或Cache-Control等响应头。这可能导致会话固定(session fixation)、开放重定向(open redirect)以及缓存投毒(cache poisoning)等多种攻击。该漏洞由PR #3789引入,影响undici 7.0.0及以上版本。CVSS评分为5.9,属于中危级别,攻击向量为网络,无需认证和用户交互,机密性和完整性影响均为高,完整性影响为无。

技术细节

从技术层面分析,该漏洞的核心问题在于undici的cookie解析器对Set-Cookie头中的值进行了非标准的百分号解码操作。具体而言,parseSetCookie函数内部调用了qsUnescape方法,该方法会将URL编码的字符(如%0D%0A代表CRLF、%00代表NUL、%3B代表分号、%3D代表等号)转换为其原始字节形式。RFC 6265明确规定cookie值不应进行解码处理,浏览器在处理cookie时也不会执行解码操作,因此undici的这一行为违反了规范。攻击利用方式如下:攻击者控制一个恶意上游服务器(或通过中间人攻击),在返回的Set-Cookie头中注入编码后的特殊字符,例如设置Cookie值为evil%0D%0ALocation:%20http://attacker.com。当受害应用程序使用undici的parseSetCookie解析该cookie后,得到的值将包含字面的CRLF字符。如果该应用程序将解析后的cookie值直接转发到下游HTTP响应的Set-Cookie头中,CRLF字符将导致HTTP响应头分割(header injection),从而注入额外的响应头如Location,实现开放重定向攻击。同样,攻击者可以注入Cache-Control头来执行缓存投毒,或注入额外的Set-Cookie头来实施会话固定攻击。该漏洞的触发条件包括:1)应用程序使用undici的cookie解析API(parseSetCookie、parseCookie或getSetCookies);2)应用程序将解析后的cookie值直接转发到响应头中而未进行适当的过滤。

攻击链分析

STEP 1
步骤1:搭建恶意上游服务
攻击者控制一个恶意上游服务器或通过中间人攻击拦截正常请求,在HTTP响应的Set-Cookie头中注入经过URL编码的特殊字符序列,如%0D%0A(CRLF)、%00(NUL)、%3B(分号)、%3D(等号)等。
STEP 2
步骤2:触发cookie解析
受害应用程序使用undici的parseSetCookie、parseCookie或getSetCookies函数解析上游返回的Set-Cookie头。由于undici 7.0.0+版本中的qsUnescape会进行百分号解码,编码序列被还原为原始字节。
STEP 3
步骤3:转发到下游响应头
应用程序将解析后的cookie值直接转发到下游HTTP响应的Set-Cookie头或其他响应头中,未对CR、LF、NUL等危险字节进行过滤或拒绝。
STEP 4
步骤4:HTTP响应头注入
cookie值中的CRLF字符导致HTTP响应头分割,攻击者成功注入额外的响应头如Location(开放重定向)、Cache-Control(缓存投毒)或额外的Set-Cookie(会话固定)。
STEP 5
步骤5:实施进一步攻击
根据注入的响应头类型,攻击者可以实施会话固定(劫持用户会话)、开放重定向(将用户重定向到钓鱼网站)或缓存投毒(向共享缓存注入恶意内容)。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
const undici = require('undici'); // Simulate a malicious upstream server response const maliciousSetCookie = 'session=evil%0D%0ALocation:%20http://attacker.com%0D%0ACache-Control:%20no-cache'; // Parse the cookie using undici's vulnerable parseSetCookie const parsed = undici.parseSetCookie(maliciousSetCookie); console.log('Parsed cookie value:', parsed.value); // The parsed value will contain literal CRLF characters due to percent-decoding // If the application forwards this value to a response header: const injectedResponseHeader = `Set-Cookie: ${parsed.value}`; console.log('Injected response header:'); console.log(injectedResponseHeader); // This demonstrates how arbitrary headers (Location, Cache-Control) can be injected // via HTTP response header splitting / injection // Attack chain demonstration: // 1. Attacker controls upstream that returns crafted Set-Cookie // 2. Application parses cookie with undici parseSetCookie // 3. Application forwards parsed value to downstream response header // 4. CRLF in cookie value causes header injection // 5. Attacker achieves session fixation, open redirect, or cache poisoning

影响范围

undici >= 7.0.0 且 < 7.28.0
undici 8.x < 8.5.0

防御指南

临时缓解措施
如果无法立即升级undici版本,临时缓解措施包括:1)不要将parseSetCookie、parseCookie或getSetCookies返回的值直接转发到HTTP响应头中;2)在转发前对cookie值进行清理(sanitize),过滤或拒绝包含CR(\r)、LF(\n)、NUL(\0)、分号(;)和等号(=)等危险字节的值;3)在反向代理或网关层面添加HTTP响应头注入检测规则;4)监控上游服务的Set-Cookie头内容,对异常编码序列进行告警。

参考链接

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