未验证的 GitLab URL 参数将 OAuth 授权步骤重定向到攻击者控制的宿主 漏洞概述 Draw.io 客户端接受一个 URL 参数,该参数会覆盖在 OAuth 登录期间使用的 GitLab 服务器 URL(2019 年引入以支持自托管 GitLab 实例)。在修复之前,该值在应用时没有进行验证或白名单检查,从而允许直接构建 OAuth 授权 URL,该 URL 在 GitLab 登录对话框中打开。 影响范围 受影响版本: < 29.7.8 修复版本: 29.7.9 CVSS v3 基础分数: 3.4 / 10 (低) 攻击向量: 网络 攻击复杂度: 高 特权要求: 无 用户交互: 需要 范围: 已改变 机密性: 低 完整性: 无 可用性: 无 具体影响 1. 凭证钓鱼 (CVE-401): 攻击者提供伪造的 GitLab 登录页面,因为前面的授权提示由 draw.io 本身呈现,用户会信任弹出窗口。 2. 会话状态令牌泄露 (CVE-200): OAuth 请求转发到攻击者的主机,包含 参数,其中包含一个会话范围的 CSRF 令牌。泄露此令牌给攻击者控制的起源原则上启用了 OAuth Login CSRF:获得自己有效 GitLab 账户的攻击者可以拼接 到回调 URL,导致受害者的 draw.io 会话链接到攻击者的 GitLab 账户。 受影响用户: 任何 draw.io 部署(包括 app.diagrams.net)打开他们未构建的链接的用户。 参数具有相同的未验证覆盖行为,在 上。 修复方案 已修复版本: v29.7.9 补丁说明: 修复后, 和 URL 参数仅在部署选项明确设置 时才会被处理(例如在 中)。在默认部署中,包括 app.diagrams.net,该标志为关闭,任何非默认 GitLab URL 都会被拒绝,用户会看到警告对话框,询问请求的服务器,并且没有方法继续。 自托管 GitLab 操作员: 如果合法依赖于该参数,必须设置 在他们的配置中。该设置也暴露在 Extras — Configuration editor 中。 变通方法 对于未修补版本上的最终用户: 不要打开包含 或 查询参数的 draw.io 链接。检查地址栏,然后在任何 GitLab 登录对话框中点击“Authorize”。 对于未修补版本上的自托管操作员: 在服务器端 JavaScript 中显式设置 GitLab 服务器 URL( 在 中),并剥离 、 查询参数在反向代理中。 或者,通过在 参数中默认 来禁用 GitLab 客户端,直到升级。 POC 代码