研究人员发布 GitLab 的远程代码执行 PoC,使已认证用户能够以 Git 身份执行命令
研究人员公开了 GitLab RCE PoC,在未升级的自托管 GitLab(18.11.3 等受影响版本)中,任何已认证的用户并具有项目 Push 权限的都可利用 Notebook Diff 漏洞链,以 git 用户身份执行任意命令。官方建议尽快升级至 18.10.8、18.11.5 或 19.0.2,目前暂无有效缓解措施。
安全研究团队 depthfirst 于 7 月 24 日公开了 GitLab 一项漏洞的可用利用代码(PoC)。 该漏洞已经在 6 月 10 日被 GitLab 修复,但对于尚未升级的自托管 GitLab 18.11.3 服务器,攻击者依旧可利用该漏洞以 git 系统用户身份执行任意命令。
任何具有项目推送权限的已认证用户都可以利用该漏洞。攻击过程无需管理员权限、无需 CI/CD 或 Runner 访问权限、无需用户交互,也无需访问其他用户的项目。攻击者只需提交一个精心设计的 Jupyter Notebook(.ipynb)文件,并打开该提交的差异页面,便可泄露堆内存指针。通过收集足够多的内存地址,自动化程序即可定位内存中的关键库地址,随后再提交两个特制的 Notebook 文件,就可完成远程代码执行。
值得注意的是,GitLab 并未将此次修复标记为安全更新。根据 The Hacker News 的调查,GitLab 在 6 月 10 日的发布说明中将 Oj 3.17.3 的升级仅仅列为普通缺陷修复,而非安全修复,也没有分配 CVE 编号或 CVSS 评分,更未提及 Notebook 差异功能相关的漏洞利用链。因此,如果管理员仅依据安全修复的列表来评估升级优先级的话,很可能他们不会意识到此次更新具有安全重要性。
该漏洞链依赖于 Oj 中的两个内存破坏漏洞。Oj 是一个主要采用原生 C 实现的 Ruby JSON 解析器。depthfirst 表示,其自动化系统首先发现了这两个漏洞,随后研究人员将它们组合成完整的攻击链。
GitLab 内置的 Notebook 差异比较组件 “ipynbdiff“ 会将仓库中的 .ipynb 文件交给 Oj::Parser.usual.parse 处理,并在长期运行的 Puma 工作进程中完成解析。因此,攻击者可控的 JSON 数据能够直接进入 Oj ,并使用 C 手动管理的内存区域。
其中一个漏洞会导致解析器越界写入固定大小的嵌套栈,并最终控制解析器的回调函数;另一个漏洞则会错误截断超长的 JSON 对象键,从而泄露有效的堆内存地址,而 GitLab 会将该地址直接传送到差异页面中。借助泄露的地址,攻击者可以定位 libc,再利用越界写漏洞的方式将回调函数指向 system(),最终实现远程代码执行。
该漏洞影响 GitLab CE 与 GitLab EE 的所有版本,包括 Free 至 Ultimate,但 Ruby 本身并不存在漏洞。受影响的是 Oj,而 Oj 3.17.2 并未包含修复这两个漏洞的补丁。
官方建议升级至 18.10.8、18.11.5 或 19.0.2。对于无法升级的用户,目前 GitLab 与 depthfirst 均未提供可靠的缓解措施。研究人员 Yuhang Wu 表示,目前没有已知配置能够彻底禁止使用存在漏洞的 Notebook 差异功能,仅建议尽量避免陌生用户触发 Notebook 差异渲染,并向 GitLab 官方咨询适用于自身部署环境的方案。
对于采用 Helm 或 Operator 部署的用户,应检查 Webservice 镜像中运行 Puma 的 GitLab 实际版本,而不是 Helm 或 Operator 的版本。此外,15.2 至 18.9 分支已超出 GitLab 官方安全维护范围,不会获得补丁回移,只能升级到受支持的版本。
攻击成功后,命令将以 git 系统账户身份运行。攻击者可能获取源代码、Rails 密钥、服务凭据、CI/CD 数据,以及应用程序可访问的内部服务等敏感资源,其影响程度取决于部署环境的隔离程度。
目前公开的 PoC 针对 GitLab 18.11.3 的 x86-64 环境编写,其中利用所需的代码片段偏移、寄存器状态及 jemalloc 堆布局均基于该版本。不过,研究人员表示,该漏洞链并不限于 18.11.3,在相同处理器架构下,通常只需要调整少量代码片段或符号偏移即可适配其他 GitLab 版本,因为大多数代码片段来自 Ruby 或系统库,而非 GitLab 自身代码。真正的迁移难点是在于不同处理器架构,例如 ARM64,其调用约定、寄存器和堆布局均有所不同。
depthfirst 测试显示,在一个全新的双工作进程环境中,完成内存搜索约需 5 到 10 分钟;对于运行时间较长的服务器,则可能需要 1 到 2 个小时。
根据漏洞披露时间线,depthfirst 于 5 月 21 日向 Oj 维护者报告漏洞,修复于 5 月 27 日合并,Oj 3.17.3 于 6 月 4 日发布。完整攻击链于 6 月 5 日提交给 GitLab,6 月 8 日获得确认,并于 6 月 10 日完成修复。
研究人员表示,他们没有为这些漏洞申请 CVE 编号,GitLab 的 HackerOne 项目也还未将该攻击链单独分配编号,因此没有 CVE 并不意味着漏洞危害较低,而只是披露流程所致。
截至目前,depthfirst 尚未发现该漏洞已在真实环境中遭到利用。GitLab 已独立复现了远程代码执行过程,但尚无证据表明该漏洞已被用于实际攻击。研究人员强调,这一判断仅基于目前没有收到相关报告,也没有在自身研究环境之外发现攻击的迹象,所以并不是基于任何官方遥测数据。
简要总结:研究人员公开了 GitLab 远程代码执行漏洞的 PoC。未升级的自托管 GitLab 中,任何具有项目推送权限的已认证用户都可利用 Notebook 差异功能相关漏洞链,以 git 用户身份执行任意命令。官方建议尽快升级至 18.10.8、18.11.5 或 19.0.2,目前暂无可靠的缓解措施。



评论0次