MEDIUMCVSS v3.1 4.8Vulnerability

CVE-2026-126073

### Impact Action Pack negotiates the format of a rendered response from the `Accept`, `X-Requested-With` and, for XHR requests without `Accept`, `Content-Type` request headers, but `ActionController::Rendering#_set_vary_header` adds `Vary: Accept` only when the request carries a usable `Accept` header and the response has no `Vary` header yet. A response to a request without `Accept`, or to an XHR request, therefore omits the headers that selected its representation, and a response whose `Vary` the application set before rendering (for example `Vary: Accept-Language`) never gains `Accept`. A shared cache that honours `Vary` could store such a response and serve it to later clients that request a different representation, possibly leading to cache poisoning in which visitors receive, until the entry expires, a page without its layout or HTML in place of JSON. The attacker cannot choose the content of the response. Applications that render negotiated responses from actions marked `public` (for example with `expires_in ..., public: true`) behind a shared cache that honours `Vary`, such as Thruster or `Rack::Cache`, are affected. ### Details In the fixed releases, a rendered response whose format is not given by the URL lists `Accept` and `X-Requested-With` in `Vary`, and also `Content-Type` for an XHR request without `Accept`; when `config.action_dispatch.ignore_accept_header` is enabled, it lists only `X-Requested-With`. These fields are appended to an existing `Vary` value rather than skipped, and `Vary: *` is left unchanged. Shared caches can store more variants of such responses than before. See the Action Pack CHANGELOG for details. ### Workarounds Set `Vary: Accept, X-Requested-With` on negotiated responses in the application, for example in an `after_action`, or do not mark negotiated responses `public`. ### Releases The fixed releases are available at the normal locations. Patches for those who cannot upgrade at once: - 8.1: https://github.com/rails/rails

Properties

Severity
medium
Summary
Action Pack: Possible cache poisoning in Action Pack content negotiation
Nvd fetched at
2026-11-10T23:33:48.924589+00:00
Cvss severity
MEDIUM
Cvss score
4.8
Retrieved at
2026-11-10T23:34:27+00:00
Ghsa published
2026-11-10T21:26:12Z
Source url
https://github.com/advisories/GHSA-r9jg-fmfx-2gv6
Ghsa updated
2026-11-10T21:26:13Z
Ghsa id
GHSA-r9jg-fmfx-2gv6
Last source
GitHub Advisory Database
Score
4.8
Cvss version
3.1
Cve id
CVE-2026-126073
Cvss vector
CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L
First seen by Signal
2026-11-10T23:31:41+00:00
Is ghsa only
false
Vector
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L
Published at
2026-11-10T21:19:25.563
Last modified
2026-11-10T21:19:25.563

Related Entities (3)

AFFECTS (1)

→[Software]rubygems/actionpack

HAS_WEAKNESS (1)

VULNERABLE_TO (1)

←[Software]rubygems/actionpack

Related research

Explore deeper with Ninja Signal's threat intelligence graph

CVE-2026-126073 (CVSS v3.1 4.8) — Ninja Signal Threat Intelligence | Ninja Signal