漏洞分析 - gogs RCE (CVE-2022-0415)
字数 1304 2025-08-29 08:32:30
Gogs RCE漏洞分析 (CVE-2022-0415) 教学文档
漏洞概述
CVE-2022-0415是Gogs(一个用Golang开发的Git Web服务)中的一个远程命令执行漏洞。该漏洞允许攻击者通过上传恶意配置文件到.git目录,利用Git的core.sshCommand特性实现命令注入和执行。
受影响版本
- 所有低于0.12.6的Gogs版本(不含0.12.6)
漏洞原理
Git相关知识
根据Git官方文档,core.sshCommand配置项有以下特性:
- 如果设置了
sshCommand变量,当需要连接到远程系统时,git fetch和git push将使用指定的命令而不是ssh - 该命令与
GIT_SSH_COMMAND环境变量的格式相同 - 当设置环境变量时,该配置会被覆盖
漏洞利用流程
- 上传恶意配置文件:攻击者上传一个包含
core.sshCommand的恶意config文件 - 覆盖.git/config:通过控制
tree_path参数将文件写入.git目录 - 触发命令执行:当Gogs执行git操作(如push)时,会执行注入的命令
环境搭建
准备步骤
-
克隆Gogs仓库并切换到v0.12.5版本:
git clone https://github.com/gogs/gogs/ git checkout v0.12.5 -
配置数据库:
mysqld create database gogs; -
启动Gogs并进行初始配置
-
创建测试账户和仓库
漏洞复现
第一步:上传恶意配置文件
-
创建一个名为
config的文件,内容如下:[core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true sshCommand = <恶意命令> [remote "origin"] url = git@github.com:torvalds/linux.git fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master -
通过"上传文件"功能上传该文件
第二步:提交变更
-
修改请求中的
tree_path参数为.gitPOST /admin1/repo1/_upload/master/ HTTP/1.1 Host: localhost:3002 ... _csrf=...&tree_path=.git&files=...&commit_summary=... -
提交请求,覆盖.git/config文件
第三步:触发命令执行
当Gogs执行git push操作时,会执行core.sshCommand中指定的命令
漏洞分析
关键代码路径
-
文件上传处理:
repo_editor.go的UploadLocalPath函数- 文件名参数未充分验证
-
文件写入处理:
repo_editor.go的UploadRepoFiles函数tree_path参数未检查是否包含.git
-
命令执行点:
- 当执行
git push时,会读取.git/config中的core.sshCommand
- 当执行
关键问题
- 缺乏对
tree_path参数的检查,允许写入.git目录 - 未对上传的文件内容进行过滤,允许设置危险的Git配置
修复方案
官方在0.12.6版本中修复了此漏洞,主要修改包括:
-
增加了对
tree_path参数的检查:// Prevent uploading files into the ".git" directory if isRepositoryGitPath(opts.TreePath) { return errors.Errorf("bad tree path %q", opts.TreePath) } -
检查函数
isRepositoryGitPath实现:func isRepositoryGitPath(path string) bool { return strings.HasSuffix(path, ".git") || strings.Contains(path, ".git"+string(os.PathSeparator)) }
防御建议
- 及时升级到Gogs 0.12.6或更高版本
- 对用户上传的文件进行严格的内容检查
- 限制Git配置中的危险选项
- 实施最小权限原则,限制Gogs进程的执行权限
总结
CVE-2022-0415漏洞利用了Gogs在文件上传和处理过程中的两个关键缺陷:
- 允许用户控制文件写入位置(包括.git目录)
- 未对Git配置文件中的危险选项进行过滤
通过精心构造的请求,攻击者可以注入并执行任意命令。该漏洞强调了在Web应用中处理文件上传和Git操作时需要特别注意安全性。