近日,安全研究团队披露了一组针对 GitLab 的高危远程代码执行(RCE)漏洞链。攻击者通过组合利用 Ruby JSON 解析组件 Oj(Optimized JSON Parser) 中存在的两个内存安全漏洞,最终可在 GitLab Puma 服务进程中实现远程命令执行。
该漏洞影响 GitLab CE 和 EE 多个版本。攻击者无需管理员权限,也无需用户交互,只需要拥有普通项目成员权限,并能够提交代码、查看提交差异(Diff),即可触发漏洞利用。
安全研究人员表示,该漏洞链利用了 GitLab 内置的 Notebook Diff 渲染功能,将用户可控的 Jupyter Notebook 文件解析过程作为攻击入口,通过底层 C 语言实现的 Oj 解析器缺陷突破内存安全限制,最终实现代码执行。
此次漏洞攻击链主要围绕 GitLab 的 ipynbdiff 组件展开。
GitLab 为了方便开发者查看 Jupyter Notebook 文件变化,会在提交记录中自动解析 .ipynb 文件,并生成可读的差异展示。
正常情况下,流程如下:
用户提交 Notebook 文件
↓
GitLab Commit Diff解析
↓
ipynbdiff组件处理
↓
Oj JSON解析器解析数据
↓
生成页面展示
攻击者利用异常构造的 Notebook 文件,使 Oj 解析器进入异常状态,并进一步触发内存破坏。
攻击链主要包含两个关键漏洞:
第一个漏洞存在于 Oj 对 JSON 嵌套结构处理过程中。
Oj 内部使用固定大小的数据结构记录 JSON 层级,当攻击者提交超过限制深度的嵌套数组时:
[
[
[
[
...
]
]
]
]
解析器会持续写入超出范围的数据区域,导致内部结构指针异常。
攻击者通过控制嵌套深度,使解析器内部关键数据发生偏移,为后续利用创造条件。
第二个漏洞来源于 Oj 对超长 JSON Key 的处理逻辑。
攻击者构造超长对象名称:
{
"AAAA...(65565 bytes)":value
}
由于长度类型转换错误,实际长度被截断,导致解析器返回的数据中包含部分堆内存地址信息。
攻击者利用该信息绕过 ASLR(地址随机化保护),获取内存布局,为进一步执行代码提供基础。
攻击者利用两个漏洞组合形成完整攻击链:
恶意Notebook文件
↓
提交至GitLab项目
↓
触发Commit Diff查看
↓
GitLab调用Oj解析
↓
内存破坏
↓
泄露地址信息
↓
绕过ASLR保护
↓
控制Puma Worker进程
↓
执行系统命令
成功利用后,攻击者可以获得 GitLab 运行账户权限。
由于 GitLab Puma Worker 通常以 git 用户运行,因此攻击者可能进一步访问:
进一步造成:

受影响版本包括:
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
官方建议升级至:
15.2之前版本由于使用不同解析组件,因此不受该攻击路径影响。
建议管理员优先升级至官方修复版本。
升级前:
降低普通账号攻击面:
建议:
重点关注:
随着企业研发平台、代码仓库和DevOps体系不断集中化,GitLab等开发协作平台已经成为攻击者重点关注目标。
传统安全防护更多关注网络边界,但现代攻击正在向“应用组件漏洞 + 身份权限滥用 + 内部横向移动”方向发展。
贵州数掘科技基于网络安全防护、云计算基础设施和智能安全分析能力,持续关注开源组件漏洞、供应链攻击以及企业数字资产风险,通过安全监测、漏洞响应、攻击溯源和云安全防护体系,帮助企业提升数字基础设施安全保障能力。
面对高危漏洞,快速发现、及时修复、持续监测,是降低安全风险的关键。