我们的 AI 引擎 Neutron 在加州大学伯克利分校的 CyberGym 基准测试中取得了 97.1% 的成绩。 了解更多

深度解析

深度解析

横跨 12 年版本的 GitLab 未授权 RCE(CVE-2026-110264)

评分为 10.0 的正则表达式编译器整数溢出 CVE-2026-110264,使自 7.0 起所有自行管理的 GitLab 面临未经身份验证的 RCE;2026 年 10 月 21 日已修复。

要点速览

  • CVE-2026-110264 是自行管理的 GitLab 正则表达式编译器中的整数溢出,GitLab 将其评为 CVSS v3.1 最高分 10.0。在 GitLab 尚未披露的条件下,未经身份验证的攻击者可通过提供特制正则表达式,在服务器上执行任意代码。
  • 自 7.0(2014 年)起所有自行管理的 GitLab CE/EE 版本均受影响,因为漏洞位于 Ruby 的正则表达式引擎 Onigmo 中,而 GitLab 在自身软件包中捆绑并修补它。2026 年 10 月 21 日,GitLab 同时修复了七个发布分支,回移范围超出通常政策。
  • 尚未报告利用,漏洞也未列入 CISA KEV 目录。没有公开概念验证,GitLab 也未公布临时措施:由于前提条件未披露,无法凭配置排除任何实例,更新是唯一确定的防护。
  • 立即更新至 19.5.1、19.4.3、19.3.6、19.2.9、19.1.9、19.0.10 或 18.11.13。如果您在 10 月 12 日为 CVE-2026-97229 打过补丁,现在又处于受影响范围:那些构建版本比新的修复版本低一个补丁版本。

我是否受到影响?

以下两个条件同时成立时,您就受到影响:

  • 您运行自行管理的 GitLab Community Edition 或 Enterprise Edition,无论部署类型是 omnibus 软件包、Docker、Helm chart 还是源码安装。GitLab.com 已运行修复版本;使用 19.3.5-internal0 和 19.4.2-internal0 或更高版本的 GitLab Dedicated 租户无需操作。
  • 您的版本位于受影响范围。GitLab 未说明攻击者需要哪些功能或设置,因此无法通过配置排除任何低于修复版本的实例。
分支 受影响版本 修复版本
19.5 19.5.0 19.5.1
19.4 19.4.0 至 19.4.2 19.4.3
19.3 19.3.0 至 19.3.5 19.3.6
19.2 19.2.0 至 19.2.8 19.2.9
19.1 19.1.0 至 19.1.8 19.1.9
19.0 19.0.0 至 19.0.9 19.0.10
18.11 及此前回溯至 7.0 的所有分支 7.0 至 18.11.12 18.11.13

检查每个实例的版本,包括预发布和仅用于 CI 的服务器。Web 界面中的版本位于“帮助”及管理区域概览。在主机上:

cat /opt/gitlab/embedded/service/gitlab-rails/VERSION        # omnibus package install
docker exec gitlab cat /opt/gitlab/embedded/service/gitlab-rails/VERSION   # Docker: adjust the container name
cat /home/git/gitlab/VERSION                                  # source install

运行 10 月 12 日针对 CVE-2026-97229 修复版本 19.2.8、19.3.5 或 19.4.2 的实例仍在受影响范围,必须再升高一个补丁版本。

如何修复?

升级至当前分支的修复版本,旧实例遵循 GitLab 文档中的升级路径。七个修复版本中,18.11.13、19.0.10、19.1.9 和 19.2.9 这四个是 GitLab 仅为严重问题提供的回移修复;通常政策仅覆盖最近三个按月发布的版本。

规划升级窗口。19.4.3 和 19.3.6 包含升级期间运行的数据库迁移,因此单节点服务器在迁移完成前会停机;多节点部署可使用 GitLab 零停机流程应用补丁。19.4.3 还会运行部署后迁移。

没有已发布的临时措施,任何自行设计措施的局限都应明确:GitLab 未披露前提条件,因此限制功能、注册或 CI 使用并非有文档支持的防御。通过网络层限制实例可达人员可以降低暴露,但不是 GitLab 认可的修复。升级才是防护。

同一 10 月 21 日版本还修复了另外 10 个问题,其中两个为高危:CVE-2026-15723,在同时启用 SAML 和 LDAP 自动关联时,通过 OmniAuth 到 LDAP 自动关联的电子邮件查找实现账户接管;CVE-2026-112212,OAuth 和 OpenID Connect 发现端点中的缓存投毒漏洞。一次更新即可覆盖所有问题。

根本原因是什么?

GitLab 编译用户提供的正则表达式,其所用引擎 Onigmo 以无界计数器统计两类内部标识符,因此包含足够多重复结构的模式会使标识符回绕,破坏编译后的程序。

GitLab 是 Ruby on Rails 应用,Ruby 内置正则表达式引擎是 C 库 Onigmo。GitLab 不使用系统 Ruby,而是在自身软件包中捆绑并修补 Ruby。因此,Onigmo 缺陷进入自 7.0 起的每个 GitLab 版本,GitLab 也通过修补其捆绑 Ruby 发布修复。

Ruby 自身公告精确描述了 CVE-2026-110264 背后的问题:“包含大量重复的模式中内部 ID 溢出”。修复通过 ruby/ruby 拉取请求 #16801“拒绝超大正则表达式中溢出的重复/空匹配检查 ID”合入上游,两行代码揭示了机制。当 Onigmo 编译 (?:foobar){0,100} 这样的范围重复时,会生成一对需要数字标识符的虚拟机指令:

   r = add_mem_num(reg, num_repeat); /* OP_REPEAT ID */
   reg->num_repeat++;
+  if ((MemNumType)reg->num_repeat <= 0) return ONIGERR_TOO_MANY_RANGE_REPEAT;

新增行就是此前缺失的检查。ID 存储类型是 MemNumType,Onigmo 将其定义为 short int,即最大值为 32,767 的有符号 16 位整数。修复前,reg->num_repeat 持续递增,不与该上限比较,因此计数器一旦超过 32,767,写入 ID 的值就会回绕为负数。新检查将计数器转换为 MemNumType,转换值为零或负数时立即停止编译,避免回绕 ID 进入编译后的程序。Onigmo 编译需要检查空匹配的结构时分配的空匹配检查标识符,也存在同样缺口:

     r = add_mem_num(reg, reg->num_null_check); /* NULL CHECK ID */
     if (r) return r;
     reg->num_null_check++;
+    if ((MemNumType)reg->num_null_check <= 0) return ONIGERR_TOO_MANY_NULL_CHECK;

包含大量此类结构的特制模式,将计数器推过标识符范围;存储值回绕,并在编译后的程序中冲突。修复新增的回归测试展示两种触发形式,各自在单个模式中重复 100,000 次:

'(?:foobar){0,100}' * 100000          # range repeats
'(?:(?:foo)?|(?:bar)?)*' * 100000     # constructs needing null checks

GitLab 公告表示,编译此类模式时触发的整数溢出可被转为服务器任意代码执行。研究人员 Johan Carlsson(网名 joaxcar)通过 GitLab HackerOne 漏洞赏金计划报告了问题。这是他一个月内在 GitLab 中报告的第四个正则引擎代码执行漏洞,也是首个影响 19.2 之前版本的问题。

如何利用?

没有公开利用代码,因此下述步骤依据公告、上游补丁和 Ruby 对输入路径的描述,而不是已发布的概念验证。

  1. 攻击者向一个编译用户模式的 GitLab 功能提供特制正则表达式。GitLab 会编译用户提供的模式,例如 CI 配置中的模式,但尚未披露哪些功能可触发此漏洞。
  2. 模式是生成出来而非手工输入:将带量词的结构重复数万次,如回归测试中的两种形式。
  3. 编译期间,重复和空匹配检查标识符的计数器超出 MemNumType 范围并回绕,导致编译后的程序携带冲突标识符。
  4. 受损的编译状态引发内存破坏,GitLab 表示这可转为以 GitLab 服务器进程身份执行代码。

失败或尝试利用的可观察痕迹,是 GitLab 发布的两条检测规则的主题。它们都位于开源 TLDR 检测框架中,以 Sigma 格式针对 GitLab 应用日志编写。

攻击如何展开?

流程很短:机器生成的、充满重复结构的模式进入编译器,标识符回绕,受损程序要么使工作进程崩溃,要么将执行权交给攻击者。

flowchart LR A["包含数万次重复结构的
特制模式"] --> B["提交到编译用户模式的
GitLab 功能"] B --> C["Onigmo 使用无界计数器分配
OP_REPEAT 和空匹配检查 ID"] C --> D["计数器超出 MemNumType 范围:
没有边界检查,ID 回绕"] D --> E["冲突的 ID 破坏
编译后的程序"] E --> F["工作进程崩溃,或内存破坏
转为代码执行"]

攻击者能做什么?

  • 无需身份验证,以 GitLab 进程用户身份在 GitLab 服务器运行任意代码。CVSS 向量的影响范围为 Changed,意味着评分考虑了漏洞组件之外的影响。
  • 访问 GitLab 进程能访问的一切:代码仓库及历史、CI/CD 变量和其他存储的密钥、容器及软件包仓库,以及运行实例的主机。
  • 通过 CI 横向扩展:Runner 执行受影响实例定义的作业,因此服务端代码执行可影响信任它的工作负载和机器。

攻击者需要的条件是:网络可达 GitLab Web 界面,以及尚未披露的前提条件。CVSS 向量 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H 表明无需身份验证,也未要求用户交互。由于前提条件未公开,应将互联网可达的自行管理实例视为已暴露。

为什么修复有效?

Ruby 拉取请求 #16801 在两个计数器处封堵溢出。每次递增后,新代码将计数器转换为 MemNumType,如果值已经回绕,就返回硬错误:

/* regcomp.c, compile_range_repeat_node() */
if ((MemNumType)reg->num_repeat <= 0) return ONIGERR_TOO_MANY_RANGE_REPEAT;

/* regcomp.c, compile_tree_empty_check() */
if ((MemNumType)reg->num_null_check <= 0) return ONIGERR_TOO_MANY_NULL_CHECK;

新增的两个错误码 ONIGERR_TOO_MANY_RANGE_REPEAT(-224)和 ONIGERR_TOO_MANY_NULL_CHECK(-225),以及 regerror.c 中的消息,使标识符将溢出的模式在编译程序形成前就被作为 RegexpError 拒绝。无法生成冲突标识符,破坏路径因此关闭。此修复完整解决该漏洞,并为两种触发形式提供回归测试。

部署环节值得关注。上游修复于 2026 年 4 月 29 日合入 ruby/ruby,但直到 2026 年 10 月 23 日才有 Ruby 版本包含它:Ruby 4.0.9、3.4.12 和 3.3.13。公告确认它们是各自系列首个包含修复的版本,并明确 Ruby 4.0.8 不包含此次修复。GitLab 没有等待:其 10 月 21 日软件包包含自行回移的补丁,发布说明在 19.2 至 19.5 构建中列出“为 3.3、3.4 和 4.0 添加 Ruby regexp 重复 ID 溢出补丁”,同时将较早的重复范围修复覆盖到更旧分支。安装修复后的 GitLab 版本,即通过捆绑 Ruby 应用修复。

如何检查是否已遭入侵?

尚未报告 CVE-2026-110264 利用,也不存在入侵指标。截至 2026 年 10 月 25 日,GitLab 和 CISA 目录均未显示在野活动。

在情况变化前,防御者可使用两条已发布检测规则及一般监控:

  • GitLab 的 Sigma 规则 Onigmo 原生工作进程崩溃和 Org 模式渲染错误突增针对 GitLab 自身应用日志运行,是厂商支持的利用尝试检查方式。
  • 一般而言,与模式编译相关的 Ruby 工作进程集中崩溃、Org 模式渲染错误突增,以及 GitLab 服务账户产生意外子进程或出站连接,都是成功或尝试利用可能留下的信号。将此类发现视为代码执行事件:隔离、创建快照、轮换实例持有的密钥,并从干净安装重新构建。

时间线

  • 2026-04-29:修复 ruby/ruby 拉取请求 #16801“拒绝超大正则表达式中溢出的重复/空匹配检查 ID”合入上游。
  • 2026-09-23:GitLab 在 19.4.1 中修复 joaxcar 的前两个正则引擎漏洞 CVE-2026-89078 和 CVE-2026-93577,两者均评分 9.9 且需要账户。
  • 2026-10-12:GitLab 在 19.2.8、19.3.5 和 19.4.2 中修复 CVE-2026-97229,即评分 10.0、无需身份验证的正则编译器溢出。
  • 2026-10-21:GitLab 在 19.5.1、19.4.3、19.3.6、19.2.9、19.1.9、19.0.10 和 18.11.13 中修复 CVE-2026-110264,回移范围超出通常政策。
  • 2026-10-22:CVE-2026-110264 发布,评分为 CVSS v3.1 10.0。
  • 2026-10-23:Ruby 发布 4.0.9、3.4.12 和 3.3.13,包含底层 Onigmo 修复,并通过公告指出每个 GitLab CVE 对应的漏洞。
  • 2026-10-25:本文发布。

常见问题

我在 10 月 12 日为 CVE-2026-97229 打了补丁,现在安全吗?

不安全。10 月 12 日的构建版本 19.2.8、19.3.5 和 19.4.2 位于 CVE-2026-110264 的受影响范围,新修复版本分别高一个补丁版本,为 19.2.9、19.3.6 和 19.4.3。较早漏洞的影响只回溯到 19.2,此次则不止于此,因此所有自行管理实例,无论此前应用过什么补丁,都需要 10 月 21 日版本。

GitLab.com 或 GitLab Dedicated 受影响吗?

不受影响。GitLab.com 已运行修复版本,GitLab Dedicated 租户的内部版本 19.3.5-internal0 和 19.4.2-internal0 或更高版本也已包含修复。暴露的是所有部署类型的自行管理 CE 和 EE 安装。

攻击者需要哪些 GitLab 功能?

GitLab 未披露前提条件,因此没有通过配置排除实例的文档依据。GitLab 编译用户提供的正则表达式,例如 CI 配置模式;已发布检测规则监视 Onigmo 工作进程崩溃和 Org 模式渲染错误突增。在修补前,应将任何互联网可达的自行管理实例视为暴露。

Regexp.timeout 或模式长度限制能保护我自己的 Ruby 应用吗?

不能。Ruby 公告指出,Regexp.timeout 不能防护这些漏洞,长度限制也不可靠,因为短模式就能触发其中一些问题。通过 Regexp.new、Regexp.union、Regexp.compile 或向正则字面量插值来编译攻击者可控字符串的应用,应升级 Ruby,并停止编译不可信模式。

CVE 扫描器会标记存在漏洞的 Ruby 安装吗?

不会通过 Ruby CVE 标识符标记:Ruby 至少目前尚未申请自己的编号,而是让用户跟踪 GitLab 的四个 CVE 编号,但这些记录只将 GitLab 列为受影响产品。应按 Ruby 版本跟踪:4.0.9、3.4.12 和 3.3.13 已修复,Ruby 4.0.8 缺少 CVE-2026-110264 的修复,Ruby 3.2 及更早版本已终止支持且无修复。

单节点服务器升级有什么代价?

19.4.3 和 19.3.6 包含数据库迁移,必须在 GitLab 启动前完成,因此单节点安装会停机。多节点安装可使用 GitLab 零停机流程应用补丁,19.4.3 还会在升级后运行部署后迁移。

在攻击者之前找到未修补的 GitLab 实例

使用 Ostorlab 扫描外部资产和容器镜像,找出资产范围内所有仍运行 2026 年 10 月 21 日发布版本之前版本的自行管理 GitLab 实例,包括很少被关注的预发布和仅用于 CI 的服务器。

参考资料

  • GitLab 严重补丁版本 19.5.1、19.4.3、19.3.6、19.2.9、19.1.9、19.0.10 和 18.11.13,2026 年 10 月 21 日,包含 CVE-2026-110264 描述、CVSS 10.0 向量、受影响范围、回移说明、joaxcar 致谢、检测链接及迁移提醒:https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-5-1-released/ (2026 年 10 月 25 日核查)
  • CVE-2026-110264 记录,包含受影响版本范围及 HackerOne 报告引用:https://cveawg.mitre.org/api/cve/CVE-2026-110264 (2026 年 10 月 25 日核查)
  • Ruby 公告《与 GitLab CVE-2026-89078、CVE-2026-93577、CVE-2026-97229 和 CVE-2026-110264 相关的 Regexp 编译修复》,2026 年 10 月 23 日,包含每个 CVE 对应漏洞表、受影响输入定义、临时措施局限及致谢:https://www.ruby-lang.org/en/news/2026/10/23/regexp-fixes-for-gitlab-cves/ (2026 年 10 月 25 日核查)
  • ruby/ruby 拉取请求 #16801“拒绝超大正则表达式中溢出的重复/空匹配检查 ID”,2026 年 4 月 29 日合入,包含两个计数器检查、新错误码和回归测试:https://github.com/ruby/ruby/pull/16801 (2026 年 10 月 25 日核查)
  • Ruby 4.0.9 版本,2026 年 10 月 23 日,首个包含 CVE-2026-110264 修复的 4.0 版本:https://www.ruby-lang.org/en/news/2026/10/23/ruby-4-0-9-released/ (2026 年 10 月 25 日核查)
  • Ruby 3.4.12 和 3.3.13 版本,2026 年 10 月 23 日:https://www.ruby-lang.org/en/news/2026/10/23/ruby-3-4-12-released/ 和 https://www.ruby-lang.org/en/news/2026/10/23/ruby-3-3-13-released/ (2026 年 10 月 25 日核查)
  • GitLab omnibus 合并请求,将 Ruby regexp 重复 ID 溢出补丁加入 19.5 构建,来自发布版本的错误修复列表:https://gitlab.com/gitlab-org/omnibus-gitlab/-/merge_requests/9922 (2026 年 10 月 25 日核查)
  • GitLab 检测规则“Onigmo 原生工作进程崩溃”,TLDR 框架中的 Sigma 格式:https://gitlab.com/gitlab-security-oss/tldr/-/blob/main/Detections/platforms/GitLab/Vulnerability%20Detections/onigmo_native_worker_crash.md (2026 年 10 月 25 日核查)
  • GitLab 检测规则“Org 模式渲染错误突增”,TLDR 框架中的 Sigma 格式:https://gitlab.com/gitlab-security-oss/tldr/-/blob/main/Detections/platforms/GitLab/Vulnerability%20Detections/org_mode_render_error_burst.md (2026 年 10 月 25 日核查)
  • CVE-2026-110264 的 HackerOne 报告,引用编号 4093475:https://hackerone.com/reports/4093475 (引用自 CVE 记录,2026 年 10 月 25 日核查)
  • The Hacker News,《严重 GitLab 漏洞(CVSS 10.0)可能导致横跨 12 年版本的未授权 RCE》,2026 年 10 月 21 日,包含修复版本矩阵、10 月 12 日已打补丁用户再次暴露及升级停机细节:https://thehackernews.com/2026/10/critical-gitlab-flaw-cvss-100-could.html (2026 年 10 月 25 日核查)
  • The Hacker News,《Ruby 修复导致四个严重 GitLab RCE 漏洞的三个正则引擎错误》,2026 年 10 月 23 日:https://thehackernews.com/2026/10/ruby-fixes-three-regex-engine-bugs.html (2026 年 10 月 25 日核查)
  • CVE-2026-97229,10 月 12 日在 19.2.8、19.3.5 和 19.4.2 修复的关联问题:https://www.cve.org/CVERecord?id=CVE-2026-97229 (2026 年 10 月 25 日核查)
  • GitLab 零停机升级文档:https://docs.gitlab.com/update/zero_downtime/ (2026 年 10 月 25 日核查)
  • GitLab 旧版本升级路径:https://docs.gitlab.com/update/ (2026 年 10 月 25 日核查)
  • CISA 已知被利用漏洞目录,2026 年 10 月 25 日检查这些 CVE(未列入):https://www.cisa.gov/known-exploited-vulnerabilities-catalog