[!WARNING] 本仓库仅供经授权的安全研究和受控实验室测试使用。请勿对您不拥有或未获得明确评估许可的系统运行该概念验证代码。
CVE-2026-60004 是 Gitea 的 diffpatch API 中的一个严重远程代码执行漏洞。拥有仓库创建或写入权限的已认证用户可以提交一个精心构造的补丁,导致一个可执行的 Git 钩子被实体化到临时裸仓库中。当该钩子被触发时,攻击者控制的命令将以 Gitea 服务账户的权限执行。
如果启用了公开注册,未认证的攻击者可能能够创建一个账户并访问存在漏洞的已认证端点。
| 属性 | 详情 |
|---|---|
| 标识符 | CVE-2026-60004 |
| 安全公告 | GHSA-rcr6-4jqh-j84m |
| 严重程度 | 严重 — CVSS 3.1:9.8 |
| 弱点 | CWE-94:对代码生成的不当控制 |
| 受影响版本 | Gitea 1.17.0 至 1.27.0 |
| 修复版本 | Gitea 1.27.1 |
| 所需访问权限 | 仓库写入权限 |
| 执行上下文 | Gitea 操作系统账户 |
| CISA KEV 日期 | 2026-08-25 |
| 文件 | 描述 |
|---|---|
gitea_diffpatch_rce.py | 仅使用标准库的概念验证脚本,用于认证、创建私有仓库、提交精心构造的补丁并获取命令输出。 |
payload.patch | 示例补丁,用于创建一个可执行的 hooks/post-index-change 钩子。 |
poc.png | 实验室验证期间捕获的截图。 |
README.md | 原始研究笔记。 |
该概念验证在以下隔离环境中得到验证:
| 组件 | 配置 |
|---|---|
| Gitea | 1.27.0 |
| Git | 2.47.2 |
| 部署方式 | 名为 gitea-lab 的 Docker 容器 |
| 服务地址 | 192.168.184.128:3000 |
| 观察到的身份 | uid=1000(git) gid=1000(git) |
成功利用后产生的命令输出类似于:
uid=1000(git) gid=1000(git) groups=1000(git)
Linux 6.12.20-amd64 x86_64
/data/gitea/tmp/local-repo/upload.git630501597
[exit-status=0]

该脚本仅使用 Python 标准库,不需要额外的软件包。
python3 gitea_diffpatch_rce.py <base_url> <username> <password> "<command>"
本地实验室实例的示例:
python3 gitea_diffpatch_rce.py \
http://127.0.0.1:3000 \
pocuser \
'P@ssw0rd!' \
'id; uname -a'
该脚本首先尝试进行 Web 注册,然后使用提供的凭据进行认证。这使得同一命令既可用于启用了开放注册的实例上的新账户,也可用于现有账户。
利用链由四个阶段组成:
攻击者控制的补丁提交
POST /api/v1/repos/{owner}/{repo}/diffpatch 在临时克隆中使用 git apply --index --recount --cached --binary --ignore-whitespace --whitespace=fix -3 应用提供的补丁内容。
钩子路径放置
临时仓库被创建为裸的共享克隆。在裸仓库中,仓库根目录同时也是 $GIT_DIR;因此,补丁路径 hooks/post-index-change 会解析到 Git 的活动钩子目录内。
可执行钩子实体化
同一个补丁被提交两次。第二次应用会产生 add/add 冲突,导致三方回退机制将该路径以 100755 模式实体化到磁盘上,尽管使用了 --cached。随后的索引更新会调用 post-index-change,以 Gitea 服务账户的身份执行注入的 shell 代码。
Git 原生输出获取
该钩子通过 objects/info/alternates 识别源仓库,将命令输出存储为 Git blob,创建 tree 和 commit,并更新 refs/heads/output-leak。随后,概念验证脚本通过 Gitea 的原始文件 API 获取结果。该技术不需要目标发起直接出站连接。
成功利用后,攻击者可以以 Gitea 服务账户的权限执行命令。根据部署配置,攻击者可能能够访问:
app.ini 和数据库凭据SECRET_KEY、INTERNAL_TOKEN 以及与 LFS 相关的密钥已确认该实验室账户对 app.ini 具有读取权限。
防御者应调查以下痕迹和请求模式:
/api/v1/repos/*/*/diffpatch 的两次相同或几乎相同的请求output-leak 的分支poc <[email protected]> 的提交hooks/post-index-change 的意外可执行文件/data/gitea/tmp/local-repo/upload.git* 等路径下的可疑活动这些指标描述的是所包含的概念验证脚本,并非详尽无遗;经过修改的漏洞利用可能使用不同的路径、引用、身份或输出通道。
/api/v1/.../diffpatch 路由。在部署前请针对合法集成验证该规则。DISABLE_REGISTRATION=true。这减少了未认证的可达性,但无法防范拥有仓库写入权限的现有用户。对于本研究中使用的实验室容器,可以通过以下命令进行清理:
docker rm -f gitea-lab
本材料旨在帮助防御者复现、理解、检测和修复该漏洞。运营人员应仅在隔离环境中进行测试,并遵守其组织的授权和披露要求。