
Lokaler Go-PoC, der CVE-2026-72815 demonstriert, eine X-Forwarded-For-IP-Spoofing-Schwachstelle in go-chi/chi middleware.RealIP, die IP-basierte ACLs umgeht, mit einem Vergleich zum Fix in v5.3.0.
middleware.RealIP IP-Spoofing-PoCDieses Repository ist ein lokaler Proof of Concept (PoC) für die IP-Spoofing-Schwachstelle CVE-2026-72815 (GHSA-3fxj-6jh8-hvhx) in middleware.RealIP von go-chi/chi.
Die verwundbare RealIP-Middleware vertraut bedingungslos dem ersten (linkesten) Wert von X-Forwarded-For und überschreibt damit http.Request.RemoteAddr. In Konfigurationen, in denen der Client X-Forwarded-For angeben kann, könnte ein Angreifer eine beliebige IP-Adresse als Quelle vortäuschen und so IP-basierte ACLs, Rate Limits, Audit-Logs usw. umgehen oder verfälschen.
Dieser PoC verwendet ausschließlich httptest und führt keine Kommunikation mit externen Hosts durch.
Verwenden Sie dies nur für Bildungszwecke und autorisierte Sicherheitsüberprüfungen. Verwenden Sie es nicht unbefugt gegen Umgebungen Dritter.
github.com/go-chi/chi/v5middleware.RealIP>= 5.2.1, < 5.3.05.3.0middleware.RealIP nimmt, wenn X-Forwarded-For vorhanden ist, den ersten durch Komma getrennten Wert und setzt ihn in RemoteAddr.
Konzeptionell handelt es sich um folgenden Vorgang:
if xff := r.Header.Get("X-Forwarded-For"); xff != "" {
ip, _, _ = strings.Cut(xff, ",")
}
r.RemoteAddr = ip
Normalerweise hängt ein Reverse Proxy die tatsächliche Quell-IP an das Ende des vorhandenen X-Forwarded-For an. Wenn ein Angreifer daher im Voraus einen Wert wie den folgenden angeben kann, ist der linkeste Wert nicht vertrauenswürdig.
X-Forwarded-For: 127.0.0.1, 203.0.113.50
Die verwundbare RealIP übernimmt 127.0.0.1 als Client-IP.
cd vulnerable
GOWORK=off go run .
Der PoC geht davon aus, dass der tatsächliche Client 203.0.113.50 ist und die als Administrator zugelassene IP 127.0.0.1 ist.
Eine normale Anfrage führt zu HTTP 403, aber bei einer Anfrage mit dem folgenden Header schreibt RealIP RemoteAddr in 127.0.0.1 um, und die Antwort wird HTTP 200.
X-Forwarded-For: 127.0.0.1, 203.0.113.50
Erwartete Hauptausgabe:
=== 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 wurden als Alternativen zu RealIP ClientIPFromHeader, ClientIPFromXFF, ClientIPFromXFFTrustedProxies und ClientIPFromRemoteAddr hinzugefügt.
Der fixed case dieses PoC verwendet ClientIPFromXFF() unter der Annahme einer Konfiguration, in der „sich direkt vor dem Server ein vertrauenswürdiger Proxy befindet und dieser Proxy die tatsächliche Client-IP an das Ende des XFF anhängt“. Selbst wenn derselbe Spoofing-Header gesendet wird, wird der rechte Wert 203.0.113.50 übernommen, sodass die ACL nicht durchbrochen werden kann.
Erwartete Hauptausgabe:
=== 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
Auch in v5.3.0 bleibt das Verhalten der alten middleware.RealIP selbst aus Gründen der Abwärtskompatibilität erhalten. RealIP wurde mit einem deprecated-Hinweis versehen, und die Migration zu den sicheren ClientIPFrom*-APIs wird empfohlen.
Daher sollte man nicht einfach nur die Dependency auf v5.3.0 aktualisieren und middleware.RealIP weiterverwenden, sondern zur ClientIPFrom*-Middleware migrieren, die zur tatsächlichen Netzwerk-/Reverse-Proxy-Konfiguration passt.
Dieses Repository überprüft ausschließlich Folgendes.
middleware.RealIP den vom Angreifer kontrollierten linkesten XFF-Wert in RemoteAddr übernimmtClientIPFromXFF() aus v5.3.0 in einer geeigneten Proxy-Konfiguration dieselbe Eingabe abgelehnt werden kannEs werden keine Scans gegen echte Netzwerke, Anfragen an Dienste Dritter, DoS, Persistenz usw. durchgeführt.
middleware.RealIP zur ClientIPFrom*-Middleware migrieren, die zur tatsächlichen Infrastruktur passt