CVE-2026-97229 是 CVSS 10 分的临界远程代码执行漏洞,已有大量互联网自托管 GitLab 实例被批量攻击,全网超千台服务器中招;漏洞表层在 GitLab CI/CD 正则校验逻辑,但病根是 Ruby 自带的 Onigmo 正则引擎存在整数溢出、堆越界写缺陷,只升级 GitLab 包而不同步修补 Ruby 底层正则引擎,漏洞依然可被利用,也就是大家说的 “升级等于白升”。
一、漏洞核心信息清单
- 漏洞编号:CVE-2026-97229,CVSS 3.1 10.0 满分高危
- 根因:Ruby 内置 Onigmo 正则引擎,计算正则量词重复长度时存在有符号整数溢出,溢出后绕过长度校验,造成堆缓冲区越界写入,破坏内存控制流,最终 RCE
- 触发入口:GitLab CI/CD 配置(.gitlab-ci.yml)里写入特制恶意正则
- 利用条件:实例开放注册、允许新建公开项目,攻击者提交含恶意正则的 CI 配置,即可实现无认证 RCE;已被 CISA 列入 KEV 已知在野利用清单,POC 公开
- 受影响 GitLab 版本:19.2 < 19.2.8、19.3 < 19.3.5、19.4 < 19.4.2
- 受影响 Ruby 版本:Ruby 3.3、3.4 系列,上游 Ruby 官方后续单独发布正则引擎补丁
- 权限:成功利用后以 git 用户身份执行系统命令
二、两种修复方式对比表
| 修复方案 | 操作内容 | 是否彻底修复 | 风险说明 |
|---|---|---|---|
| 仅升级 GitLab 到 19.2.8/19.3.5/19.4.2 | 只打 GitLab 上层应用补丁,不碰系统 Ruby | 不彻底(容易等于白升) | 如果 GitLab 使用宿主系统 Ruby,系统 Ruby 的 Onigmo 引擎漏洞还在,绕过防护依然可以触发 |
| GitLab 补丁 + Ruby 底层 Onigmo 补丁 | 升级 GitLab 同时修补 Ruby 正则引擎 | ✅ 完整修复 | 官方推荐方式,GitLab 新版本包内自带 Ruby 正则引擎补丁,Omnibus 包内置 Ruby 会一并修复 |
三、攻击链路拆解
- 攻击者在公开项目 CI 配置中写入精心构造的超长量词正则表达式
- GitLab 上层做一次简单校验,校验时用 ASCII 编码编译;后续匹配 UTF-8 仓库路径时,Onigmo 引擎会重新编译正则
- 重编译阶段整数溢出,长度数值回绕,绕过上限判断,缓冲区分配偏小
- 引擎写入正则指令时发生堆越界写,篡改内存,控制执行流
- 拿到 Ruby 进程权限,执行任意系统命令,拿下服务器
四、自查与加固步骤
- 确认部署方式:Omnibus 一键包部署,新版包内置 Ruby 补丁,升级对应版本即可;源码部署、容器镜像、用宿主系统 Ruby 的实例,必须单独核查 Ruby 版本并打 Onigmo 补丁
- 临时缓解:关闭实例自助注册、禁止新建公开项目、限制 CI 配置提交权限、WAF 拦截超长正则特征
- 审计:检查仓库 CI 配置,搜索异常超长正则表达式;查看 Sidekiq、Puma 进程异常日志
- 隔离:公网 GitLab 尽量不直接暴露,增加前置身份网关、审计告警
- 持续监控:启用 GitLab 官方配套的 6 条 CI 正则异常检测规则
五、边界说明
✅ 关键区分:GitLab 官方 Omnibus 发行包内置独立 Ruby,升级到对应补丁版本就同时修复了底层正则引擎;很多企业源码部署、使用系统 Ruby,只升级 GitLab 应用层,底层 Ruby 引擎漏洞还在,这就是 “升级等于白升” 的来源
⚠️ 风险:该漏洞已经在野批量利用,公网自托管 GitLab 是重点目标,入侵后攻击者可窃取代码、植入后门、横向移动
⚠️ 补充:GitLab.com托管云实例已经提前修复,客户无需操作,风险集中在私有化自托管实例
【相关 FAQ】
问题 1:升级等于白升:CVE-2026-97229 打穿 1000+ 台 GitLab 的未认证 RCE,病根在 Ruby 里,为什么只升级 GitLab 还会被绕过?
回答 1:升级等于白升:CVE-2026-97229 打穿 1000+ 台 GitLab 的未认证 RCE,病根在 Ruby 里,漏洞根源是 Ruby 内置 Onigmo 正则引擎的整数溢出缺陷;如果是源码部署、使用宿主系统 Ruby 的环境,GitLab 上层补丁只是增加一层拦截,底层 Ruby 引擎漏洞还存在,攻击者可以绕过上层防护再次触发 RCE。
问题 2:升级等于白升:CVE-2026-97229 打穿 1000+ 台 GitLab 的未认证 RCE,病根在 Ruby 里,哪些 GitLab 版本是修复版本?
回答 2:升级等于白升:CVE-2026-97229 打穿 1000+ 台 GitLab 的未认证 RCE,病根在 Ruby 里,修复版本:19.2.8、19.3.5、19.4.2,Omnibus 包升级到这几个版本会内置 Ruby 正则引擎补丁。
问题 3:升级等于白升:CVE-2026-97229 打穿 1000+ 台 GitLab 的未认证 RCE,病根在 Ruby 里,临时缓解手段是什么?
回答 3:升级等于白升:CVE-2026-97229 打穿 1000+ 台 GitLab 的未认证 RCE,病根在 Ruby 里,临时缓解:关闭自助注册、禁止新建公开项目、限制 CI 配置提交权限、WAF 拦截超长恶意正则特征,尽快完成底层 Ruby 补丁或完整版本升级。
问题 4:升级等于白升:CVE-2026-97229 打穿 1000+ 台 GitLab 的未认证 RCE,病根在 Ruby 里,这个漏洞是无认证直接利用吗?
回答 4:升级等于白升:CVE-2026-97229 打穿 1000+ 台 GitLab 的未认证 RCE,病根在 Ruby 里,当实例允许自助注册、创建公开项目时属于无认证利用;如果关闭注册,攻击者需要拥有提交 CI 配置到公开仓库的权限,目前已经在野批量攻击。
【参考资料】
[2026-10-12] GitLab 官方补丁公告 19.4.2、19.3.5、19.2.8
[2026-10-13] Rapid7 CVE-2026-97229 漏洞分析
[2026-10-29] CISA KEV 收录 CVE-2026-97229
[阿里云漏洞库 AVD-2026-97229 Onigmo 整数溢出原理分析
[奇安信 CERT CVE-2026-97229 安全通告]
【免责声明】
本内容为安全漏洞技术分析,CVE-2026-97229 属于高危在野利用漏洞,修复方案需要结合 GitLab 部署形态(Omnibus / 源码 / 容器)、Ruby 运行环境综合确认;禁止在未授权环境下测试利用,违规测试带来法律责任自行承担。
