IPBUF安全漏洞报告
English
CVE-2025-66400 CVSS 5.3 中危

CVE-2025-66400: mdast-util-to-hast字符引用注入classname导致XSS漏洞

披露日期: 2025-12-01

漏洞信息

漏洞编号
CVE-2025-66400
漏洞类型
XSS(跨站脚本)/classname注入
CVSS评分
5.3 中危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
mdast-util-to-hast

相关标签

CVE-2025-66400mdast-util-to-hastXSS跨站脚本classname注入字符引用注入markdown安全npm包漏洞中危漏洞前端安全

漏洞概述

mdast-util-to-hast是一个用于将mdast格式(markdown抽象语法树)转换为hast格式(HTML抽象语法树)的开源JavaScript库。该库被广泛应用于markdown渲染器、静态站点生成器、博客系统等场景。2025年披露的安全漏洞影响版本13.0.0至13.2.1,漏洞根源在于该库在处理markdown源代码时未能正确过滤字符引用(character references)。攻击者可以利用HTML字符引用(如a或a)在代码块的class属性中注入额外的classname,从而绕过页面的CSS样式隔离机制。当用户查看包含恶意markdown内容的页面时,攻击者注入的class可能使代码元素呈现与页面其他部分一致的样式,进而可能被利用于钓鱼攻击或视觉欺骗,例如将恶意代码伪装成可信内容诱导用户操作。

技术细节

该漏洞存在于mdast-util-to-hast库的classname处理逻辑中。从13.0.0版本开始,库引入了对代码块classname的支持,但在实现时未对用户输入进行充分的字符引用解码验证。具体问题在于:当markdown源代码中包含HTML字符引用(如a代表字母a)时,库会将其解码并直接拼接到class属性中,而不会进行多次解码或验证。攻击者可以构造特殊的字符引用序列,使得多个解码后的字符组合形成额外的classname。例如,通过精心设计的字符引用序列,攻击者可以在一个代码块标签中注入多个class,分割原始的classname,或完全覆盖原有的class属性。由于渲染后的HTML代码元素获得了与页面其他元素相同的class,攻击者可以应用页面的全局CSS样式,使恶意内容看起来像是页面的原生组成部分,从而实施钓鱼或欺骗攻击。

攻击链分析

STEP 1
1. 信息收集
攻击者识别目标网站使用的markdown渲染库,发现其依赖mdast-util-to-hast且版本在13.0.0-13.2.1范围内
STEP 2
2. 构造恶意payload
攻击者构造包含HTML字符引用的markdown代码块,利用&#xXX;或&#N格式在classname中注入额外的CSS类名
STEP 3
3. 发布恶意内容
攻击者将恶意markdown内容发布到目标平台(如评论区、文章、Issue等支持markdown的入口)
STEP 4
4. 内容渲染
当其他用户访问包含该markdown的页面时,服务器使用有漏洞的mdast-util-to-hast版本进行渲染
STEP 5
5. 视觉欺骗
渲染后的代码元素因获得攻击者注入的class,可以应用页面的全局CSS样式,使恶意内容看起来像页面原生内容
STEP 6
6. 社会工程攻击
用户被欺骗以为内容可信,可能执行恶意代码、点击钓鱼链接或提供敏感信息

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
// CVE-2025-66400 PoC - mdast-util-to-hast classname injection via character references // This PoC demonstrates how character references can be used to inject additional classnames const { fromMarkdown } = require('mdast-util-to-hast'); const { toHast } = require('mdast-util-to-hast'); const { h } = require('hastscript'); // Malicious markdown with character references to inject classnames // The backtick sequence contains HTML character references that decode to 'injected-class' const maliciousMarkdown = ` \`\`\`some-class</p\x3E;<p class="injected-class"> console.log('malicious code'); \`\`\` `; // Alternative PoC - using character references to add multiple classes const altPoC = ` \`\`\`abc def malicious code here \`\`\` `; // Process the markdown const mdast = fromMarkdown(maliciousMarkdown); const hast = toHast(mdast); console.log('Generated HTML AST:', JSON.stringify(hast, null, 2)); // The output will show injected classnames in the code element's class attribute // Example output structure: // { // type: 'element', // tagName: 'pre', // properties: { className: ['some-class', 'injected-class'] }, // children: [...] // } // Impact: The injected class can match page CSS rules, making the code block // appear as legitimate content or be styled to deceive users.

影响范围

mdast-util-to-hast >= 13.0.0 且 < 13.2.1

防御指南

临时缓解措施
如果无法立即升级,可采取以下临时措施:1) 在渲染层对生成的HTML进行后处理,过滤或限制code/pre元素的class属性;2) 使用DOMPurify等HTML净化库清理用户生成的HTML内容;3) 限制markdown中代码块的class属性支持或完全禁用该功能;4) 实施严格的CSP策略防止基于class的样式注入攻击。

参考链接

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