
CVE-2026-72815을 시연하는 로컬 Go PoC로, go-chi/chi 미들웨어 RealIP의 X-Forwarded-For IP 스푸핑 취약점으로 IP 기반 ACL을 우회하며, v5.3.0 수정 버전과 비교합니다.
middleware.RealIP IP 스푸핑 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만을 사용하며, 외부 호스트와의 통신을 수행하지 않습니다.
교육 목적 및 허가된 보안 검증에만 사용하십시오. 제3자의 환경에 대해 무단으로 사용하지 마십시오.
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 구성에서 사용하면 동일한 입력을 거부할 수 있는 것실제 네트워크에 대한 스캔, 제3자 서비스에 대한 요청, DoS, 지속화 등은 수행하지 않습니다.
middleware.RealIP에서 실제 인프라에 맞는 ClientIPFrom* middleware로 이행한다