
PoC Go locale che dimostra CVE-2026-72815, una vulnerabilità di spoofing IP tramite X-Forwarded-For nel middleware RealIP di go-chi/chi che aggira le ACL basate su IP, con un confronto con la versione corretta v5.3.0.
middleware.RealIP IP Spoofing PoCQuesto repository è un Proof of Concept (PoC) locale per la vulnerabilità di IP spoofing CVE-2026-72815 (GHSA-3fxj-6jh8-hvhx) presente in middleware.RealIP di go-chi/chi.
Il middleware RealIP vulnerabile si fida incondizionatamente del primo valore (più a sinistra) di X-Forwarded-For e sovrascrive http.Request.RemoteAddr con quel valore. In configurazioni in cui il client può specificare X-Forwarded-For, un attaccante potrebbe falsificare un indirizzo IP arbitrario come sorgente, aggirando o inquinando ACL basate su IP, rate limit, log di audit, ecc.
Questo PoC utilizza esclusivamente e non effettua comunicazioni verso host esterni.
httptestUtilizzare esclusivamente per scopi educativi e per verifiche di sicurezza autorizzate. Non utilizzare senza autorizzazione su ambienti di terze parti.
github.com/go-chi/chi/v5middleware.RealIP>= 5.2.1, < 5.3.05.3.0middleware.RealIP, quando X-Forwarded-For è presente, prende il primo valore separato da virgola e lo imposta in RemoteAddr.
Concettualmente il processo è il seguente.
if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
ip, _, _ = strings.Cut(xff, ",")
}
r.RemoteAddr = ip
Normalmente un reverse proxy aggiunge l'IP sorgente reale in coda all'X-Forwarded-For esistente. Pertanto, se un attaccante può specificare in anticipo un valore come il seguente, il valore più a sinistra non è affidabile.
X-Forwarded-For: 127.0.0.1, 203.0.113.50
Il RealIP vulnerabile adotta 127.0.0.1 come IP del client.
cd vulnerable
GOWORK=off go run .
Il PoC presuppone che il client reale sia 203.0.113.50 e che l'IP consentito come amministratore sia 127.0.0.1.
Una richiesta normale restituisce HTTP 403, ma una richiesta con il seguente header fa sì che RealIP riscriva RemoteAddr in 127.0.0.1, restituendo HTTP 200.
X-Forwarded-For: 127.0.0.1, 203.0.113.50
Output principale atteso:
=== 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 .
In v5.3.0 sono state aggiunte, come alternative a RealIP, le funzioni ClientIPFromHeader, ClientIPFromXFF, ClientIPFromXFFTrustedProxies e ClientIPFromRemoteAddr.
Il caso fixed di questo PoC presuppone una configurazione in cui "esiste un singolo proxy fidato immediatamente davanti al server, e tale proxy aggiunge l'IP reale del client in coda all'XFF", e utilizza ClientIPFromXFF(). Anche inviando lo stesso header falsificato, viene adottato il valore più a destra 203.0.113.50, quindi non è possibile aggirare l'ACL.
Output principale atteso:
=== 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
Anche in v5.3.0, per retrocompatibilità, il comportamento del vecchio middleware.RealIP stesso rimane invariato. A RealIP è stata aggiunta un'annotazione di deprecazione, e viene raccomandata la migrazione verso le API sicure ClientIPFrom*.
Pertanto, non è sufficiente aggiornare semplicemente la dipendenza a v5.3.0 continuando a usare middleware.RealIP; è necessario migrare verso il middleware ClientIPFrom* adatto alla configurazione di rete / reverse proxy effettiva.
Questo repository verifica esclusivamente quanto segue.
middleware.RealIP rifletta in RemoteAddr il valore XFF più a sinistra controllato dall'attaccanteClientIPFromXFF() di v5.3.0 con una configurazione proxy appropriata sia possibile rifiutare lo stesso inputNon vengono eseguite scansioni su reti reali, richieste verso servizi di terze parti, DoS, persistenza o simili.
middleware.RealIP verso il middleware ClientIPFrom* adatto all'infrastruttura effettiva