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