ProseMirror转HTML库的XSS漏洞:未转义的属性值引发跨站脚本攻击

本文详细分析了Ruby Gem prosemirror_to_html中的一个高危跨站脚本(XSS)漏洞。该漏洞因HTML属性值未正确转义,允许攻击者注入恶意JavaScript。文中介绍了攻击向量、受影响的系统、已发布的修复补丁以及可行的临时缓解措施。

CVE-2025-64501:prosemirror_to_html 中的跨站脚本(XSS)漏洞

漏洞详情

漏洞名称:通过未转义的HTML属性值导致的跨站脚本(XSS)漏洞

CVE编号:CVE-2025-64501

严重性等级:高危(CVSS评分 7.6)

影响范围:prosemirror_to_html gem 0.2.1之前的版本

漏洞描述prosemirror_to_html gem存在一个跨站脚本攻击漏洞。虽然标签内容已正确转义,但HTML属性值未被转义,使得攻击者能够注入任意JavaScript代码。

技术影响分析

受影响的应用

  • 任何使用prosemirror_to_html将ProseMirror文档转换为HTML的应用程序
  • 处理用户生成的ProseMirror内容的应用程序风险最高
  • 查看渲染后的HTML输出的终端用户可能在其浏览器中执行恶意JavaScript

攻击向量示例

攻击者可以利用以下方式执行恶意代码:

  1. 带有javascript:协议的href属性<a href="javascript:alert(document.cookie)">
  2. 事件处理器<div onclick="maliciousCode()">
  3. 图片的onerror属性<img src=x onerror="alert('XSS')">
  4. 其他可执行JavaScript的HTML属性

技术原理

漏洞代码位置

漏洞位于prosemirror_to_html库的渲染逻辑中。在render_opening_tag方法中,标签属性值直接拼接而未经过适当的HTML转义:

1
2
3
4
5
6
attrs = ''
if tag&.attrs
  tag.attrs.each_pair do |attr, value|
    attrs << " #{attr}=\"#{value}\""  # 此处value未转义
  end
end

根本原因

该漏洞的根本原因是CWE-79:网页生成期间输入中和不当。虽然标签内容通过CGI.escapeHTML进行了转义,但属性值却未经过相同处理,导致了不一致的防护措施。

解决方案

官方补丁

该问题已在版本0.2.1中修复。补丁通过使用CGI.escapeHTML对所有HTML属性值进行转义来防止注入攻击。

修复代码示例

1
attrs << " #{attr}=\"#{CGI.escapeHTML(value)}\""

临时缓解措施

在应用补丁版本之前,用户可以实施以下一种或多种缓解措施:

1. 输出净化

通过Sanitize或Loofah等净化库处理HTML输出:

1
2
html = ProsemirrorToHtml.render(document)
safe_html = Sanitize.fragment(html, Sanitize::Config::RELAXED)

2. 实施内容安全策略(CSP)

添加严格的CSP头以防止内联JavaScript执行:

1
Content-Security-Policy: default-src 'self'; script-src 'self'

3. 输入验证

在可能的情况下,在转换前验证和净化ProseMirror文档,防止恶意内容进入系统。

CVSS评分详情

基本指标

  • 攻击向量:网络(AV:N)
  • 攻击复杂度:低(AC:L)
  • 所需权限:低(PR:L)
  • 用户交互:需要(UI:R)
  • 影响范围:变更(S:C)
  • 机密性影响:高(C:H)
  • 完整性影响:低(I:L)
  • 可用性影响:无(A:N)

完整向量字符串

CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:L/A:N

关联信息

参考链接

  1. 漏洞代码位置:https://github.com/etaminstudio/prosemirror_to_html/blob/ea8beb32f6c37f29f042ba4155ccf18504da716e/lib/prosemirror_to_html.rb#L249
  2. OWASP XSS防护备忘单:https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
  3. CWE-79详情:https://cwe.mitre.org/data/definitions/79.html
  4. GitHub安全通告:https://github.com/etaminstudio/prosemirror_to_html/security/advisories/GHSA-52c5-vh7f-26fx
  5. NVD漏洞详情:https://nvd.nist.gov/vuln/detail/CVE-2025-64501

相关标识符

  • GHSA ID:GHSA-52c5-vh7f-26fx
  • CWE ID:CWE-79

时间线

  • 发现日期:2025年11月6日前
  • 首次发布:2025年11月6日
  • NVD发布日期:2025年11月10日
  • 最后更新:2025年11月17日
  • 修复版本发布:0.2.1

总结

CVE-2025-64501是一个典型的不完整输入净化导致的XSS漏洞案例。它提醒开发者在处理用户生成内容时需要全面考虑所有可能的注入点,包括标签内容、属性值和样式等。及时的版本更新和深度防御策略(如CSP)是保护Web应用程序免受此类攻击的关键措施。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计