gitlab-onigmo-scanner针对两个 CVSS 10.0 级别的 GitLab 正则漏洞 CVE-2026-97229 和 CVE-2026-110264 的版本研判工具。输入你自有的 GitLab 版本,它会告诉你该构建是否仍存在风险,并能识别出两个已经让不少人中招的陷阱。它从不访问网络,从不发送 payload,从不请求 CI lint 端点,也从不编译构造的正则。
漏洞详情详情 | 值 |
|---|---|
CVE | CVE-2026-97229,以及与之并列评级的 CVE-2026-110264 |
缺陷 | 当 GitLab 编译用户提供的正则表达式时,内置于 Ruby 的正则引擎 Onigmo 中存在 整数溢出(CWE-190) |
影响 | 在特定条件下,可在自管理 GitLab 服务器上实现 未认证远程代码执行 |
严重性 | 两者均为 10.0 严重级别,由 GitLab 作为 CNA 评分 |
利用情况 | CVE-2026-97229 于 2026-10-29 被加入 CISA KEV,联邦机构截止日期为 2026-11-01。截至本文撰写时,CVE-2026-110264 尚无 KEV 收录记录,且 GitLab 报告未发现其被用于攻击的迹象 |
CVE-2026-97229 是 CI/CD 正则漏洞:在 CI/CD 配置中使用特制的正则表达式,正则校验不足,已于 2026-10-12 修复。CVE-2026-110264 是第二个、影响范围更广的正则漏洞,于 2026-10-21 修复,波及可追溯至 7.0 的所有自管理版本。相同的引擎,相同的评分,不同的缺陷,这正是仅做一项检查不够的原因。
修复版本CVE-2026-97229(修复于 2026-10-12)版本线 | 修复版本 |
|---|---|
GitLab 19.2 | 19.2.8 |
GitLab 19.3 | 19.3.5 |
GitLab 19.4 | 19.4.2 |
GitLab 19.5、早于 19.2 的版本 | 未列为受此 CVE 影响 |
CVE-2026-110264(修复于 2026-10-21)版本线 | 修复版本 |
|---|---|
GitLab 19.5 | 19.5.1 |
GitLab 19.4 | 19.4.3 |
GitLab 19.3 | 19.3.6 |
GitLab 19.2 | 19.2.9 |
GitLab 19.1 | 19.1.9 |
GitLab 19.0 | 19.0.10 |
GitLab 18.11 | 18.11.13 |
GitLab 18.10 及更早版本 | 无修复版本,请升级至 18.11.13 或更高版本 |
Ruby,适用于源码安装和自定义镜像安装版本线 | 修复版本 |
|---|---|
Ruby 3.3 | 3.3.13 |
Ruby 3.4 | 3.4.12 |
Ruby 4.0 | 4.0.9 |
Ruby 3.2 及更早版本 | 无修复,已停止维护,请迁移至 3.4 或 4.0 |
陷阱 1:10 月 12 日的补丁并不覆盖 10 月 21 日的漏洞19.4.2、19.3.5 和 19.2.8 修复了 CVE-2026-97229。但它们每一个都低于各自分支上 CVE-2026-110264 的修复版本(19.4.3、19.3.6、19.2.9)。如果你在 10 月 12 日打了补丁就停手了,你仍然存在风险,而一个只认识第一个 CVE 的扫描器会判定你是安全的。本工具会对两者都进行研判,并在发现该陷阱时于输出中明确指出。
陷阱 2:升级 GitLab 并不能修复你自己的 RubyGitLab 的修复是对其官方软件包和镜像中所捆绑 Ruby 的补丁。源码安装,或单独安装 Ruby 的自定义镜像,无法通过升级 GitLab 获得该补丁。Alpine Linux 就亲身经历了这一点:它于 2026-10-22 升级到 GitLab 19.3.6,却仍然存在风险,因为其镜像使用的是标准 Ruby。攻击者于 2026-10-20 和 21 日探测了其服务器,导致 worker 崩溃八次,其中四次已推进到漏洞利用的中途,并在 25 日和 26 日再次返回。Alpine 未找到漏洞利用成功的证据,也无法排除其可能性,于是从零重建了实例,更换了密钥并重置了所有密码。其在 2026-10-27 之后重新拉取的修复镜像,携带的是 Ruby 3.3.13。
因此:--install-type official 只评估 GitLab 版本,因为 Ruby 随它一起提供。--install-type source 或 custom 还会评估你通过 --ruby-version 提供的 Ruby,而缺少 Ruby 版本会被评为 UNKNOWN,而不是干净。Ruby 4.0.8 是一个值得了解的特殊情况:它修复了 CVE-2026-97229 漏洞,但没有修复 CVE-2026-110264,因此在这里被评为 VULNERABLE。Ruby 并未为这些修复请求自己的 CVE 标识符,这就是为什么将 CVE 记录与已安装软件包匹配的扫描器在任何地方都找不到有漏洞的 Ruby。此工具直接检查 Ruby 版本。
它检查什么GitLab 版本:分别检查 CVE-2026-97229 和 CVE-2026-110264,然后给出一个总体判定CSV 清单:name,gitlab_version,ruby_version,install_type,hostingsource 或 custom 时的 Ruby 陷阱GitLab.com 和 Dedicated 视为已修补,无需操作每个发现都会得到一个判定:VULNERABLE、FIXED、EOL_NO_FIX、UNKNOWN,或对于不涉及的分支上的单个 CVE 为 NOT_AFFECTED。EOL_NO_FIX 计为有漏洞:该产品线不会有补丁。
它从不做什么不发起网络请求。不探测远程服务器。不构造正则表达式,不发送 CI lint 请求,不产生漏洞利用流量,不包含 PoC 代码。它只读取你提供的版本字符串,然后停止。这是有意为之:CVE-2026-97229 的公开 PoC 已经存在,在这里复现一个不会增加任何防御价值。
既然已有 PoC 和版本计数器,为什么还要这个CVE-2026-97229 的公开材料大多是攻击性的:以 git 用户身份运行代码的 PoC,以及映射哪些构建可被武器化的实验环境。Censys 按版本统计暴露的主机。GitLab 发布了用于在日志中发现利用尝试的 Sigma 规则。这些都不是独立的防御性分诊工具,无法同时评估两个十月 CVSS 10.0 漏洞,并检查 source 或 custom 安装下的 Ruby。这个仓库填补的正是这一空白:一条命令,两个 CVE,两个陷阱,无载荷。请将其与 GitLab 的 Sigma 规则配合使用,而不是替代它们。如果某个实例被探测过,版本分诊不等于入侵分诊:检查 worker 崩溃日志和 Onigmo 崩溃报告,如果你无法排除尝试,请遵循 Alpine 的示例。
评级发现 | 严重性 |
|---|---|
GitLab 低于其分支对任一 CVE 的修复版本 | VULNERABLE |
GitLab 为 18.10 或更旧,或 source/custom 安装上的 Ruby 3.2 或更旧 | EOL_NO_FIX,计为有漏洞 |
GitLab 达到或超过两个修复版本,且适用时 Ruby 已修复 | FIXED |
Source/custom 安装没有 Ruby 版本,或分支比此工具的数据(2026-10-30)更新 | UNKNOWN,不是干净 |
GitLab.com / Dedicated | FIXED,由 GitLab 修补 |
用法# One instance, official package or image
python3 gitlab_onigmo_scanner.py --version 19.4.2
# One instance, source install with its own Ruby
python3 gitlab_onigmo_scanner.py --version 19.4.3 --ruby-version 3.4.11 --install-type source
# A whole estate, machine-readable output
python3 gitlab_onigmo_scanner.py --list inventory.csv --json
# Tests (version tables only, no network)
python3 -m unittest discover -s tests -v
inventory.csv 格式,表头行可选:
name,gitlab_version,ruby_version,install_type,hosting
prod,19.4.1,,official,self-managed
staging,19.4.3,,official,self-managed
legacy-source,19.4.3,3.4.11,source,self-managed
退出码:0 = 未发现漏洞,2 = 存在漏洞或已停止维护的发现,1 = 扫描错误。UNKNOWN 不会改变退出码,但它并不代表干净。在关闭这些项目之前,请通过其他方式确认。
来源分歧,以及本工具遵循的立场19.3.4:GitLab 的公告将 19.3 列在 19.3.5 之前作为受影响版本,因此 19.3.4 在此被评为 VULNERABLE。一个漏洞利用实验室报告称其无法将 19.3.4 武器化,因为其捆绑的 libruby 从未进入易受攻击的路径。本工具保守地遵循公告:厂商声称受影响的构建,不会因某个实验室的阴性结果而被排除。CVE-2026-97229 的前提条件:GitLab 将其评为 PR:N,即无需认证。Rapid7 复现的路径需要先将攻击者控制的内容推送到公共项目,只有最后的 CI lint 请求是无需认证的。本工具不裁决这一争论,因为版本分诊并不依赖它:范围内的版本无论如何都会被标记,范围外的版本两条路径都不会标记。CVE-2026-110264 的利用情况:GitLab 报告没有在攻击中被利用的迹象,且它不在 CISA KEV 中。本工具不作相反声明。本 README 中的 KEV 收录、截止日期和攻击故事仅属于 CVE-2026-97229。CVSS 10.0 漏洞。它不单独评级九月的正则 CVE(CVE-2026-89078、CVE-2026-93577,均为 9.9,需认证)。任何未通过十月检查的版本已经是严重级别,且每个十月的修复版本都高于其分支的九月修复版本,但这不是完整的 GitLab 审计。不要将这里的 FIXED 评级作为抵御所有其他 GitLab 漏洞的证明。诚实的注意事项GitLab 尚未公布这两个漏洞的完整前提条件。GitLab 版本(19.4.3-ee.0)按其数字部分解析。Dedicated 使用的内部构建(-internal0)由 --hosting dedicated 标志处理,而非后缀解析。UNKNOWN。在将未来版本称为干净之前,请重新检查 GitLab 的公告。参考资料GitLab 关键补丁版本 19.4.2 / 19.3.5 / 19.2.8(CVE-2026-97229,CVSS 10.0,2026-10-12)GitLab 关键补丁版本 19.5.1(CVE-2026-110264,CVSS 10.0,2026-10-21,向后移植至 18.11.13)CVE-2026-97229 的 CISA KEV 条目(添加于 2026-10-29,截止 2026-11-01)Alpine Linux 事件披露(2026-10-28):攻击发生于 2026-10-20 至 26,重建并重置密码,自定义镜像的 Ruby 3.3.13 修复Ruby 正则修复公告(2026-10-23):Ruby 4.0.9、3.4.12、3.3.13,以及 CVE-2026-110264 的 4.0.8 缺口Rapid7 对 CVE-2026-97229 的技术分析(路径前提条件、内联注释量词绕过)GitLab 自管理服务器的检测规则(Sigma 格式、Onigmo worker 崩溃和 CI lint 模式)致谢joaxcar 通过 GitLab 的 HackerOne 项目报告了这两个漏洞GitLab 安全团队提供的公告、向后移植和检测规则Ruby 团队提供的 Onigmo 修复和异常清晰的公告表Alpine Linux 发布了使 Ruby 陷阱具体化的事件Rapid7、Censys 以及所有发布 GitLab 检测研究的人免责声明仅为防御性分诊和授权测试而构建。仅扫描你拥有或获授权测试的系统。作者不对滥用负责。
研究由
Vineeth Kumar(foxcornlab)完成。发现 bug 或想要新功能,请提交issue。