middleware.RealIP IP 欺骗 PoC本仓库是 go-chi/chi 的 middleware.RealIP 中存在的 IP 欺骗漏洞 CVE-2026-72815(GHSA-3fxj-6jh8-hvhx)的本地概念验证(PoC)。
存在漏洞的 RealIP middleware 会无条件信任 X-Forwarded-For 的第一个(最左侧)值,并用该值覆盖 http.Request.RemoteAddr。在客户端可以指定 X-Forwarded-For 的配置中,攻击者可以将任意 IP 地址伪装为来源,从而可能绕过或污染基于 IP 的 ACL、rate limit、审计日志等。
本 PoC 仅使用 httptest,不进行与外部主机的通信。
仅限用于教育目的以及获得授权的安全验证。请勿未经许可用于第三方环境。
github.com/go-chi/chi/v5middleware.RealIP>= 5.2.1, < 5.3.05.3.0middleware.RealIP 在 X-Forwarded-For 存在时,会获取以逗号分隔的第一个值并设置到 RemoteAddr。
概念上相当于以下处理。
if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
ip, _, _ = strings.Cut(xff, ",")
}
r.RemoteAddr = ip
通常,reverse proxy 会将实际的来源 IP 追加到已有 X-Forwarded-For 的末尾。因此,如果攻击者能够预先指定如下值,则最左侧的值不可信。
X-Forwarded-For: 127.0.0.1, 203.0.113.50
存在漏洞的 RealIP 会将 127.0.0.1 作为客户端 IP 采用。
cd vulnerable
GOWORK=off go run .
PoC 假设实际客户端为 203.0.113.50,作为管理员被允许的 IP 为 127.0.0.1。
正常请求会返回 HTTP 403,但附加以下 header 的请求中,RealIP 会将 RemoteAddr 改写为 127.0.0.1,从而返回 HTTP 200。
X-Forwarded-For: 127.0.0.1, 203.0.113.50
预期的主要输出:
=== CVE-2026-72815 vulnerable case ===
[*] go-chi/chi version: v5.2.1
[*] normal request status: 403
[*] spoofed request status: 200
[!] VULNERABLE: attacker-controlled X-Forwarded-For bypassed the IP ACL.
cd fixed
GOWORK=off go run .
v5.3.0 中新增了 ClientIPFromHeader、ClientIPFromXFF、ClientIPFromXFFTrustedProxies、ClientIPFromRemoteAddr 作为 RealIP 的替代。
本 PoC 的 fixed case 假设“服务器正前方有 1 台受信任 proxy,该 proxy 将实际客户端 IP 追加到 XFF 末尾”的配置,并使用 ClientIPFromXFF()。即使发送相同的伪造 header,也会采用最右侧的 203.0.113.50,因此无法突破 ACL。
预期的主要输出:
=== CVE-2026-72815 safe replacement case ===
[*] go-chi/chi version: v5.3.0
[*] normal request status: 403
[*] spoofed request status: 403
[+] SAFE: the spoofed leftmost X-Forwarded-For value did not bypass the IP ACL.
bash scripts/run-version-matrix.sh
在 v5.3.0 中,出于向后兼容性,旧 middleware.RealIP 的行为本身仍然保留。RealIP 被添加了 deprecated 注释,并推荐迁移到安全的 ClientIPFrom* API。
因此,不应仅仅将 dependency 更新到 v5.3.0 后继续使用 middleware.RealIP,而是需要迁移到符合实际 network / reverse proxy 配置的 ClientIPFrom* middleware。
本仓库仅验证以下内容。
middleware.RealIP 会将攻击者控制的最左侧 XFF 值反映到 RemoteAddrClientIPFromXFF() 时,能够拒绝相同的输入不进行对实际网络的扫描、对第三方服务的请求、DoS、持久化等操作。
middleware.RealIP 迁移到符合实际基础设施的 ClientIPFrom* middleware