M8seven/cve-2026-22874-gitea-ssrf-allowlist

GitHub: M8seven/cve-2026-22874-gitea-ssrf-allowlist

该仓库是关于 Gitea webhook 和迁移功能中 SSRF allow-list 不完整缺陷(CVE-2026-22874)的技术分析报告,详细说明了漏洞根因、被遗漏的危险地址范围及修复方案。

Stars: 0 | Forks: 0

# CVE-2026-22874 — Gitea webhook 和迁移 allow-list 中不完整的 SSRF 防护 关于 **CVE-2026-22874** (GHSA-2r5c-gw76-rh3w) 的技术分析报告与参考资料:Gitea 的 webhook 推送和仓库迁移中存在不完整的 SSRF allow-list,该问题已在 **Gitea 1.26.3** 中修复。 我独立向 Gitea 维护者报告了此类 SSRF 漏洞,并在发布的安全公告中被列为贡献者 (`other`);该公告的主要报告者是 J. Leitschuh。本仓库是一篇关于该公开安全公告的防御性、教育性分析报告——该问题现已被修复。 - 安全公告:https://github.com/go-gitea/gitea/security/advisories/GHSA-2r5c-gw76-rh3w - 严重程度:Critical,CVSS 9.6 (`CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:N`) - 受影响版本:Gitea `<= 1.26.2` — 修复版本:`1.26.3` - 漏洞类型:CWE-918 (Server-Side Request Forgery) ## 摘要 Gitea 默认的 SSRF allow-list (`MatchBuiltinExternal`,被同时用于 webhook 推送和仓库迁移) 依赖于 Go 标准库中的 `net.IP.IsPrivate()`,该函数仅能识别 RFC 1918 (`10/8`, `172.16/12`, `192.168/16`) 和 RFC 4193 (`fc00::/7`)。一些常用于云元数据服务、内部网络以及 IPv6 过渡机制的地址范围在该定义下并不属于“私有”地址,因此会通过“外部”过滤器,使得已通过身份验证的用户可以让服务器向这些目标发起 HTTP 请求。 由于 webhook 推送会记录响应状态、标头以及最多约 1 MiB 的响应体,并将其呈现在 webhook 历史 UI 中,因此该 SSRF **并非盲打 (not blind)**:攻击者可以读取目标内部服务返回的内容。 ## 被 `net.IP.IsPrivate()` 遗漏的地址范围 | 范围 | 含义 | |---|---| | `100.64.0.0/10` | RFC 6598 运营商级 NAT | | `168.63.129.16/32` | Azure WireServer / 实例元数据 endpoint | | `64:ff9b::/96` | RFC 6052 NAT64 (可以嵌入 `169.254.169.254`,例如 AWS IMDS) | | `2001::/32` | RFC 4380 Teredo | | `2002::/16` | RFC 3056 6to4 | 上述地址的 IPv4 映射 IPv6 形式同样会受到此类影响。 因此,拥有创建或修改 webhook(或发起迁移)权限的已通过身份验证的用户,可以访问云元数据 endpoint —— 例如通过 NAT64 映射访问 AWS IMDS,或访问位于 `168.63.129.16` 的 Azure WireServer —— 以及纯内部服务,然后通过 webhook 历史视图读取响应内容。 ## 根本原因 默认策略是 Gitea `HostMatchList` 检查中的 `MatchBuiltinExternal`,它将所有全局单播且非 `IsPrivate()` 的地址均视为允许访问: ``` case MatchBuiltinExternal: if ip.IsGlobalUnicast() && !ip.IsPrivate() { return true } ``` `net.IP.IsPrivate()` 不能作为“外部”的安全边界:它没有将运营商级 NAT、云元数据 endpoint,或者可以路由到内部或元数据目标的 IPv6 过渡范围考虑在内。 ## 修复方案 该问题已在 **Gitea 1.26.3** 中修复,方法是通过扩展内置过滤器来阻止上述额外的地址范围。运维人员应升级至 1.26.3 或更高版本。作为纵深防御措施: - 通过 allow-list / block-list 设置限制出站 webhook 和迁移目标; - 在 Gitea 主机周围应用网络出站控制; - 在云实例上,禁用 IMDSv1 并强制要求使用 IMDSv2(或服务商提供的等效机制)。 ## 参考资料 - GHSA-2r5c-gw76-rh3w — https://github.com/go-gitea/gitea/security/advisories/GHSA-2r5c-gw76-rh3w - CVE-2026-22874 - CWE-918: Server-Side Request Forgery (SSRF)
标签:CISA项目, SSRF, StruQ, 安全文档, 日志审计, 漏洞分析, 路径探测, 防御加固