
PoC local en Go que demuestra CVE-2026-72815, una vulnerabilidad de suplantación de IP mediante X-Forwarded-For en el middleware RealIP de go-chi/chi que elude las ACL basadas en IP, con una comparación corregida en la v5.3.0.
middleware.RealIP IP Spoofing PoCEste repositorio es una Prueba de Concepto (PoC) local de la vulnerabilidad de IP spoofing CVE-2026-72815 (GHSA-3fxj-6jh8-hvhx) que existe en middleware.RealIP de go-chi/chi.
El middleware RealIP vulnerable confía incondicionalmente en el primer valor (el más a la izquierda) de X-Forwarded-For y sobrescribe http.Request.RemoteAddr con ese valor. En configuraciones donde el cliente puede especificar X-Forwarded-For, un atacante podría falsificar cualquier dirección IP como origen, eludiendo o contaminando ACLs basadas en IP, rate limits, registros de auditoría, etc.
Esta PoC utiliza únicamente httptest y no realiza comunicaciones hacia hosts externos.
Utilícese únicamente con fines educativos y para verificaciones de seguridad autorizadas. No la utilice sin autorización contra entornos de terceros.
github.com/go-chi/chi/v5middleware.RealIP>= 5.2.1, < 5.3.05.3.0middleware.RealIP, cuando existe X-Forwarded-For, obtiene el primer valor separado por comas y lo establece en RemoteAddr.
Conceptualmente, el procesamiento es el siguiente.
if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
ip, _, _ = strings.Cut(xff, ",")
}
r.RemoteAddr = ip
Normalmente, un reverse proxy añade la IP de origen real al final del X-Forwarded-For existente. Por lo tanto, si un atacante puede especificar previamente un valor como el siguiente, el extremo izquierdo no es confiable.
X-Forwarded-For: 127.0.0.1, 203.0.113.50
El RealIP vulnerable adopta 127.0.0.1 como la IP del cliente.
cd vulnerable
GOWORK=off go run .
La PoC asume que el cliente real es 203.0.113.50 y que la IP permitida como administrador es 127.0.0.1.
Una petición normal resulta en HTTP 403, pero en una petición con la siguiente cabecera, RealIP reescribe RemoteAddr a 127.0.0.1, resultando en HTTP 200.
X-Forwarded-For: 127.0.0.1, 203.0.113.50
Salida 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 .
En v5.3.0 se han añadido ClientIPFromHeader, ClientIPFromXFF, ClientIPFromXFFTrustedProxies y ClientIPFromRemoteAddr como alternativas a RealIP.
El caso fixed de esta PoC utiliza ClientIPFromXFF() asumiendo una configuración en la que "hay un proxy de confianza justo delante del servidor, y ese proxy añade la IP real del cliente al final del XFF". Incluso enviando la misma cabecera falsificada, se adopta el 203.0.113.50 del extremo derecho, por lo que no se puede superar la ACL.
Salida 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
Incluso en v5.3.0, el comportamiento del antiguo middleware.RealIP en sí mismo se mantiene por compatibilidad hacia atrás. Se ha añadido una anotación de deprecated a RealIP, y se recomienda migrar a las APIs seguras ClientIPFrom*.
Por lo tanto, no basta con simplemente actualizar la dependencia a v5.3.0 y seguir usando middleware.RealIP; es necesario migrar al middleware ClientIPFrom* que se ajuste a la configuración real de red / reverse proxy.
Este repositorio verifica únicamente lo siguiente.
middleware.RealIP refleja el valor XFF del extremo izquierdo controlado por el atacante en RemoteAddrClientIPFromXFF() de v5.3.0 con una configuración de proxy adecuada, se puede rechazar la misma entradaNo se realizan escaneos a redes reales, peticiones a servicios de terceros, DoS, persistencia, etc.
middleware.RealIP al middleware ClientIPFrom* que se ajuste a la infraestructura real