2026 年 10 月 8 日,GitLab 发布紧急补丁版本 19.4.2、19.3.4 与 19.2.8,修复编号 CVE-2026-97229 的远程代码执行漏洞。该缺陷位于 CI/CD 正则表达式编译器,攻击者无需登录与用户交互,仅凭一个特制正则模式即可在自建 GitLab 服务器上执行任意代码,CVSS 满分 10.0。这距离 9 月 23 日修复的 CVE-2026-93577 仅过去两周,属于典型的补丁不完整后续加固。
事件概述
GitLab 本次发布的是非例行紧急补丁,一次修复 24 个漏洞:1 个严重、5 个高危、14 个中危、4 个低危。除 CVE-2026-97229 外,同批还包含:
- CVE-2026-92883(CVSS 8.7):语法高亮输出的 HTML 属性未净化,造成存储型 XSS;
- CVE-2026-16301(CVSS 8.5):下游流水线创建服务授权校验不当,Developer 角色可越权在受保护分支跑流水线;
- CVE-2026-14814(CVSS 8.2):仓库 raw 文件引用校验不严,可污染缓存,诱使他人流水线执行攻击者内容并暴露受保护变量。
该漏洞影响所有 19.1 及以后版本。
技术细节
根因是 GitLab 内置 Ruby(3.3 与 3.4)所用 Onigmo 正则引擎的整数溢出。官方公告没有点名具体组件,但同一版本为 Omnibus 包中的 Ruby 打了两处补丁:一处修复 regexp program size,一处修复重复范围(repeat ranges)的 double free。
其一是程序膨胀:类似 (?:.{90000,}){90000} 的嵌套有界重复,会让编译器判断重复能否内联展开的乘法运算溢出。超大的重复因此通过了这道检查,编译器随后展开出一个巨型程序并把进程挂死。其二是更严重的一条路径:.{100000,} 这类模式大约十个字节的源码会变成约 10 万条编译指令;几百 KB 这样的重复拼接起来,就能把编译后的程序推过 32 位有符号整数上限,跳转偏移写入时发生回绕。修复方式改为在指令生成阶段实时校验程序大小,而不再信任会一并溢出的长度计算。
GitLab 未解释无账号攻击者如何让流水线配置被处理,也未公开 PoC。漏洞由研究者 joaxcar 经 HackerOne 报告。
影响评估
CVSS 3.1 评分为 10.0,向量表现为网络可达、低攻击复杂度、无需权限、无需交互,且 scope changed(S:C),说明影响会跨越受漏洞影响的组件本身。GitLab 官方表示未观测到在野利用。GitLab.com 已运行修复代码,Dedicated 无需操作,受影响的是自建(self-managed)社区版与企业版实例。
修复建议
官方未提供任何绕过方案,升级是唯一有效手段。受影响实例应尽快升到 19.4.2、19.3.4 或 19.2.8:
# 查看当前版本
sudo gitlab-rake gitlab:env:info
# 升级到修复版本(按发行版二选一)
sudo apt-get install gitlab-ee=19.4.2-ee.0 # Debian / Ubuntu
sudo yum install gitlab-ee-19.4.2-ee.0 # RHEL / CentOS
# 重跑配置
sudo gitlab-ctl reconfigure
本次更新含数据库迁移,单节点实例在迁移期间会停机;多节点部署可按官方零停机流程执行。过渡期内可收紧谁有权修改 .gitlab-ci.yml、为流水线开启人工审批,并对 runner 主机启用 EDR 与异常进程告警。