{"id":"GHSA-9g5q-2w5x-hmxf","summary":"chi Middleware Vulnerable to Potential IP Spoofing via `X-Forwarded-For` Header in `Request.RemoteAddr` Resolution","details":"### Summary\nThe vulnerability allows the `Request.RemoteAddr` to be spoofed when determining the request source IP via the `X-Forwarded-For` header. This could result in misidentification of the request source and potentially compromise access control and logging integrity.\n\n### Details\nCurrently, the `RealIP()` implementation splits the `X-Forwarded-For` header by `,` and uses the first IP.\nhttps://github.com/go-chi/chi/blob/v5.1.0/middleware/realip.go#L50-L54\n\nHowever, relying on the first IP in the `X-Forwarded-For` header is insecure because it can be manipulated by attackers to falsify the source IP.\n\nMalicious Case:\n1. A malicious client sends a request with a forged IP in the X-Forwarded-For header: `X-Forwarded-For: \u003cforged-ip\u003e`\n2. The proxy appends the actual client’s IP and forwards the request: `X-Forwarded-For: \u003cforged-ip\u003e,\u003cclient-ip\u003e`\n3. If the server always uses the first IP, it becomes vulnerable to IP spoofing.\n\nIdeally, the implementation should verify IPs starting from the end of the `X-Forwarded-For` header value, skipping trusted IPs within the system, and using the first untrusted IP as the actual client IP.\n\nFor example, the `labstack/echo` web framework processes the `X-Forwarded-For` header by checking IPs from the end, skipping trusted IPs, and using the first untrusted IP as the client's ip.\nhttps://github.com/labstack/echo/blob/v4.13.2/ip.go#L261-L273\n\n### PoC\n#### 1. Run the Go application with the following code:\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"log\"\n    \"net/http\"\n\n    \"github.com/go-chi/chi/v5/middleware\"\n)\n\nfunc main() {\n    // Set handler to print the remote address\n    handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {\n        fmt.Fprintln(\n            w,\n            fmt.Sprintf(\"remote addr: %s (want 192.0.2.1)\", r.RemoteAddr),\n        )\n    })\n    // Use RealIP middleware\n    log.Fatal(http.ListenAndServe(\":8080\", middleware.RealIP(handler)))\n}\n```\n#### 2. Send a request to the server using curl with a manipulated X-Forwarded-For header:\n```\n$ curl localhost:8080 -H 'X-Forwarded-For: 192.0.2.2, 192.0.2.1'\nremote addr: 192.0.2.2 (want 192.0.2.1)\n```\n\n### Impact\nThis vulnerability can lead to a request source IP spoofing issue, which may allow attackers to bypass access controls or falsify request logs. It primarily affects systems that rely on X-Forwarded-For to determine the actual client IP, particularly in scenarios where intermediary proxies or load balancers are involved.","aliases":["CVE-2026-72817","GO-2026-5775"],"modified":"2026-08-15T04:24:45.406800564Z","published":"2026-06-25T18:18:56Z","database_specific":{"severity":"HIGH","github_reviewed":true,"github_reviewed_at":"2026-06-25T18:18:56Z","nvd_published_at":null,"cwe_ids":["CWE-346"]},"references":[{"type":"WEB","url":"https://github.com/go-chi/chi/security/advisories/GHSA-9g5q-2w5x-hmxf"},{"type":"PACKAGE","url":"https://github.com/go-chi/chi"},{"type":"WEB","url":"https://github.com/go-chi/chi/releases/tag/v5.3.0"}],"affected":[{"package":{"name":"github.com/go-chi/chi/middleware","ecosystem":"Go","purl":"pkg:golang/github.com/go-chi/chi/middleware"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0.9.0"},{"last_affected":"1.5.5"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-9g5q-2w5x-hmxf/GHSA-9g5q-2w5x-hmxf.json"}},{"package":{"name":"github.com/go-chi/chi/v2/middleware","ecosystem":"Go","purl":"pkg:golang/github.com/go-chi/chi/v2/middleware"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"last_affected":"2.1.1"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-9g5q-2w5x-hmxf/GHSA-9g5q-2w5x-hmxf.json"}},{"package":{"name":"github.com/go-chi/chi/v3/middleware","ecosystem":"Go","purl":"pkg:golang/github.com/go-chi/chi/v3/middleware"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"last_affected":"3.3.5"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-9g5q-2w5x-hmxf/GHSA-9g5q-2w5x-hmxf.json"}},{"package":{"name":"github.com/go-chi/chi/v4/middleware","ecosystem":"Go","purl":"pkg:golang/github.com/go-chi/chi/v4/middleware"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"last_affected":"4.1.3"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-9g5q-2w5x-hmxf/GHSA-9g5q-2w5x-hmxf.json"}},{"package":{"name":"github.com/go-chi/chi/v5/middleware","ecosystem":"Go","purl":"pkg:golang/github.com/go-chi/chi/v5/middleware"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0"},{"fixed":"5.3.0"}]}],"database_specific":{"source":"https://github.com/github/advisory-database/blob/main/advisories/github-reviewed/2026/06/GHSA-9g5q-2w5x-hmxf/GHSA-9g5q-2w5x-hmxf.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V4","score":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/E:P"}]}