
Local Go PoC demonstrating CVE-2026-72815, an X-Forwarded-For IP spoofing flaw in go-chi/chi middleware.RealIP that bypasses IP-based ACLs, with a v5.3.0 fixed comparison.
middleware.RealIP IP Spoofing PoCこのリポジトリは、go-chi/chi の middleware.RealIP に存在する IP spoofing 脆弱性 CVE-2026-72815(GHSA-3fxj-6jh8-hvhx)のローカル Proof of Concept (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 は既存の X-Forwarded-For の末尾へ実際の送信元 IP を追加します。そのため攻撃者が次のような値を事前に指定できる場合、左端は信頼できません。
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 になりますが、次のヘッダーを付けたリクエストでは 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 では RealIP の代替として ClientIPFromHeader、ClientIPFromXFF、ClientIPFromXFFTrustedProxies、ClientIPFromRemoteAddr が追加されています。
この PoC の fixed case は「サーバーの直前に信頼済み proxy が1台あり、その proxy が実クライアント IP を XFF の末尾に追加する」構成を想定して ClientIPFromXFF() を使用します。同じ偽装ヘッダーを送っても右端の 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 値を RemoteAddr に反映することClientIPFromXFF() を適切な proxy 構成で使用すると同じ入力を拒否できること実ネットワークへのスキャン、第三者サービスへのリクエスト、DoS、永続化などは行いません。
middleware.RealIP から、実際のインフラに合った ClientIPFrom* middleware へ移行する