{"id":"CVE-2026-126083","aliases":["GHSA-2gff-2mmg-m73p"],"title":"Action Pack: Possible IP spoofing in Action Dispatch RemoteIp","titleSource":"OSV","descriptionSource":"OSV","declaredSeverity":"HIGH","description":"### Impact\nSince Rails 8.1.0, `ActionDispatch::RemoteIp` derives `request.remote_ip` from `Rack::Request#forwarded_for`, which under Rack 3 reads the RFC 7239 `Forwarded` header in preference to `X-Forwarded-For`. When a reverse proxy appends the client address to `X-Forwarded-For` but passes a client-supplied `Forwarded` header through unchanged, `request.remote_ip` returns an address chosen by the client, and the IP spoofing check does not raise, because it compares only `Client-Ip` with the forwarded addresses. An unauthenticated attacker could therefore spoof `request.remote_ip`, possibly bypassing IP-based access controls and rate limits keyed on the client address (including the default `by:` of `rate_limit`), and falsifying the client address in logs.\n\n### Details\nThe 8.1.0 change ([2d084af8](https://github.com/rails/rails/commit/2d084af8444a7b6b868c7cbb256172007871e78d)) switched `ActionDispatch::RemoteIp` from reading `X-Forwarded-For` directly to Rack's `forwarded_for`, in order to reuse Rack's port handling. Rails continues to honor `Forwarded`, the standard header.\n\nIn the fixed releases, when `config.action_dispatch.ip_spoofing_check` is enabled (the default), `ActionDispatch::RemoteIp` also compares the first untrusted client address in `Forwarded` with the first untrusted client address in `X-Forwarded-For`, as exact strings, and raises `ActionDispatch::RemoteIp::IpSpoofAttackError` when both headers are present and the addresses differ. Deployments whose proxies report the client address inconsistently between the two headers will receive this error after upgrading. See the `actionpack` CHANGELOG.\n\n### Affected applications\nAn application is affected if it meets all of these requirements:\n- Runs Rails 8.1.0 through 8.1.4 with Rack 3. Under Rack 2.2, `forwarded_for` reads only `X-Forwarded-For`.\n- Is served behind a proxy that does not remove or overwrite a client-supplied `Forwarded` header.\n- Relies on `request.remote_ip` for access control, rate limiting, or auditing.\n\nThe fix detects a spoofed `Forwarded` header only when the proxy also sets `X-Forwarded-For`. An application whose proxy passes a client-supplied `Forwarded` header through and sets no `X-Forwarded-For` remains exposed after upgrading, and should configure the proxy to remove or overwrite `Forwarded`, or apply the workaround below.\n\n### Mitigation\n- Upgrade to a fixed version of `actionpack`.\n- Configure reverse proxies to remove or overwrite any client-supplied `Forwarded` header.\n\n### Workarounds\nApplications whose proxies set `X-Forwarded-For` can make Rack ignore the `Forwarded` header, restoring the client address resolution of Rails 8.0, by setting `Rack::Request.forwarded_priority = [:x_forwarded]` in an initializer. This setting is available in Rack 3.0.0 and later, and it also causes Rack to ignore `Forwarded` when determining the request scheme, host, and port.\n\n### Releases\nThe fixed releases are available at the normal locations.\n\nPatches for those who cannot upgrade at once:\n- 8.1: https://github.com/rails/rails/commit/2a01a5ac521184419d9a92fa2c25e102e68cd227.patch\n\n### Versions affected\n- actionpack >= 8.1, < 8.1.4.1\n\n### Credit\nThis issue was responsibly reported by HackerOne researcher [luryus](https://hackerone.com/luryus).","severity":"high","score":7.4,"published":"2026-11-10T21:09:33.682Z","modified":"2026-11-13T16:22:49.039Z","withdrawn":false,"knownExploited":false,"affected":[{"ecosystem":"RubyGems","name":"actionpack","sources":[{"name":"OSV · GHSA-2gff-2mmg-m73p","url":"https://osv.dev/vulnerability/GHSA-2gff-2mmg-m73p"}],"ranges":[{"events":[{"introduced":"8.1.0.beta1"},{"fixed":"8.1.4.1"}],"type":"ECOSYSTEM"}],"versions":["8.1.0","8.1.0.beta1","8.1.0.rc1","8.1.1","8.1.2","8.1.2.1","8.1.3","8.1.3.1","8.1.4"],"fixed":["8.1.4.1"]}],"sourceAffected":[],"references":["https://github.com/rails/rails/security/advisories/GHSA-2gff-2mmg-m73p","https://github.com/rails/rails/commit/2a01a5ac521184419d9a92fa2c25e102e68cd227","https://github.com/rails/rails","https://github.com/rails/rails/releases/tag/v8.1.4.1","https://github.com/rubysec/ruby-advisory-db/blob/master/gems/actionpack/GHSA-2gff-2mmg-m73p.yml"],"sources":[{"name":"OSV","id":"GHSA-2gff-2mmg-m73p","modified":"2026-11-10T21:30:04.269070700Z","url":"https://osv.dev/vulnerability/GHSA-2gff-2mmg-m73p"},{"name":"CVE","id":"CVE-2026-126083","modified":"2026-11-13T16:22:49.039Z","url":"https://www.cve.org/CVERecord?id=CVE-2026-126083"}],"assessments":[{"source":"OSV","vector":"CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","score":7.4},{"source":"GitHub_M","vector":"CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","score":7.4}],"cve":{"records":[{"id":"CVE-2026-126083","source":"GitHub_M","state":"PUBLISHED","reasons":[],"replacements":[],"disputed":false,"unsupportedWhenAssigned":false,"reserved":"2026-11-10T17:07:43.285Z","published":"2026-11-10T21:09:33.682Z","modified":"2026-11-13T16:22:49.039Z"}],"publishers":[{"name":"GitHub_M","role":"CNA","organizationId":"a0819718-46f1-4df5-94e2-005712e83aaa","modified":"2026-11-10T21:09:33.682Z"},{"name":"CISA-ADP","role":"ADP","organizationId":"134c704f-9b21-4f2e-91b3-4a467353bcc0","modified":"2026-11-13T16:22:49.039Z"}],"references":[{"url":"https://github.com/rails/rails/security/advisories/GHSA-2gff-2mmg-m73p","tags":["x_refsource_CONFIRM"],"source":"GitHub_M"},{"url":"https://github.com/rails/rails/commit/2a01a5ac521184419d9a92fa2c25e102e68cd227","tags":["x_refsource_MISC"],"source":"GitHub_M"},{"url":"https://github.com/rails/rails/releases/tag/v8.1.4.1","tags":["x_refsource_MISC"],"source":"GitHub_M"}],"weaknesses":[{"id":"CWE-348","description":"CWE-348: Use of Less Trusted Source","source":"GitHub_M"}],"applicability":[],"prioritization":[{"source":"CISA-ADP","type":"SSVC","role":"CISA Coordinator","timestamp":"2026-11-13T16:22:35.722742Z","decisions":[{"name":"Exploitation","value":"none"},{"name":"Automatable","value":"no"},{"name":"Technical Impact","value":"total"}]}]},"products":[{"vendor":"rails","name":"rails","platforms":[],"versions":[{"version":">= 8.1, < 8.1.4.1","status":"affected"}],"cpes":[],"source":"GitHub_M","url":"https://www.cve.org/CVERecord?id=CVE-2026-126083"}],"remediation":[],"observedAt":"2026-11-13T23:54:20.900Z","kev":{"status":"not-listed","checkedAt":"2026-11-15T03:10:34.932Z"},"coverage":[{"source":"NVD","status":"refresh-failed","attemptedAt":"2026-11-14T03:35:47.943Z"},{"source":"GHSA","status":"available","checkedAt":"2026-11-14T02:35:35.551Z","attemptedAt":"2026-11-14T02:35:35.551Z"},{"source":"EUVD","status":"available","checkedAt":"2026-11-14T02:30:34.415Z","attemptedAt":"2026-11-14T02:30:34.415Z"},{"source":"EPSS","status":"available","checkedAt":"2026-11-14T02:30:34.326Z","attemptedAt":"2026-11-14T02:30:34.326Z"}],"evidence":[{"source":"FIRST EPSS","id":"CVE-2026-126083","url":"https://www.first.org/epss/","probability":0.00357,"percentile":0.29914,"date":"2026-11-13","checkedAt":"2026-11-14T02:30:34.326Z"},{"source":"ENISA EUVD","id":"EUVD-2026-122936","url":"https://euvd.enisa.europa.eu/vulnerability/EUVD-2026-122936","modified":"Nov 13, 2026, 4:22:49 PM","score":7.4,"vector":"CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","checkedAt":"2026-11-14T02:30:34.415Z"},{"source":"GitHub Advisory Database","id":"GHSA-2gff-2mmg-m73p","url":"https://github.com/advisories/GHSA-2gff-2mmg-m73p","modified":"2026-11-10T21:20:07Z","score":7.4,"vector":"CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","checkedAt":"2026-11-14T02:35:35.551Z"}],"aiSummary":{"text":"Action Pack in Rails 8.1.0 through 8.1.4 is vulnerable to IP spoofing when a reverse proxy appends the client address to X-Forwarded-For but passes a client-supplied Forwarded header through unchanged. An unauthenticated attacker could spoof request.remote_ip, possibly bypassing IP-based access controls. The weakness is due to the use of a less trusted source.","model":"@cf/meta/llama-3.3-70b-instruct-fp8-fast","generatedAt":"2026-11-14T01:26:09.004Z","sources":[{"name":"OSV","url":"https://osv.dev/vulnerability/GHSA-2gff-2mmg-m73p"},{"name":"CVE","url":"https://www.cve.org/CVERecord?id=CVE-2026-126083"}]}}