IPBUF安全漏洞报告
English
CVE-2026-39315 CVSS 6.1 中危

CVE-2026-39315 Unhead HTML实体绕过导致XSS漏洞

披露日期: 2026-04-09

漏洞信息

漏洞编号
CVE-2026-39315
漏洞类型
XSS (跨站脚本攻击)
CVSS评分
6.1 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
Unhead

相关标签

XSSUnheadSSRBypassHTML InjectionCVE-2026-39315

漏洞概述

Unhead在2.1.13版本前存在安全绕过漏洞。`useHeadSafe()`函数在解码HTML实体时使用了固定位数上限的正则表达式,无法正确处理带前导零的字符引用。这导致攻击者可绕过危险协议检查,在SSR输出中注入恶意脚本,引发XSS攻击。

技术细节

该漏洞位于`packages/unhead/src/plugins/safe.ts`的`hasDangerousProtocol()`函数。该函数旨在过滤`javascript:`等危险协议,但在解码HTML实体时,正则表达式对数字字符引用的位数做了限制。根据HTML5规范,数字字符引用允许无限前导零。攻击者可构造超过位数限制的填充实体(如`:`),使解码器跳过该实体,导致其未被转义。随后`makeTagSafe()`将原始值写入SSR HTML,而浏览器在解析时会正确解码这些填充的实体,从而绕过安全检查执行恶意JavaScript代码。

攻击链分析

STEP 1
1. 侦察
攻击者确认目标应用使用了Unhead库且版本低于2.1.13,并确认应用使用了`useHeadSafe()`来渲染用户可控的头部内容。
STEP 2
2. 构造Payload
攻击者构造包含`javascript:`协议的恶意链接,但使用大量前导零的HTML实体编码冒号(例如`:`),以此绕过正则表达式的位数限制。
STEP 3
3. 注入Payload
攻击者将构造的恶意字符串提交给应用程序,该字符串被传递给`useHeadSafe()`函数进行处理。
STEP 4
4. 服务端处理
Unhead的`hasDangerousProtocol()`函数尝试解码实体并检查危险协议。由于实体数字过长,解码器跳过解码,字符串未被识别为危险协议,原始值被写入HTML响应。
STEP 5
5. 客户端执行
受害者的浏览器接收到HTML页面,浏览器原生的HTML解析器正确解码了带前导零的实体,还原出`javascript:`协议并执行恶意脚本。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// PoC for CVE-2026-39315 // The vulnerability bypasses the 'javascript:' protocol check using padded HTML entities. // The regex in unhead (vulnerable versions) has a digit cap. // We use a large number of leading zeros to exceed the cap. // The decoder skips it, so the check fails, but the browser executes it. const maliciousPayload = "javascript:alert('CVE-2026-39315_PoC')"; // Conceptual usage in a vulnerable Nuxt/Unhead application: // useHeadSafe({ // meta: [ // { httpEquiv: "refresh", content: maliciousPayload } // ] // }); // Explanation: // 1. Server-side check: 'javascript:...' does not start with 'javascript:' (because : is encoded and not decoded by the limited regex). // 2. Browser-side: Parses the entity, sees 'javascript:', and executes the alert. console.log("Payload generated: " + maliciousPayload);

影响范围

Unhead < 2.1.13

防御指南

临时缓解措施
建议用户尽快将Unhead库升级至2.1.13或更高版本。在无法立即升级的情况下,应严格限制输入到`useHeadSafe()`的数据来源,避免直接渲染不受信任的用户输入,或实施额外的WAF规则以检测包含异常大量前导零的HTML实体编码。

参考链接

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