iqx6889/CVE-2026-52813-Gogs-RCE

GitHub: iqx6889/CVE-2026-52813-Gogs-RCE

一个针对 Gogs CVE-2026-52813 路径穿越 RCE 漏洞的防御向分析项目,提供根因解析、检测规则与非侵入式扫描工具。

Stars: 1 | Forks: 0

# CVE-2026-52813 — Gogs 路径穿越导致 Git Hooks 远程代码执行(防御向分析) | 项目 | 内容 | |---|---| | CVE | [CVE-2026-52813](https://github.com/gogs/gogs/security/advisories/GHSA-c39w-43gm-34h5) | | 别名 | GHSA-c39w-43gm-34h5 / GO-2026-5305 | | 受影响版本 | **Gogs < 0.14.3** | | 修复版本 | **0.14.3** — PR [#8334](https://github.com/gogs/gogs/pull/8334) | | CVSS 3.1 | **10.0 Critical** `AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H` | | CWE | CWE-23 Relative Path Traversal → RCE | | 前置条件 | 一个普通注册账号(默认开放注册时 = 未授权 RCE) | ## TL;DR Gogs 在创建组织时,**Web 表单有 `AlphaDashDot` 字符校验拦截 `/`,但 REST API `POST /api/v1/user/orgs` 没有**。攻击者通过 API 提交带 `../` 的组织名,绕过校验直达 `os.MkdirAll(repoutil.UserPath(org.Name), 0777)`(`internal/database/org.go:165`),把仓库目录写到任意文件系统路径。结合 Gogs 的 Web 编辑器临时工作树(`local-r//`),可在另一个仓库的本地 checkout 内落地恶意 `hooks/update`,由 git 自动执行 → 以 `git` 用户身份 RCE。 ## 受影响版本与处置 | Gogs 版本 | 状态 | |---|---| | `< 0.14.3` | **受影响,立即升级** | | `>= 0.14.3` | 已修复 | **升级是唯一彻底修复手段**: # Docker docker pull gogs/gogs:0.14.3 # 或源码 git checkout v0.14.3 && go build 临时缓解(无法升级时): - **关闭开放注册**(`app.ini` → `[service] DISABLE_REGISTRATION = true`),把前置条件从"未授权"降级为"需已存在账号"; - 在反向代理(nginx/Caddy/Traefik)层加 WAF 规则拦截 `POST /api/v1/user/orgs`、`POST /api/v1/org/*/repos` 请求体中 `username` / `name` 字段含 `..` 或 `/` 的(见 [detection/](detection/)); - 限制 Gogs 容器对 `/data/gogs/data/tmp/` 之外的写权限(selinux/apparmor)。 ## 根因分析 ### 1. 校验不对称:Web 有,API 没有 Web 表单(`internal/form/org.go`,v0.14.2): type CreateOrg struct { OrgName string `binding:"Required;AlphaDashDot;MaxSize(35)"` // 正则 ^[a-zA-Z0-9._-]+$ } API(`internal/route/api/v1/org/org.go`,v0.14.2): // api.CreateOrgOption (go-gogs-client) 的绑定 tag: type CreateOrgOption struct { UserName string `json:"username" binding:"Required"` // ← 没有 AlphaDashDot! } → `POST /api/v1/user/orgs` 的 `username` 字段可携带任意字符直达 DB 层。 ### 2. DB 层只查保留名,不查字符集 `internal/database/users.go:1532` `isNameAllowed` 只拦截保留名/前后缀(如 `admin`、`-bot`),**不校验字符集**,所以 `../` 能过。 ### 3. 路径 sink 无净化 `internal/repoutil/repoutil.go`(v0.14.2): func UserPath(user string) string { return filepath.Join(conf.Repository.Root, strings.ToLower(user)) // ← 直接拼接 } `internal/database/org.go:165`: os.MkdirAll(repoutil.UserPath(org.Name), os.ModePerm) // org.Name 含 ../ → 任意路径写入 ### 4. 利用 local-r 工作树落地 hook Gogs 处理 Web/API 文件编辑时,会把仓库 checkout 到 `/data/gogs/data/tmp/local-r//`。`` 恰好等于仓库的数据库 `id`。攻击者: 1. 建个人仓库 `writer`,得到 `id == n`; 2. API 建穿越组织 `username = "../../../../data/gogs/data/tmp/local-r/n/nested"` → 物理目录落在 `writer` 的工作树内; 3. 在该组织下建仓库 `rce-x` → 落在 `local-r/n/nested/rce-x.git`; 4. clone `writer`,把 `nested/rce-x.git/hooks/update` 作为**普通文件**提交并 push(它就落在 writer 工作树里); 5. API 触发 `writer` 的文件操作 → Gogs 在 `local-r/n/` 跑 git → git 执行 `hooks/update` → **RCE**。 详细补丁 diff 分析见 [patch/ANALYSIS.md](patch/ANALYSIS.md)。 ## 检测 完整规则见 [detection/](detection/): - **Sigma 规则**:[detection/sigma/](detection/sigma/) — 覆盖攻击尝试(API 请求含 `../`)和成功利用(文件系统落地) - **SIEM 查询**:[detection/queries.md](detection/queries.md) — Splunk / Elastic / Kibana / Loki - **IOCs**:[detection/iocs.md](detection/iocs.md) — 文件系统痕迹、日志签名、用户名特征 最关键的两条: 1. **WAF / 反向代理层**拦截:`POST /api/v1/user/orgs` 与 `POST /api/v1/org/*/repos` 的 JSON body 中 `username`/`name` 字段含 `..` 或 `/`。 2. **文件系统巡检**:`/data/gogs/data/tmp/local-r/*/` 下出现非预期子目录(`nested/`、`rce-*.git`、`hooks/update`)。 ## 防御向工具 - [tools/check_version.py](tools/check_version.py) — **非侵入式**版本扫描器:通过 `GET /api/v1/version` 检查 Gogs 实例是否 `< 0.14.3`,支持批量扫描、CSV 输出,适合资产盘点。 ## 实验环境 [detection/](detection/) 规则需要在受影响的 Gogs 上验证,[lab/docker-compose.yml](lab/docker-compose.yml) 提供隔离的 Gogs 0.14.2 环境供蓝队测试检测规则是否命中。**请勿暴露到公网,仅本地使用。** ## 时间线 | 日期 | 事件 | |---|---| | 2026-06-08 | CVE 保留 | | 2026-06-24 | 公开披露,Gogs 0.14.3 发布 | | 2026-06-24 | 官方 advisory GHSA-c39w-43gm-34h5 发布 | ## 参考 - 官方 advisory:https://github.com/gogs/gogs/security/advisories/GHSA-c39w-43gm-34h5 - 修复 PR:https://github.com/gogs/gogs/pull/8334 - OSV:https://osv.dev/vulnerability/CVE-2026-52813 - Gogs 0.14.3 release:https://github.com/gogs/gogs/releases/tag/v0.14.3 ## ⚠️ 关于"gitrebase 参数注入"的误传 网上有把这个 CVE 描述成 *"Gogs gitrebase 参数注入远程代码执行"* 的——**那是错的**。本漏洞与 `git rebase` / `gitrebase` 无关,根因是 API 路径穿越。本文档按真实漏洞分析。 ## License MIT — 见 [LICENSE](LICENSE)。
标签:CISA项目, Gogs, 漏洞分析, 编程工具, 规则检测, 请求拦截, 越狱测试, 路径探测, 路径穿越, 远程代码执行, 逆向工具, 防御向