Possible Strong Parameters bypass in Parameters#each_key in Action Pack
Published: November 04, 2026
SECURITY IDENTIFIERS
- GHSA: GHSA-wm3x-v3qw-4jh3
- Vendor Advisory: https://github.com/rails/rails/security/advisories/GHSA-wm3x-v3qw-4jh3
GEM
FRAMEWORK
SEVERITY
CVSS v3.x: 7.5 (High)
PATCHED VERSIONS
~> 8.0.5, >= 8.0.5.2
>= 8.1.4.1
DESCRIPTION
Impact
ActionController::Parameters#each_key delegates to the internal
ActiveSupport::HashWithIndifferentAccess that holds the request parameters,
so when called with a block it returns that hash instead of the Parameters
instance. The hash does not respond to permitted?, so Active Model mass
assignment (new, assign_attributes, update) accepts it without raising
ActiveModel::ForbiddenAttributesError. An application that passes the return
value of each_key to mass assignment could allow a remote, unauthenticated
attacker to set attributes that the application does not permit, such as an
authorization flag.
This is an incomplete fix of
CVE-2020-8164, which made
each, each_pair and each_value return the Parameters instance but left
each_key delegated.
Details
The fixed releases define Parameters#each_key to yield each key and return
the Parameters instance when given a block, as each, each_pair and
each_value do, and to return an Enumerator without one. Code that used the
return value of each_key as a hash now receives the Parameters instance,
which mass assignment rejects unless it is permitted.
Affected applications
An application is affected if it passes the return value of
ActionController::Parameters#each_key, called with a block, to mass
assignment. Rails itself makes no such call.
Workarounds
Do not use the return value of each_key. Call it for its block only, and
pass the permitted Parameters instance to mass assignment.
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/commit/8ba746e0a786458c281060823f2ccc5c5f6312ac.patch
- 8.0: https://github.com/rails/rails/commit/2fc8838300133931e19eed3ea6cee76a7e83f19c.patch
Versions affected
- actionpack < 8.0.5.2
- actionpack >= 8.1, < 8.1.4.1
Credit
This issue was responsibly reported by HackerOne researcher smlee.
RELATED
- https://rubygems.org/gems/actionpack/versions/8.1.4.1
- https://github.com/rails/rails/releases/tag/v8.1.4.1
- https://rubygems.org/gems/actionpack/versions/8.0.5.2
- https://github.com/rails/rails/releases/tag/v8.0.5.2
- https://github.com/rails/rails/commit/8ba746e0a786458c281060823f2ccc5c5f6312ac
- https://github.com/rails/rails/commit/2fc8838300133931e19eed3ea6cee76a7e83f19c
- https://github.com/rails/rails/security/advisories/GHSA-wm3x-v3qw-4jh3
