GitLab 官方近日推送了一批跨度罕见的紧急补丁,覆盖了从 18.11.13、19.0.10、19.1.9、19.2.9、19.3.6、19.4.3 到最新的 19.5.1。在修复的十多项安全漏洞中,最扎眼的是一个被官方直接打出 CVSS 10.0 满分 的关键漏洞 CVE-2026-110264。该漏洞源自正则表达式编译器里的整数溢出,攻击者可以通过构造特定正则规则,在未授权状态下直接在服务器上执行原生系统命令。
官方托管的 GitLab.com 和部分 Dedicated 专有实例已经完成热修,但对于所有在内网或公网裸奔的自托管(Self-managed)实例来说,升级没有任何讨价还价的余地。
从字符解析到原生执行的内存坍塌
这个漏洞之所以被评定为最高危,在于它击穿了现代 Web 架构中大家默认坚固的安全边界。很多运维团队看到 Web 应用漏洞,第一反应往往是应用层的数据越权或 SQL 注入,但这一次问题出在最底层的底层——C 语言编写的原生正则表达式引擎。
在 GitLab 这类复杂的代码托管与 CI/CD 平台中,正则表达式几乎无处不在,从分支路由、文件路径匹配到流水线语法解析,都重度依赖底层的 Ruby 正则模块。当系统使用类似 Onigmo 这类原生编译引擎处理特定编码的正则表达式时,在重新计算编译程序大小的过程中,由于缺乏严格的数值上界校验,触发了整数溢出。
一旦整数溢出发生,引擎分配的实际内存空间就会远小于编译生成的正则字节码大小。这导致被恶意破坏的字节码直接溢出到邻近内存段。在没有严格沙箱隔离的运行环境下,这种底层的内存损坏能够直接绕过上层运行时的安全约束,将精心编排的数据伪装成 CPU 指令执行。
安全研究机构 Rapid7 在开启了 ASLR(地址空间布局随机化)防护的官方 GitLab CE 19.4.1 Linux amd64 镜像中,已经完整验证了从特定输入到远程代码执行(RCE)的全过程。整个攻击穿透了 Web 应用的逻辑层,最终直接拿下了宿主机操作系统底层的 git 用户命令行权限。
满分神话与现实攻防的割裂
官方给出的漏洞向量非常吓人:AV:N/AC:L/PR:N/UI:N,翻译过来就是网络可达、利用复杂度低、无需任何权限、无需用户交互。但如果仔细推敲现实中的漏洞触发链,会发现官方评级和实际攻击门槛之间存在一定的认知落差。
在相近机制的正则漏洞(例如此前修复的 CVE-2026-97229)复现过程中,攻击往往不是凭空发送一个 HTTP 请求就能直接拿下机器。要让平台去调用底层引擎编译那段特制正则,攻击者通常需要具备向公开仓库提交代码、推送特定 CI 配置文件或触发特定路由解析的前置动作。也就是说,虽然最后触发崩溃和执行代码的调用链可能不需要额外凭证,但铺设攻击现场往往依赖平台已有的公开协作能力。
评级关注理论破坏的峰值,而实战取决于链路两端的阻力。
尽管截至补丁发布时公网尚未捕获到大规模在途利用,但这并不意味着企业可以高枕无忧。实验室环境下的 PoC 已经证实了可执行性,武器化脚本从研究机构流向黑灰产从来只是时间问题。
同月内相继出现 CVE-2026-97229 与当前的 CVE-2026-110264,社区对两起连续暴发的正则内存破坏漏洞很容易产生混淆,但它们共同指向了一个残酷现实:企业自建代码托管中心,天然是供应链攻击的头号目标。一旦系统被拿获 git 权限,攻击者不仅能横向拉取所有未公开的项目代码,还能顺藤摸瓜洗劫 CI/CD 中缓存的生产部署密钥、私有镜像源密码以及环境变量。
历史包袱下的升级死结
《韩非子》有云:“千里之堤,毁于蚁穴。”这一次的蚁穴,在系统里沉睡得实在太久。
受 CVE-2026-110264 影响的版本一路追溯到了 7.0 版本。这意味着自 GitLab 早期版本以来的代码逻辑,在长达十余年的时间里,底层一直带着这个内存隐患。但对于许多企业的运维团队而言,看到跨度如此巨大的补丁通知,第一感受往往不是庆幸,而是头疼。
许多企业内部的私有化部署实例长期停留在老旧大版本上,因为跨版本的跳跃升级绝非改动一个二进制文件那么简单。它伴随着复杂的 PostgreSQL 数据库表结构迁移、破坏性配置变更以及第三方插件兼容性失效。在一个把代码仓视作生命线的组织里,安排一次可能引发服务中断的长周期停机维护,需要协调无数业务研发部门。
- 建议.自托管团队应立刻排查当前实例所处的次要分支,采用最小升级路径,直接对齐至官方提供的回退补丁版本(如 18.11.13、19.0.10、19.1.9、19.2.9、19.3.6、19.4.3 或 19.5.1),避免盲目跨大版本带来业务瘫痪。
- 风险.若因架构包袱严重而短时间内无法停机打补丁,单靠外围 WAF 很难完全拦截变种编码的正则攻击载荷;暴露在公网但未能升级的老旧实例,随时可能沦为软件供应链被切断的最初缺口。
技术债务的清算从来不会提前打招呼。当一个基础设施级的应用把底层底座暴露给未知输入时,再厚重的中台架构和权限体系,最终都可能崩塌于一次看似普通的字符编译之中。
