GitLab CVE-2026-85706 深度分析:CVSS 10.0 路径穿越漏洞,未认证读取任意文件并在披露当日即遭在野探测
导语
2026 年 9 月 11 日,GitLab 发布安全更新,修复了一个评分 CVSS 10.0(满分) 的严重漏洞 CVE-2026-85706:
- 组件:repository commits API
- 缺陷类型:路径穿越(CWE-22) 叠加 认证执行缺失
- 结果:未认证攻击者可在特定条件下读取任意文件,包括日志与 GitLab 配置文件,进而窃取数据库凭据、密钥等敏感信息
更令人生畏的是:watchTowr 观察到,该漏洞披露后的几个小时内(自 2026-09-11 06:00 UTC 起),互联网上就出现了在野探测活动——攻击者正在利用该漏洞扫描未修补的 GitLab 实例。CISA 已将其纳入 KEV 目录,联邦机构须在 2026-09-14 前完成修补。
| 项 | 值 |
|---|---|
| CVE | CVE-2026-85706 |
| CVSS | 10.0(AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N) |
| CWE | CWE-22(路径穿越) |
| 攻击向量 | 远程、未认证 |
| 影响 | 任意文件读取 → 凭据/密钥泄露 |
| 影响版本 | CE/EE 18.7–19.1.7、19.2–19.2.5、19.3–19.3.1 |
| 修复版本 | 19.1.8 / 19.2.6 / 19.3.2 |
| 上报渠道 | HackerOne(研究员 s3ntago,报告 #3909881) |
| KEV 收录 | 2026-09-11,FCEB 截止 2026-09-14 |
一、漏洞根因:commits API 的路径约束与认证执行双重缺失
什么是 repository commits API
GitLab 的 commits API 是供开发工具、CI/CD 流水线查询提交历史的公开端点,典型调用:
GET /api/v4/projects/:id/repository/commits
GET /api/v4/projects/:id/repository/commits/:sha这类端点本应在 项目级访问控制 内工作——仅允许认证用户访问有权限的仓库。CVE-2026-85706 的实现缺陷在于两层:
- 路径约束缺失(Path Confinement):API 在处理提交相关的文件路径参数时,未正确限制路径范围,攻击者可通过
../序列逃逸出预期目录边界 - 认证执行缺失(Authentication Enforcement):部分代码路径在未验证请求者身份/权限的情况下继续执行
两者叠加后,攻击者无需登录即可向 commits 相关端点发送构造的路径参数,越过仓库隔离,读取服务器上的任意文件:
未认证攻击者
│
│ GET /api/v4/projects/:id/repository/commits/../../../etc/gitlab/gitlab.rb
│ (路径穿越:逃出仓库目录边界)
▼
路径约束缺失(CWE-22)
▼
认证执行缺失(请求未通过权限校验即被执行)
▼
返回任意文件内容:gitlab.rb(含 DB 口令)、secrets.yml、日志…为什么是 CVSS 10.0
AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:N——网络可达、无复杂度门槛、无需认证、无需用户交互、影响范围跨越安全边界(S:C)且机密性与完整性均为高。任何暴露在互联网上的受影响 GitLab 实例,都等于把服务器文件系统敞开在公网面前。
二、攻击价值:从文件读取到实例沦陷
未认证任意文件读取的杀伤力取决于能读到什么。GitLab 实例上最值得读的目标:
/etc/gitlab/gitlab.rb:包含数据库密码、对象存储密钥、gitlab_rails['secret_token']等/etc/gitlab/gitlab-secrets.json:加密密钥库,可用于伪造 GitLab 内部凭据config/secrets.yml:生产密钥- 日志文件(
/var/log/gitlab/*):可能泄露 API token、调用管线、内部主机信息 - 环境变量/进程文件:CI 变量、部署令牌
一旦拿到数据库凭据,攻击者可直连 PostgreSQL 导出全部用户哈希、CI 变量、部署令牌——等于接管整个 GitLab 实例及其承载的代码资产。这也是同一披露周期内两份安全建议(GitLab 官方 + CISA 预警)都将修复标记为"紧急"的原因。
三、在野探测:披露当日的 0day 猎杀
watchTowr 的威胁观察是整个事件里最值得注意的部分:
- 2026-09-11 06:00 UTC 起:漏洞公开后的数小时内,即观察到在野探测活动
- 行为特征:攻击者扫描未修补 GitLab 实例的 commits API 端点,测试路径遍历载荷,尝试读取日志文件(判断实例版本与暴露面)、乃至 GitLab 配置(企图提取凭据)
这意味着:补丁与披露之间存在一个极短的利用窗口——没有在这个窗口内升级的实例,正在被自动化扫描与手工渗透同时猎杀。这也解释了 CISA 为何在同一天将其收录进 KEV 并给联邦机构仅 3 天的修补时限。
同批修复的第二个严重漏洞:CVE-2026-87719
与 CVE-2026-85706 同批修复的还有 CVE-2026-87719——GitLab GraphQL 订阅(subscription)序列化器中的不安全反序列化:
- 可被用于访问 Advanced Search 实例的配置与敏感凭据
- 与路径穿越漏洞形成互补:一个打通文件读取,一个打通配置态泄露
GitLab 建议自托管管理员同时验证两个 CVE 的修复状态,不要只盯着满分的那一个。
四、影响范围与修复
受影响版本(CE 与 EE 同源受波及)
| 分支 | 受影响版本 | 修复版本 |
|---|---|---|
| 19.1 | 18.7.0 – 19.1.7 | 19.1.8 |
| 19.2 | 19.2.0 – 19.2.5 | 19.2.6 |
| 19.3 | 19.3.0 – 19.3.1 | 19.3.2 |
注:官方通告影响范围覆盖 18.7.0 及以上所有受影响分支;自托管(Omnibus/Docker/Helm)均有对应修复版本。
修复动作清单
- 立即升级到 19.1.8 / 19.2.6 / 19.3.2(FedRAMP/SOC2 合规环境按变更窗口优先安排但不要拖过 KEV 截止)
- 升级后轮换密码与密钥:数据库口令、对象存储密钥、API token——一旦旧配置被读取,轮换是唯一兜底
- 审计访问日志:检索 2026-09-11 起 commits API 的异常请求(路径含
..、返回 200 的大响应体) - 若为公有云托管(GitLab.com),无需操作,平台侧已修复
无法立即升级的缓解
- 在反向代理/WAF 层拦截 commits API 的路径穿越载荷(
%2e%2e、..、双重编码变体) - 限制管理面暴露:将 GitLab Web/API 收敛到受控网络,不直接暴露公网
- 监控
repository/commits端点异常 4xx/5xx 与超大响应
五、上下文:GitLab 已成为高级攻击者的重点猎场
CVE-2026-85706 并非孤例,而是 GitLab 2026 年漏洞潮的一部分:
| 时间 | CVE | 严重度 | 类型 |
|---|---|---|---|
| 2026-08 | CVE-2026-19478 | 9.4 | GraphQL 代码注入(披露后即遭在野利用) |
| 2026-09-11 | CVE-2026-85706 | 10.0 | commits API 路径穿越 + 认证缺失 |
| 2026-09-11 | CVE-2026-87719 | 高 | GraphQL 订阅序列化器反序列化 |
GitLab 拥有 3000 万+ 注册用户、覆盖 财富 100 强中过半企业,是软件供应链的核心枢纽。对攻击者而言,GitLab 实例 = 代码 + 密钥 + 发版管道的三合一目标。连续两个月出现可利用级别漏洞,且每次披露后都在极短时间内被在野利用/探测——自托管 GitLab 的运维团队必须把安全补丁的响应速度提升到"小时级",而不是"批次级"。
参考链接
- GitLab 官方安全公告:CVE-2026-85706 / CVE-2026-87719
- NVD:CVE-2026-85706
- BleepingComputer:GitLab urges users to patch max-severity path traversal flaw
- The Hacker News:GitLab Users Urged to Patch Critical Flaws Immediately
- watchTowr Labs:GitLab CVE-2026-85706 在野探测观察
- IONIX:CVE-2026-85706 Threat Analysis
- CISA KEV 目录(CVE-2026-85706 条目)

