ProsemirrorToHtml 因HTML属性值未转义存在跨站脚本(XSS)漏洞

本文详细披露了Ruby库prosemirror_to_html中的一个高危跨站脚本漏洞。该漏洞源于库在将ProseMirror文档转换为HTML时未对标签属性值进行转义,攻击者可注入恶意JavaScript代码。文章说明了影响范围、攻击向量,并提供了补丁、工作区及缓解措施。

漏洞详情

包管理器: bundler (RubyGems) 受影响的包: prosemirror_to_html 受影响版本: < 0.2.1 已修复版本: 0.2.1

影响

prosemirror_to_html gem 存在跨站脚本(XSS)漏洞,漏洞源于恶意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. 净化输出:将HTML输出通过如 SanitizeLoofah 等净化库进行处理:
1
2
html = ProsemirrorToHtml.render(document)
safe_html = Sanitize.fragment(html, Sanitize::Config::RELAXED)
  1. 实施内容安全策略(CSP):添加严格的CSP标头以防止内联JavaScript执行:
1
Content-Security-Policy: default-src 'self'; script-src 'self'
  1. 输入验证:如果可能,在转换之前验证并清理 ProseMirror 文档,以防止恶意内容进入系统。

参考

漏洞严重程度与详细信息

严重程度: 高危 CVSS 总体评分: 8.7 / 10

CVSS v4 基础指标

1
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:L/SC:N/SI:N/SA:N
  • 攻击向量 (AV): 网络
  • 攻击复杂度 (AC): 低
  • 攻击要求 (AT): 无
  • 所需权限 (PR): 无
  • 用户交互 (UI): 被动
  • 易受攻击系统的影响指标
    • 机密性 (VC): 高
    • 完整性 (VI): 高
    • 可用性 (VA): 低
  • 后续系统的影响指标
    • 机密性 (SC): 无
    • 完整性 (SI): 无
    • 可用性 (SA): 无

弱点

CWE-79: 在网页生成过程中输入的不当中和(‘跨站脚本’) 产品在将用户可控的输入放置到用作提供给其他用户的网页的输出之前,未对其进行中和或未正确中和。

标识符

  • GHSA ID: GHSA-4249-gjr8-jpq3
  • CVE ID: 暂无已知CVE

源代码

  • 仓库: etaminstudio/prosemirror_to_html

发布日期: 2025年11月13日 (至 GitHub Advisory Database) 审阅日期: 2025年11月13日 最后更新日期: 2025年11月13日

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