Sploitus

Exploit for CVE-2026-20896

kitploit · 2026-09-07

Exploit Code

MARKDOWN79 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-RZ1027-CVE-2026-20896
# CVE-2026-20896

Gitea 的官方 Docker 镜像(最高至 1.26.2 及包括该版本)在其默认配置中包含了 `REVERSE_PROXY_TRUSTED_PROXIES = *`。如果你开启了反向代理登录,这个通配符意味着每个来源 IP 都被视为可信代理,因此任何能访问该端口的人都可以发送 `X-WEBAUTH-USER` 头部并以任意用户身份登录。无需密码,无需令牌。

我已将此问题报告给 Gitea,并在 1.26.3 / 1.26.4 中修复。本仓库是我自己的分析报告、一个可用的 PoC 以及一个检测工具。这是一个已修补的公开漏洞。

  * CVE 记录:https://vulners.com/cve/CVE-2026-20896(报告者:rz1027)
  * Gitea 安全公告:https://github.com/go-gitea/gitea/security/advisories/GHSA-f75j-4cw6-rmx4
  * 修复/发布说明:https://blog.gitea.com/release-of-1.26.3-and-1.26.4/



## 漏洞详情

Gitea 支持反向代理认证:将其置于反向代理之后,代理设置 `X-WEBAUTH-USER`,Gitea 信任该头部作为用户名。只要只有你的代理能够设置它,这就是可行的。用于执行此限制的设置是 `REVERSE_PROXY_TRUSTED_PROXIES`,一个 IP 白名单。只有当请求的来源 IP 属于该白名单时,Gitea 才会认可该头部。

文档中安全的默认值(即 `app.example.ini` 中的值)是 `127.0.0.0/8,::1/128`:仅限回环地址,因此开箱即用仅信任本地代理。官方 Docker 镜像并未使用此默认值。它的 `app.ini` 模板硬编码了 `*`(`docker/root/etc/templates/app.ini:55`,以及 `docker/rootless/etc/templates/app.ini:52` 用于无根镜像)。`*` 匹配所有来源 IP,因此白名单检查无效。启用反向代理登录后,任何能访问该端口的人都可以发送该头部,而不仅仅是你的代理。如果开启了自动注册,账户会立即创建。发送管理员的用户名,你就成为了管理员。

因此,代码本身没有错误,问题出在打包的默认配置上,而且仅针对 Docker 镜像。遵循 `app.example.ini` 的二进制或自建安装会保留回环默认值,不受影响。

## 尝试运行

需要 Docker 和 Python 3(仅标准库,无需安装额外包)。

root@kitploit:~
    
    
    docker compose up -d          # 启动存在漏洞的 gitea/gitea:1.26.2
    # 等待约 30-60 秒完成首次启动设置,然后:
    python3 poc.py                # 随机新受害者,展示自动注册
    python3 poc.py http://localhost:3000 admin   # 冒充指定用户名
    docker compose down -v        # 清理环境
    

针对打包镜像的运行效果:

root@kitploit:~
    
    
    1) 不带头部访问 /user/settings        -> HTTP 303   (重定向到登录页面 = 未认证)
    2) 带 X-WEBAUTH-USER 头部访问 /user/settings -> HTTP 200
       以 'pocadmin' 登录 - 无需密码、令牌,任意来源 IP
    3) /pocadmin 用户资料页面                -> HTTP 200   (账户即时创建)
    

该绕过方式作用于 Web 会话,而非位于 `/api/v1/...` 的令牌 API,后者忽略该头部。

## 检测你自己的实例

`detect.py` 发送一次无害探测,并与正常请求进行对比。它不会修改任何内容。

root@kitploit:~
    
    
    python3 detect.py https://gitea.example.com
    

它会输出 VULNERABLE(存在漏洞)、looks-safe(看起来安全)或 inconclusive(结论不明)。仅在你拥有或有权测试的实例上运行。

## 修复

升级到 1.26.3 / 1.26.4 或更高版本。反向代理认证现在为可选启用,镜像不再附带通配符设置。如果你暂时无法升级,请将 `REVERSE_PROXY_TRUSTED_PROXIES` 设置为你代理的实际 IP 或 CIDR(绝不要使用 `*`),或者如果你不使用该功能,请关闭 `ENABLE_REVERSE_PROXY_AUTHENTICATION`。

## 时间线

  * 2026-05-26:私下报告给 Gitea。
  * 2026-07-03:CVE-2026-20896 发布,致谢 rz1027。
  * 在 Gitea 1.26.3 / 1.26.4 中修复。



## 致谢

我于 2026-05-26 发现此漏洞并向 Gitea 报告。我是 Gitea 安全公告(GHSA-f75j-4cw6-rmx4)中提到的报告者。

部分报道将此漏洞归功于 Exploitarium 仓库而非本人。这是错误的,并且与那个仓库发布的内容无关。此后我已联系多篇博客进行了更正;仍有少数几篇存在错误。

采用 MIT 许可证。详见 LICENSE。