Rack::QueryParser in version < 2.2.18 enforces its params_limit only for parameters separated by &, while still splitting on both & and ;. As a result, attackers could use ; separators to bypass the parameter count limit and submit more parameters than intended.
The issue arises because Rack::QueryParser#check_query_string counts only & characters when determining the number of parameters, but the default separator regex DEFAULT_SEP = /[&;] */n splits on both & and ;. This mismatch means that queries using ; separators were not included in the parameter count, allowing params_limit to be bypassed.
Other safeguards (bytesize_limit and key_space_limit) still applied, but did not prevent this particular bypass.
Applications or middleware that directly invoke Rack::QueryParser with its default configuration (no explicit delimiter) could be exposed to increased CPU and memory consumption. This can be abused as a limited denial-of-service vector.
Rack::Request, the primary entry point for typical Rack applications, uses QueryParser in a safe way and does not appear vulnerable by default. As such, the severity is considered low, with the impact limited to edge cases where QueryParser is used directly.
& and ; are counted consistently toward params_limit.QueryParser with an explicit delimiter (e.g., &) to avoid the mismatch.{
"cwe_ids": [
"CWE-400",
"CWE-770"
],
"github_reviewed": true,
"nvd_published_at": "2025-09-25T15:16:13Z",
"severity": "HIGH",
"github_reviewed_at": "2025-09-25T16:39:27Z"
}