来自depthfirst的安全研究员Wu Yuhang发布了一个有效的PoC(概念验证)利用程序,可在未修补的GitLab 18.11.3自托管服务器上以git用户身份执行命令。
普通认证用户只需提交两个特制的Jupyter notebook并请求其差异(diff)即可触发该漏洞。该攻击链无需管理员权限、CI/CD Runner访问、受害者交互,也无需访问其他用户的项目。
该公开利用程序针对x86-64架构的GitLab 18.11.3构建;底层Oj漏洞影响更广泛的版本。受影响的版本范围包括GitLab Community Edition (CE)和Enterprise Edition (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代码。已发布的gem版本3.13.0至3.17.1存在漏洞;3.17.3是首个同时修复这两个问题的发布版本。漏洞影响Free、Premium和Ultimate版本。Ruby本身不受影响。
成功利用后,攻击者可以git用户身份执行命令。其实际影响范围取决于部署隔离程度,但可能包括源代码、Rails密钥、服务凭据、CI/CD数据以及应用程序可访问的内部服务。GitLab.com已于6月10日完成修补。
专用客户无需采取任何操作。自托管用户应迁移至包含修复程序的支持版本。Helm和Operator用户需要检查Webservice镜像内的GitLab版本,而不仅仅是Chart或Operator版本。depthfirst表示,截至7月24日,未发现野外利用事件。
无论是depthfirst的披露还是GitLab 6月10日的发布说明,均未列出这两个链式漏洞的CVE标识符或CVSS评分。两者均未提供临时解决方案;均指示自托管用户升级。
The Hacker News已就CVE状态、分类及利用证据向GitLab提问,同时询问depthfirst关于利用程序可移植性以及是否存在受支持的临时缓解措施。目前尚未收到回复。depthfirst在同一审查中列出了另外9个针对其他Oj漏洞的CVE。
Part01
利用Oj解析器的两个漏洞
GitLab的notebook渲染器将存储库控制的.ipynb JSON传递给长期运行的Puma worker中的Oj::Parser.usual.parse。这使得攻击者控制的notebook数据进入GitLab应用程序进程内Oj的原生解析器状态。
depthfirst的技术分析展示了两个漏洞的利用方式:一个漏洞控制回调指针,另一个泄露堆地址,从而缩小ASLR(地址空间布局随机化)搜索范围。
Oj将嵌套状态存储在一个固定的1024字节栈中,但从未检查深度是否超出限制。因此深度嵌套的数组可以向相邻解析器状态写入0x01字节。该利用程序破坏buf.head,导致Oj向realloc()传递伪造的内部指针。后续的Ruby数组分配会回收同一3584字节的jemalloc区域,并覆盖p->start。
Oj分配一个65565字节的对象键,将其长度截断为有符号16位字段中的29,并返回包含活动键分配指针的29字节。GitLab将该指针带入渲染的notebook diff中,为利用程序提供缩小ASLR搜索所需的地址泄露。在分析的包含两个worker的GitLab 18.11.3安装中,搜索通常需要5到10分钟。研究人员预计,在最广泛的成熟worker范围内,需要1到2小时。
Part02
漏洞披露与修复时间线
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升级列在错误修复下,而非安全修复表中,并且未描述notebook diff RCE攻击链。
参考来源:
Researcher Publishes GitLab RCE PoC Letting Authenticated Users Run Commands as Git
https://thehackernews.com/2026/07/researcher-publishes-gitlab-rce-poc.html