漏洞分析 - 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 fetchgit push将使用指定的命令而不是ssh
  • 该命令与GIT_SSH_COMMAND环境变量的格式相同
  • 当设置环境变量时,该配置会被覆盖

漏洞利用流程

  1. 上传恶意配置文件:攻击者上传一个包含core.sshCommand的恶意config文件
  2. 覆盖.git/config:通过控制tree_path参数将文件写入.git目录
  3. 触发命令执行:当Gogs执行git操作(如push)时,会执行注入的命令

环境搭建

准备步骤

  1. 克隆Gogs仓库并切换到v0.12.5版本:

    git clone https://github.com/gogs/gogs/
    git checkout v0.12.5
    
  2. 配置数据库:

    mysqld
    create database gogs;
    
  3. 启动Gogs并进行初始配置

  4. 创建测试账户和仓库

漏洞复现

第一步:上传恶意配置文件

  1. 创建一个名为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
    
  2. 通过"上传文件"功能上传该文件

第二步:提交变更

  1. 修改请求中的tree_path参数为.git

    POST /admin1/repo1/_upload/master/ HTTP/1.1
    Host: localhost:3002
    ...
    _csrf=...&tree_path=.git&files=...&commit_summary=...
    
  2. 提交请求,覆盖.git/config文件

第三步:触发命令执行

当Gogs执行git push操作时,会执行core.sshCommand中指定的命令

漏洞分析

关键代码路径

  1. 文件上传处理

    • repo_editor.goUploadLocalPath函数
    • 文件名参数未充分验证
  2. 文件写入处理

    • repo_editor.goUploadRepoFiles函数
    • tree_path参数未检查是否包含.git
  3. 命令执行点

    • 当执行git push时,会读取.git/config中的core.sshCommand

关键问题

  1. 缺乏对tree_path参数的检查,允许写入.git目录
  2. 未对上传的文件内容进行过滤,允许设置危险的Git配置

修复方案

官方在0.12.6版本中修复了此漏洞,主要修改包括:

  1. 增加了对tree_path参数的检查:

    // Prevent uploading files into the ".git" directory
    if isRepositoryGitPath(opts.TreePath) {
        return errors.Errorf("bad tree path %q", opts.TreePath)
    }
    
  2. 检查函数isRepositoryGitPath实现:

    func isRepositoryGitPath(path string) bool {
       return strings.HasSuffix(path, ".git") || 
              strings.Contains(path, ".git"+string(os.PathSeparator))
    }
    

防御建议

  1. 及时升级到Gogs 0.12.6或更高版本
  2. 对用户上传的文件进行严格的内容检查
  3. 限制Git配置中的危险选项
  4. 实施最小权限原则,限制Gogs进程的执行权限

总结

CVE-2022-0415漏洞利用了Gogs在文件上传和处理过程中的两个关键缺陷:

  1. 允许用户控制文件写入位置(包括.git目录)
  2. 未对Git配置文件中的危险选项进行过滤

通过精心构造的请求,攻击者可以注入并执行任意命令。该漏洞强调了在Web应用中处理文件上传和Git操作时需要特别注意安全性。

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版本: 配置数据库: 启动Gogs并进行初始配置 创建测试账户和仓库 漏洞复现 第一步:上传恶意配置文件 创建一个名为 config 的文件,内容如下: 通过"上传文件"功能上传该文件 第二步:提交变更 修改请求中的 tree_path 参数为 .git 提交请求,覆盖.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 参数的检查: 检查函数 isRepositoryGitPath 实现: 防御建议 及时升级到Gogs 0.12.6或更高版本 对用户上传的文件进行严格的内容检查 限制Git配置中的危险选项 实施最小权限原则,限制Gogs进程的执行权限 总结 CVE-2022-0415漏洞利用了Gogs在文件上传和处理过程中的两个关键缺陷: 允许用户控制文件写入位置(包括.git目录) 未对Git配置文件中的危险选项进行过滤 通过精心构造的请求,攻击者可以注入并执行任意命令。该漏洞强调了在Web应用中处理文件上传和Git操作时需要特别注意安全性。