
PoC local em Go que demonstra o CVE-2026-72815, uma falha de spoofing de IP via X-Forwarded-For no middleware RealIP do go-chi/chi que contorna ACLs baseadas em IP, com uma comparação corrigida na v5.3.0.
middleware.RealIP do go-chi/chiEste repositório é uma Prova de Conceito (PoC) local da vulnerabilidade de IP spoofing CVE-2026-72815 (GHSA-3fxj-6jh8-hvhx) presente no middleware.RealIP do go-chi/chi.
O middleware RealIP vulnerável confia incondicionalmente no primeiro valor (mais à esquerda) do X-Forwarded-For e sobrescreve o http.Request.RemoteAddr com esse valor. Em configurações onde o cliente pode especificar o X-Forwarded-For, um atacante pode falsificar um endereço IP de origem arbitrário, potencialmente contornando ou contaminando ACLs baseadas em IP, rate limits, logs de auditoria, etc.
Esta PoC utiliza apenas e não realiza comunicação com hosts externos.
httptestUse apenas para fins educacionais e para testes de segurança autorizados. Não use sem autorização contra ambientes de terceiros.
github.com/go-chi/chi/v5middleware.RealIP>= 5.2.1, < 5.3.05.3.0O middleware.RealIP, quando o X-Forwarded-For está presente, obtém o primeiro valor separado por vírgula e o define em RemoteAddr.
Conceitualmente, o processamento é o seguinte.
if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
ip, _, _ = strings.Cut(xff, ",")
}
r.RemoteAddr = ip
Normalmente, um reverse proxy adiciona o IP de origem real ao final do X-Forwarded-For existente. Portanto, se um atacante puder especificar previamente um valor como o seguinte, o valor mais à esquerda não é confiável.
X-Forwarded-For: 127.0.0.1, 203.0.113.50
O RealIP vulnerável adota 127.0.0.1 como o IP do cliente.
cd vulnerable
GOWORK=off go run .
A PoC assume que o cliente real é 203.0.113.50 e que o IP permitido como administrador é 127.0.0.1.
Uma requisição normal resulta em HTTP 403, mas uma requisição com o seguinte cabeçalho faz com que o RealIP reescreva o RemoteAddr para 127.0.0.1, resultando em HTTP 200.
X-Forwarded-For: 127.0.0.1, 203.0.113.50
Saída principal esperada:
=== 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 .
No v5.3.0, foram adicionados ClientIPFromHeader, ClientIPFromXFF, ClientIPFromXFFTrustedProxies e ClientIPFromRemoteAddr como alternativas ao RealIP.
O caso corrigido desta PoC usa ClientIPFromXFF() assumindo uma configuração em que "há um proxy confiável imediatamente à frente do servidor, e esse proxy adiciona o IP real do cliente ao final do XFF". Mesmo enviando o mesmo cabeçalho falsificado, o valor mais à direita 203.0.113.50 é adotado, portanto a ACL não pode ser contornada.
Saída principal esperada:
=== 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
Mesmo no v5.3.0, o comportamento do antigo middleware.RealIP em si é mantido por compatibilidade retroativa. Uma nota de deprecated foi adicionada ao RealIP, e a migração para as APIs seguras ClientIPFrom* é recomendada.
Portanto, não basta simplesmente atualizar a dependência para o v5.3.0 e continuar usando o middleware.RealIP; é necessário migrar para o middleware ClientIPFrom* adequado à configuração real de rede / reverse proxy.
Este repositório verifica apenas o seguinte.
middleware.RealIP reflete o valor XFF mais à esquerda controlado pelo atacante no RemoteAddrClientIPFromXFF() do v5.3.0 com uma configuração de proxy adequada, a mesma entrada pode ser rejeitadaNão realiza varredura em redes reais, requisições a serviços de terceiros, DoS, persistência, etc.
middleware.RealIP para o middleware ClientIPFrom* adequado à infraestrutura real