GitLab任意文件读取漏洞CVE-2020-10977
字数 1291 2025-08-15 21:30:55
GitLab任意文件读取漏洞(CVE-2020-10977)技术分析与防护指南
漏洞概述
CVE-2020-10977是GitLab中存在的一个高危任意文件读取漏洞,允许攻击者通过目录穿越技术读取服务器上的任意文件。该漏洞于2020年3月26日由GitLab官方发布补丁,漏洞细节于2020年4月28日公开。
受影响组件
- 组件名称: GitLab
- 组件类型: 基于网络的Git仓库管理工具
- 许可证: MIT许可证
- 功能特性: 提供仓库管理、wiki和issue跟踪功能
受影响版本
- 企业版(EE): 8.5至12.9的所有版本
- 社区版(CE): 8.5至12.9的所有版本
漏洞原理分析
漏洞位置
漏洞存在于GitLab的UploadsRewriter模块中,该模块负责在项目间移动issue时处理相关文件和引用。
漏洞触发条件
当满足以下条件时漏洞可被利用:
- 项目间发生issue移动操作
- 移动的issue中包含文件引用
漏洞代码分析
核心问题代码逻辑:
MARKDOWN_PATTERN=%r{uploads/(?<secret>[0-9a-f]{32})/(?<file>freeze
虽然代码使用正则表达式对引用的文件路径进行了部分限制(要求32位哈希值),但存在以下缺陷:
- 未对文件路径进行充分验证
- 缺乏有效的目录穿越防护机制
- 允许通过构造特殊路径访问系统任意文件
攻击方式
攻击者可以通过以下步骤利用该漏洞:
- 创建一个包含特殊构造文件引用的issue
- 将该issue移动到另一个项目
- 在移动过程中,GitLab会尝试复制引用的文件
- 通过目录穿越技术,攻击者可指定服务器上的任意文件路径
检测方法
版本检测
执行以下命令检查当前GitLab版本:
cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
如果返回的版本号在8.5至12.9之间(包含两端点版本),则系统存在此漏洞。
漏洞验证
注意:验证操作可能违反安全政策,应在授权环境下进行
- 创建一个测试issue,包含特殊构造的文件引用
- 尝试移动该issue到其他项目
- 观察是否能通过此方式读取非预期文件
修复方案
官方修复
GitLab官方已在后续版本中修复该漏洞,建议用户:
- 升级到最新版本的GitLab
- 社区版下载地址:https://packages.gitlab.com/gitlab/gitlab-ce
临时缓解措施
如果无法立即升级,可考虑:
- 限制issue移动功能权限
- 监控异常的文件访问行为
- 加强服务器文件系统权限控制
时间线
- 2020/3/26: GitLab发布更新补丁
- 2020/4/28: 漏洞细节被公开
- 2020/5/7: 深信服千里目安全实验室发布漏洞分析文章
防护建议
- 定期更新:建立GitLab组件定期更新机制
- 权限控制:严格控制issue操作权限
- 日志监控:加强文件访问日志的监控和分析
- 纵深防御:实施服务器文件系统的访问控制策略
- 漏洞扫描:定期进行安全漏洞扫描
参考资源
- GitLab官方更新包:https://packages.gitlab.com/gitlab/gitlab-ce
- 漏洞详细分析报告(深信服千里目安全实验室)
- CVE官方描述:https://nvd.nist.gov/vuln/detail/CVE-2020-10977