CVSS10分Gitlab漏洞究竟能不能读任意文件?
原创 微步情报局 2026-09-12 11:36 北京

点击查看漏洞详情
一、背景
GitLab 是全球广泛使用的一体化 DevSecOps 平台,提供代码托管、代码评审、CI/CD 流水线、制品库、安全扫描等能力,分为开源社区版(CE)与企业版(EE),被大量企业以 self-managed 方式私有化部署。
近日,关于GitLab CE/EE 仓库提交 API 路径遍历漏洞(CVE-2026-85706)讨论热度较高,部分媒体声称该漏洞可读任意文件,CVSS满分。
二、先说结论
该漏洞无法读取并回显服务器上的任意文件,具体受限的条件请见第四节。但是漏洞存在一定危害,依然建议升级。
经过实测,攻击者能读取到的有:
gitlab.yml的配置片段(非完整配置文件,会截断。会不会泄露凭据将取决于凭据在不在截断之前)
几乎整个redis.conf
上述配置文件泄露后,攻击者可借助gitlab token投毒和获取redis等凭据进行进一步对redis攻击。
CISA已将该漏洞标记为“已知在野利用”,建议受影响的用户尽快修复。
三、漏洞原理是什么
漏洞由四个环节叠加:
漏洞所在sink 之前只有项目读授权,没有用户认证。用户认证在文件读取完成之后才被调用——认证存在,但顺序错了。
Workhorse 对所有代理请求都注入内部 JWT,require_gitlab_workhorse! 照常通过。结果是攻击者的原始表单参数不经重写直达 Rails。
攻击者可控参数直接进 File.read,无任何路径约束,绝对路径即可,无需 ..
报错信息把文件内容带回响应。 目标文件内容含非法百分号编码(% 后非两个十六进制字符)时,会将其写入 400 响应体。内容不含 % 的文件不回显。
四、回显的限制
根据漏洞原理可知,该漏洞回显的限制有:
内容限制:目标文件内容含非法百分号编码(% 后非两个十六进制字符)时会回显,否则只会 401,无法回显。
文件限制:git 对该文件能 stat + read
截断限制:GitLab使用的Rack 2.2.23,Rack的参数分隔符是&;。所以整份文件会当form 字符串,然后按 & / ; 切开,每段再按第一个分成 key/value,分别 URI.decode_www_form_component。非法 % 只发生在当前这一段上,e.message 里也只有这一段。
长度限制:Rack默认解析上限为4M(RACK_QUERY_PARSER_BYTESIZE_LIMIT=4194304),只有 ≤ 4MB 的内容走 invalid %-encoding (...) 回显。
例如,当文件内容为:
invalid %-encoding BEFORE_AMP&AFTER_AMP回显的内容为:(&后面的会被截断)
{"message":"400 Bad request - Invalid parameter: invalid %-encoding (invalid %-encoding BEFORE_AMP)"}五、漏洞影响范围
GitLab CE/EE版本 18.7<=version<19.1.8,19.2<=version<19.2.6,19.3<=version<19.3.2受影响。
六、漏洞复现

七、修复方案
官方修复方案
官方已发布修复方案,请访问链接下载:
https://docs.gitlab.com/releases/patches/patch-release-gitlab-19-3-2-released/
临时缓解措施
短期无法升级时,在流量入口(WAF / 前置反向代理)添加拦截规则:对路径匹配 ^/api/v4/projects/[^/]+/repository/commits(.[A-Za-z0-9]+|/)$ 且方法为 POST 的请求阻断。
将 GitLab Web 入口或 /api/v4 限制为信任网段/VPN 访问,缩小未授权攻击面。
八、微步产品支撑
微步漏洞情报于2026-09-11收录该漏洞。
微步下一代威胁情报平台NGTIP及X情报中心已于漏洞收录时向漏洞订阅用户推送该漏洞情报,并将持续推送后续更新;对于已经录入资产的用户,支持实时自动化排查受影响资产。
微步威胁感知平台TDP已于 20260911 支持检测,检测ID: S3100184457 ,模型/规则高于: 2026091100000 可检出。

微步威胁防御系统OneSIG已支持防护,规则ID为:3100184457