研究员发布 GitLab RCE PoC,允许已认证用户以 git 身份执行命令

研究员发布 GitLab RCE PoC,允许已认证用户以 git 身份执行命令

导语:安全研究员 Yuhang Wu(depthfirst)公开了一个针对自托管 GitLab 18.11.3 的 RCE PoC,普通已认证用户通过提交两个恶意 Jupyter notebook 并请求 diff 即可在 git 权限下执行命令,无需管理员权限或 CI runner 访问。受影响版本包括 GitLab CE/EE 15.2.0 至 19.0.1 中的多个区间,官方已发布 18.10.8、18.11.5 和 19.0.2 修复版本,并随附 Oj 3.17.3 JSON 解析器的修复。该攻击链涉及 Oj 库中的回调指针控制与堆地址泄露两大缺陷,攻击者可借此绕过 ASLR 并实现远程代码执行。

安全研究员 Yuhang Wu(来自 depthfirst)发布了一个可用的概念验证(PoC)漏洞利用代码,可在一个尚未打补丁的自托管 GitLab 18.11.3 服务器上以 git 身份执行命令。

一个普通已认证用户只需提交两个经过精心构造的 Jupyter notebook 文件,并请求查看它们的差异(diff),即可触发该漏洞。该攻击链不需要管理员权限、不需要持续集成(CI)runner 访问权限、不需要受害者交互,也不需要访问其他用户的项目。

该公开漏洞利用代码针对 x86-64 架构上的 GitLab 18.11.3 是特定构建的;而其底层 Oj 库的缺陷则影响更广泛的版本范围。受影响版本包括 GitLab 社区版(CE)和企业版(EE)的 15.2.0 至 18.10.7、18.11.0 至 18.11.4,以及 19.0.0 至 19.0.1。

首个修复版本分别为 18.10.8、18.11.5 和 19.0.2。Oj 是一个高性能的 Ruby JSON 解析器,包含大量原生 C 代码。已发布的 3.13.0 至 3.17.1 版本均存在漏洞;3.17.3 是首个同时包含两项修复的发布版本。该缺陷影响 Free、Premium 和 Ultimate 版本。Ruby 本身不受影响。

成功利用后将以 git 身份执行命令。其实际影响范围取决于部署隔离程度,但可能包括源代码、Rails 密钥、服务凭证、CI/CD 数据以及从应用可达的内部服务。GitLab.com 已于 6 月 10 日完成修复。

Dedicated 客户无需采取任何操作。自托管运维方应升级到包含修复的支持版本。Helm 和 Operator 用户需要检查 Webservice 镜像内的 GitLab 版本,而不仅仅是 chart 或 Operator 版本。据 depthfirst 表示,截至 7 月 24 日,他们尚未发现该漏洞在野被利用的情况。

无论是 depthfirst 的披露报告还是 GitLab 在 6 月 10 日的发布说明,均未列出这两条漏洞链中缺陷的 CVE 编号或 CVSS 评分。双方也未提供临时缓解措施;均建议自托管运维方直接升级。The Hacker News 已就 CVE 状态、漏洞分级和利用证据等问题询问 GitLab,同时也向 depthfirst 询问了漏洞利用的可移植性以及是否存在受支持的临时缓解措施,相关回复仍在等待中。depthfirst 在同一次审查中列出了其他九个 Oj 漏洞的 CVE 编号。

GitLab 的 notebook 渲染器将仓库可控的 .ipynb JSON 数据传递给 Oj::Parser.usual.parse,该操作发生在一个长期存活的 Puma worker 进程内。这使得攻击者控制的 notebook 数据被送入 GitLab 应用进程中 Oj 原生解析器的内部状态。

原文配图

depthfirst 的技术分析展示了其中一个漏洞如何控制回调指针,而另一个漏洞如何泄露一个堆地址,从而缩小地址空间布局随机化(ASLR)的搜索范围。

Oj 将嵌套状态存储在一个固定的 1,024 字节栈中,但从不检查深度是否超出该限制。因此,深度嵌套的数组可以向相邻的解析器状态写入 0x01 字节。该漏洞利用会破坏 buf.head,导致 Oj 将一个伪造的内部指针传递给 realloc()。后续一个 Ruby 数组分配会回收同一块 3,584 字节的 jemalloc 内存区域,并覆盖 p->start。

Oj 分配一个 65,565 字节的对象键,在有符号 16 位字段中将其长度截断为 29,并返回包含实时键分配指针的 29 字节数据。GitLab 将该指针带入渲染的 notebook diff 中,为漏洞利用提供了缩小 ASLR 搜索所需的地址泄露。在已分析的 GitLab 18.11.3 双 worker 部署环境中,搜索过程通常需要五到十分钟。研究人员估算,在最广泛的成熟 worker 范围内,搜索时间为一到两小时。

在同一次 diffs_stream 请求中按字典序排列的两个 notebook 文件,可使两个阶段保持在同一个 Puma worker 内,从而复用进程级的 Oj 解析器。第一个文件破坏回调并抛出一个错误,GitLab 在继续 diff 之前捕获该错误。随后的解析调用被覆盖的指针,并通过特定构建的小工具序列到达 system() 调用。

公开演示将该攻击链封装在一个本地 GitLab 18.11.3 x86-64 实验环境中,并使 Puma worker 以 git 身份反向连接。

depthfirst 于 5 月 21 日上报了 Oj 漏洞,维护者于 5 月 27 日合并了修复。Oj 3.17.3 于 6 月 4 日发布。研究人员于 6 月 5 日上报了 GitLab 攻击链;depthfirst 表示 GitLab 于 6 月 8 日确认了该漏洞。

据 depthfirst 称,GitLab 于 6 月 10 日发布了修复版本,并于 7 月 17 日结案该报告。The Hacker News 的审查发现,GitLab 将 Oj 3.17.3 版本升级归类在 bug 修复项下,而非列在安全修复表中,且未描述 notebook diff RCE 攻击链的细节。


来源信息

来源:The Hacker News

原文链接:https://thehackernews.com/2026/07/researcher-publishes-gitlab-rce-poc.html

作者:info@thehackernews.com (The Hacker News)