qz安全情报分析 14小时前
[AI-VA-20250626-001] - Gogs符号链接处理不当导致远程命令执行
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文针对Gogs (Go Git Service) 软件中发现的路径遍历漏洞进行深入分析,该漏洞允许攻击者绕过安全检查,在.git目录下执行任意文件操作,最终可能导致远程命令执行。报告详细介绍了漏洞的成因、攻击方式、代码层面的漏洞点,以及修复和缓解措施,旨在帮助用户理解并修复该安全隐患。

🛡️ 漏洞概述:Gogs 0.13.0及之前版本存在路径遍历漏洞,是CVE-2024-39931补丁不完善导致的绕过。攻击者通过符号链接绕过文件上传时的安全检查,实现在.git目录下的任意文件操作,可能导致远程命令执行。

💻 攻击分析:攻击者需要获得仓库的写入权限。攻击利用“检查时间与使用时间”(TOCTOU)攻击,应用层代码检查路径字符串,而操作系统执行文件操作时会解析符号链接,从而绕过安全检查。

🔍 代码解读:漏洞的核心在于文件上传处理逻辑中的路径验证步骤。`isRepositoryGitPath`函数仅检查字符串,未解析符号链接。攻击者创建指向.git目录的符号链接,绕过检查后在.git目录下操作文件。

🛠️ 修复建议:最直接的修复方法是升级到Gogs 0.13.0+dev-431-g537b0c03或之后发布的修复版本。对于自行维护分支的开发者,需要在所有处理用户提供路径的文件操作功能中,实现对符号链接的正确解析,在进行路径合法性检查时,应始终操作解析后的规范化路径,而不是用户原始提供的路径字符串。

💡 缓解措施:管理员应审查访问权限,限制不可信用户的写权限。监控仓库目录中的异常文件变更,特别是.git/hooks目录下的文件创建和修改事件,以及时发现攻击行为。

报告生成时间: 2025年6月26日

报告ID: AI-VA-20250626-001

重要声明:关于此报告的生成过程与使用

本报告完全由大型语言模型(LLM)在无人干预的情况下自动生成。

生成过程如下:

信息输入: 模型接收到用户提供的漏洞公告URL (https://github.com/gogs/gogs/security/advisories/GHSA-wj44-9vcg-wjq7
) 以及相关的Gogs项目源代码文件。

信息提取与分析: 模型通过内置的浏览工具访问并解析了公开的安全公告内容,同时交叉引用分析了用户提供的Gogs源代码文件,以定位和理解漏洞相关的代码逻辑。

内容合成与构建: 基于对漏洞公告和源代码的综合理解,模型根据预设的专业报告结构,自动组织语言并撰写了包括背景介绍、代码分析、攻击面分析、补丁评估和修复建议在内的所有章节。

输出: 模型直接输出最终的Markdown格式报告。

在从接收指令到生成报告的整个过程中,没有任何人类安全专家进行干预、指导、修改或审核。因此,本报告可能包含事实错误、不准确的分析或不完整的结论。

强烈建议使用者将此报告作为参考,并务必由合格的安全专业人员进行独立核查与验证,方可用于任何决策或安全实践。

1. 背景信息

1.1. Gogs (Go Git Service)

Gogs是一款使用Go语言开发的、极易搭建的自助Git服务。它的目标是打造一个最简单、最快速、最轻松的方式来搭建私有或公开的Git代码托管仓库。由于其轻量级和跨平台的特性,Gogs在中小型团队和个人开发者中非常流行。

1.2. 安全公告概要 (GHSA-wj44-9vcg-wjq7)

漏洞类型: 路径遍历/不当的符号链接处理 (Improper Link Resolution)

根本原因: 该漏洞是上一个漏洞 CVE-2024-39931 补丁不完善所导致的绕过。Gogs在处理仓库文件上传功能时,增加了一个检查来阻止用户向仓库的.git
目录写入文件。然而,这个检查没有考虑到文件系统中的符号链接(Symbolic Link),导致攻击者可以创建一个指向.git
目录的符号链接,从而绕过检查,实现在.git
目录下的任意文件删除。

潜在影响: 成功利用此漏洞可能导致远程命令执行 (Remote Code Execution, RCE)。攻击者通过删除或修改Git钩子(hooks),可以在Git操作(如push
)被触发时执行任意服务器端命令。

受影响版本: 所有 0.13.0
 之前的版本。

2. 漏洞分析

2.1. 攻击面分析

攻击入口点: 漏洞存在于Gogs处理仓库文件上传和删除的核心功能中。这包括通过Web界面或API进行的任何会导致在仓库文件系统中创建、修改或删除文件的操作。

攻击者要求: 攻击者需要是一个经过身份验证的用户,并且对目标仓库拥有写入权限。这通常意味着攻击者需要是仓库的协作者或所有者。

攻击向量: 攻击向量是一个典型的“检查时间与使用时间”(Time-of-check to time-of-use, TOCTOU)攻击。应用层代码检查的是用户提供的路径字符串,而实际的文件系统操作则由操作系统执行,操作系统会自动解析路径中的符号链接。

2.2. 代码分析

漏洞的核心在于文件上传处理逻辑中的路径验证步骤。

代码参考来源gogs/gogs/gogs-d940e692ec58abd45e648c054d7dfd88909034ec/internal/database/repo_editor.go

UploadFiles
函数中,包含了对上传路径的检查逻辑。上一个漏洞 (CVE-2024-39931) 的修复引入了以下检查:

// in function: UploadFiles

// ... (previous code) ...

for _, file := range files {
    // ... (previous code) ...

    // 🚨 SECURITY: Prevent uploading files into the ".git" directory
    if isRepositoryGitPath(opts.TreePath) {
        return errors.Errorf("bad tree path %q", opts.TreePath)
    }

    // ... (rest of the function) ...
}

此处的 isRepositoryGitPath
 函数定义如下:

代码参考来源gogs/gogs/gogs-d940e692ec58abd45e648c054d7dfd88909034ec/internal/database/repo_editor.go

// isRepositoryGitPath returns true if the given path is a ".git" directory.
func isRepositoryGitPath(path string) bool {
return strings.TrimPrefix(path, "/") == ".git"
}

漏洞根源分析:

表面检查isRepositoryGitPath
 函数仅仅对输入的字符串 opts.TreePath
 进行检查,判断其是否等于.git

符号链接绕过: 攻击者可以先在仓库中创建一个名为 symlink-to-git
 的符号链接,并使其指向.git
目录。

检查通过: 当攻击者尝试上传文件到 symlink-to-git/hooks/pre-receive
 时,应用程序会检查 opts.TreePath
,此时它的值可能是 symlink-to-git
isRepositoryGitPath("symlink-to-git")
 的返回值为 false
,因此安全检查被成功绕过。

TOCTOU: 应用程序认为路径是安全的,并继续执行后续的文件操作(如写入或删除)。当调用底层的 os
 包函数时,操作系统会解析symlink-to-git
,将实际的操作指向了.git/hooks/pre-receive

实现攻击: 这样,攻击者便成功地在受保护的.git
目录内进行了文件操作。通过删除或替换Git钩子文件,例如pre-receive
update
,攻击者可以植入恶意脚本,等待下一次git push
操作时在服务器上执行,从而将漏洞升级为远程命令执行。

2.3. 补丁分析

GHSA-wj44-9vcg-wjq7中描述的补丁是对上述逻辑的进一步加强。一个有效的补丁必须在进行安全检查之前,将路径解析为其最终的物理路径。

虽然此报告无法直接分析未发布的补丁代码,但根据漏洞原理,一个有效的修复应该包含以下逻辑:

在对路径进行任何操作之前,获取其在文件系统上的绝对路径。

使用类似 filepath.EvalSymlinks()
 的函数来解析路径中可能存在的所有符号链接,得到一个规范化的、无符号链接的真实路径。

对这个解析后的真实路径进行安全检查,确保它不在 .git
 目录或其他敏感目录的范围之内。

仅仅在字符串层面进行检查是不足以抵御此类攻击的。

3. 修复与缓解建议

立即升级: 最直接有效的修复方法是立即将Gogs实例升级到 0.13.0+dev-431-g537b0c03
 或之后发布的修复版本。

代码层修复: 对于自行维护分支的开发者,必须在所有处理用户提供路径的文件操作功能中,实现对符号链接的正确解析。在进行路径合法性检查时,应始终操作解析后的规范化路径,而不是用户原始提供的路径字符串。

// 伪代码修复示例
fullPath := filepath.Join(repoPath, userProvidedPath)

// 解析符号链接,获取真实物理路径
realPath, err := filepath.EvalSymlinks(fullPath)
if err != nil {
    // 处理错误
    return err
}

// 对真实路径进行安全检查
if strings.Contains(realPath, ".git") {
    return errors.New("operation on .git directory is forbidden")
}

// 继续执行文件操作...

访问控制审计: 管理员应审查所有可以访问Gogs仓库并拥有写入权限的用户,确保权限最小化原则。限制不可信用户的写权限可以有效减小攻击面。

监控: 监控仓库目录中异常的文件变更,特别是.git/hooks
目录下的文件创建和修改事件,可能有助于及时发现攻击行为。

4. 参考来源

官方安全公告: https://github.com/gogs/gogs/security/advisories/GHSA-wj44-9vcg-wjq7

相关漏洞公告: https://nvd.nist.gov/vuln/detail/CVE-2024-39931

Gogs项目源码: https://github.com/gogs/gogs

漏洞相关代码文件internal/database/repo_editor.go
 (在 d940e692ec58abd45e648c054d7dfd88909034ec
 版本中)


📍发表于:中国 北京

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

Gogs 路径遍历 漏洞分析 安全修复 远程命令执行
相关文章