ProseMirrorToHtml 跨站脚本漏洞:未转义HTML属性值可导致XSS攻击

该安全公告详细描述了Ruby gem `prosemirror_to_html` 中存在的一个高危跨站脚本漏洞。攻击者可通过恶意构造的HTML属性值注入并执行任意JavaScript代码,影响处理用户生成内容的应用。文章提供了漏洞影响、补丁信息及临时缓解措施。

漏洞概述

此公告是一个重复公告,因其与 GHSA-52c5-vh7f-26fx 重复而于 2025年11月10日被撤销。保留此链接是为了维护外部引用。

原始描述

影响

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

受影响方:

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

攻击向量包括:

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

补丁

修复工作目前正在进行中。一旦发布,用户应升级到版本 0.2.1 或更高版本。 该补丁使用 CGI.escapeHTML 对所有HTML属性值进行转义,以防止注入攻击。

临时缓解措施

在获得修复版本之前,用户可以实施以下一项或多项缓解措施:

  1. 净化输出: 通过如 Sanitize 或 Loofah 这样的净化库处理HTML输出:
1
2
html = ProsemirrorToHtml.render(document)
safe_html = Sanitize.fragment(html, Sanitize::Config::RELAXED)
  1. 实施内容安全策略: 添加严格的CSP头部以防止内联JavaScript执行:
1
Content-Security-Policy: default-src 'self'; script-src 'self'
  1. 输入验证: 如果可能,在转换之前验证并净化 ProseMirror 文档,以防止恶意内容进入系统。

技术详情

bundler prosemirror_to_html (RubyGems)

受影响版本 < 0.2.1

已修复版本 0.2.1

严重性 高 CVSS 总体得分:7.6 CVSS v3 基准指标:AV:N/AC:L/PR:L/UI:R/S:C/C:H/I:L/A:N

弱点 CWE-79: 在网页生成过程中对输入的不当中和(跨站脚本)

参考链接

  • GHSA-52c5-vh7f-26fx
  • etaminstudio/prosemirror_to_html@4d59f94
  • 易受攻击的代码:https://github.com/etaminstudio/prosemirror_to_html/blob/ea8beb32f6c37f29f042ba4155ccf18504da716e/lib/prosemirror_to_html.rb#L249
  • OWASP XSS 防护备忘单
  • RubySec 咨询数据库条目
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计