Alardiians/gitea-CVE-2026-28699
GitHub: Alardiians/gitea-CVE-2026-28699
该项目提供了 CVE-2026-28699(Gitea OAuth2 scope 绕过)的完整漏洞分析文档与可自动复现的 PoC 实验环境。
Stars: 1 | Forks: 0
# CVE-2026-28699:通过 HTTP Basic Auth 绕过 Gitea OAuth2 Scope
当 Gitea OAuth2 访问令牌的 scope 仅限于 `read:user` 时,如果将其作为 `Authorization: Basic base64(:x-oauth-basic)` 发送,而不是作为 Bearer 令牌发送,它就可以执行完整的写入操作。对于通过 Basic auth 提供的任何令牌,scope 检查都会被跳过。
受影响版本:`<= 1.26.1`。已在 `1.26.2` 中修复。
安全通告:[GHSA-9r5x-wg6m-x2rc](https://github.com/go-gitea/gitea/security/advisories/GHSA-9r5x-wg6m-x2rc)。CWE-863。严重程度:高。
完整分析:[WRITEUP.md](WRITEUP.md)
## 快速开始
```
pip install -r requirements.txt # requests
python fetch_binaries.py # pulls vulnerable 1.26.1 + patched 1.26.2 for your OS
python poc.py 1.26.1 # vulnerable: Basic-auth write succeeds (scope bypassed)
python poc.py 1.26.2 # patched: Basic-auth write blocked (403)
```
`poc.py` 会在系统临时目录中通过 SQLite 启动一个临时的 Gitea,运行 OAuth2 authorization-code 流程以生成一个仅限 `read:user` 的令牌,然后分别通过 Bearer 和 Basic 调用写入 endpoint 并输出验证结果。设置 `POC_DEBUG=1` 可以查看认证流程的步骤。
### 预期输出
存在漏洞的 `1.26.1` 版本:
```
[Bearer] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
[Basic ] PATCH /api/v1/user/settings -> HTTP 200 (ALLOWED -- scope BYPASSED)
>>> VULNERABLE: read:user token performed a write via Basic auth.
```
已修复的 `1.26.2` 版本:
```
[Bearer] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
[Basic ] PATCH /api/v1/user/settings -> HTTP 403 (blocked)
>>> PATCHED: scope enforced on both Bearer and Basic.
```
## 一表看懂根本原因
| 认证方式 | `IsApiToken` | `ApiTokenScope` | 是否强制执行 scope? |
|---|---|---|---|
| 通过 Bearer 的 OAuth2 令牌 | `true` | 已设置 | 是 |
| 通过 Basic 的 OAuth2 令牌 | `true` | 缺失 | 否 (fails open) |
| Personal access token | `true` | 已设置 | 是 |
`services/auth/basic.go` 为 OAuth2 令牌设置了 `IsApiToken`,但没有设置 `ApiTokenScope`。`tokenRequiresScopes` middleware 在 scope 缺失时会提前返回,因此没有任何内容被检查。1.26.2 版本的修复添加了缺失的 `store.GetData()["ApiTokenScope"] = accessTokenScope`。
## 文件
| 文件 | 用途 |
|---|---|
| [`WRITEUP.md`](WRITEUP.md) | 根本原因分析、影响、修复和检测方案 |
| `fetch_binaries.py` | 为您的 OS/arch 下载 1.26.1 / 1.26.2 二进制文件 |
| `poc.py` | 配置 Gitea,生成 `read:user` 令牌,对比测试 Bearer 与 Basic |
| `requirements.txt` | `requests` |
## 仅限授权使用
仅用于教育和授权的安全测试:您自己的实验室、CTF 和 HTB 机器,以及范围内的漏洞赏金目标。该 PoC 会运行自己一次性的 Gitea,请勿将其指向您不拥有的任何目标。
标签:Gitea, OAuth2, Python, StruQ, 无后门, 漏洞复现环境, 越权漏洞, 逆向工具