CVE-2025-59830
High · 7.5Rack has an unsafe default in Rack::QueryParser allows params_limit bypass via semicolon-separated parameters
CVSS
7.5
EPSS
0.6%
Published
Sep 25, 2025
CISA due date
—
Cloudanix analysis
A flaw in a common Ruby web component can let someone overload a website by sending specially formatted requests with too many parameters.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Moderate
- Impact
- Denial Of Service
- Component
- Library
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Rack::QueryParser before version 2.2.18 incorrectly applies its params_limit only when counting query parameters separated with ampersands (&), even though the parser also treats semicolons (;) as valid parameter separators. A remote attacker can send an HTTP request containing a very large number of semicolon-delimited query or form parameters, bypassing the intended parameter-count guardrail. The primary impact is denial of service through excessive CPU, memory allocation, request parsing time, garbage collection pressure, or worker exhaustion in Rack-based Ruby applications and frameworks that rely on Rack request parsing.
Why it matters to the business
Successful exploitation can make affected web applications slow, unstable, or temporarily unavailable without requiring authentication. Public-facing Ruby/Rack services are the highest-risk exposure because attackers can trigger resource exhaustion with crafted HTTP requests. Although this issue is not listed in CISA KEV, is not known to be used in ransomware campaigns, and has low reported EPSS probability, the CVSS severity is high because exploitation can directly affect service availability.
How an attack unfolds
An attacker identifies an application or API endpoint backed by a vulnerable Rack version. Instead of sending a normal query string such as a=1&b=2, the attacker sends an oversized request with many parameters separated by semicolons, such as a1=x;a2=x;a3=x and so on. Because vulnerable Rack versions split on semicolons but enforce the configured params_limit only against ampersand-separated parameters, the request can cause the application to parse far more parameters than intended. Repeated requests can consume application worker capacity, increase memory and CPU usage, trigger slow responses or timeouts, and potentially cause process restarts or service unavailability.
How to fix it
Upgrade Rack to version 2.2.18 or later, or apply the upstream fix identified by commit 0f76d43c0d5624bd0d325df4f0a63f5e1faa7254 if tracking Rack directly from Git. Rebuild and redeploy applications that vendor or bundle Rack through Ruby gems, framework dependencies, container images, or platform buildpacks. If immediate upgrade is not possible, add compensating controls at the reverse proxy, load balancer, CDN, or WAF to limit maximum URL length, maximum query-string length, request body size, request rate, and the number of semicolon-delimited parameters. Consider rejecting or normalizing semicolon-separated query parameters unless they are explicitly required by the application.
How to confirm the fix worked
Confirm the running application resolves Rack to version 2.2.18 or later, for example by checking Gemfile.lock, bundle info rack, gem list rack, software composition analysis results, container SBOMs, or deployed artifact manifests. Validate that no deployed application image or runtime still contains Rack versions below 2.2.18. In a controlled test environment, send requests with more semicolon-delimited parameters than the configured params_limit and verify the request is rejected, limited, or handled without excessive resource consumption. Review edge controls to ensure maximum query-string length and request-rate policies are active and applied to public endpoints.
Typical attack path
- Discover a Ruby/Rack-backed web application or API endpoint exposed over HTTP or HTTPS.
- Send test requests with semicolon-delimited query parameters to confirm the application accepts semicolon separators.
- Craft requests containing an excessive number of semicolon-separated parameters that exceed the intended Rack params_limit.
- Send the oversized requests repeatedly or concurrently to increase request parsing cost.
- Cause elevated CPU, memory pressure, garbage collection overhead, request queueing, 5xx errors, timeouts, or worker exhaustion.
How to detect it
Look for evidence of resource-exhaustion attempts rather than code execution artifacts. Relevant sources include web server access logs, reverse proxy logs, CDN/WAF logs, application logs, APM traces, container or host metrics, process supervisor logs, and load balancer health-check events. Search for HTTP request URIs or query strings containing unusually many semicolon-separated key-value pairs, especially long URLs with repeated patterns like ;name=value. Correlate those requests with increased request duration, elevated CPU or memory, garbage collection spikes, application worker restarts, request timeouts, and bursts of 5xx or 429 responses. Because the vulnerability is in request parsing, successful exploitation may leave only HTTP access log evidence and operational symptoms; there are no expected dropped files, new processes, registry keys, or persistent host artifacts.
- ;
- \?.*=[^ ]*;[^ ]*=
- (;[^=;& ]+=){50,}
- (;[^=;& ]+=){100,}
- (;[^=;& ]+=){500,}
- HTTP request URI with more than 50 semicolon-delimited parameters
- HTTP request URI with more than 100 semicolon-delimited parameters
- HTTP request URI with query string length greater than 8192 bytes and repeated semicolons
- Rack::QueryParser
- params_limit
What your security team should do
- Inventory all Ruby applications, Rails/Sinatra/Rack services, containers, and build artifacts that include Rack versions below 2.2.18.
- Prioritize patching internet-facing services and high-traffic APIs first, then internal services that process untrusted HTTP requests.
- Upgrade Rack to 2.2.18 or later, or apply upstream commit 0f76d43c0d5624bd0d325df4f0a63f5e1faa7254 when using Git-sourced Rack.
- Deploy temporary WAF or reverse-proxy rules that reject unusually long query strings or requests containing very high counts of semicolon-separated parameters.
- Add monitoring for spikes in semicolon-heavy query strings, request parsing latency, 408/429/500/502/503/504 responses, memory usage, CPU usage, and application worker restarts.
- Review access logs for historical evidence of oversized semicolon-delimited requests, especially around periods of degraded availability.
The record
`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.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| RubyGems | rack | 0 | 2.2.18 |
| AlmaLinux:10 | cockpit-ha-cluster | 0 | 0.12.1-1.el10_1.1 |
| AlmaLinux:10 | pcs | 0 | 0.12.1-1.el10_1.1 |
| AlmaLinux:10 | pcs-snmp | 0 | 0.12.1-1.el10_1.1 |
| AlmaLinux:8 | pcs | 0 | 0.10.18-2.el8_10.7.alma.1 |
| AlmaLinux:8 | pcs-snmp | 0 | 0.10.18-2.el8_10.7.alma.1 |
| AlmaLinux:9 | pcs | 0 | 0.11.10-1.el9_7.1 |
| AlmaLinux:9 | pcs-snmp | 0 | 0.11.10-1.el9_7.1 |
| Chainguard | gitlab-rails-ce-18.1 | 0 | 18.1.6-r3 |
| Chainguard | gitlab-rails-ce-18.2 | 0 | 18.2.8-r3 |
| Chainguard | gitlab-rails-ce-18.3 | 0 | 18.3.6-r0 |
| Chainguard | gitlab-rails-ce-18.4 | 0 | 18.4.4-r0 |
| Chainguard | gitlab-rails-ce-assets-18.1 | 0 | 18.1.6-r1 |
| Chainguard | gitlab-rails-ce-assets-18.2 | 0 | 18.2.8-r1 |
| Chainguard | gitlab-rails-ce-assets-18.3 | 0 | 18.3.5-r0 |
| Chainguard | gitlab-rails-ce-assets-18.4 | 0 | 18.4.3-r0 |
| Chainguard | gitlab-rails-ce-assets-fips-18.1 | 0 | 18.1.6-r2 |
| Chainguard | gitlab-rails-ce-assets-fips-18.2 | 0 | 18.2.8-r2 |
| Chainguard | gitlab-rails-ce-assets-fips-18.3 | 0 | 18.3.5-r2 |
| Chainguard | gitlab-rails-ce-assets-fips-18.4 | 0 | 18.4.3-r3 |
| Chainguard | gitlab-rails-ce-doc-18.1 | 0 | 18.1.6-r1 |
| Chainguard | gitlab-rails-ce-doc-18.2 | 0 | 18.2.8-r1 |
| Chainguard | gitlab-rails-ce-doc-18.3 | 0 | 18.3.5-r0 |
| Chainguard | gitlab-rails-ce-doc-18.4 | 0 | 18.4.3-r0 |
| Chainguard | gitlab-rails-ce-doc-fips-18.1 | 0 | 18.1.6-r2 |
| Chainguard | gitlab-rails-ce-doc-fips-18.2 | 0 | 18.2.8-r2 |
| Chainguard | gitlab-rails-ce-doc-fips-18.3 | 0 | 18.3.5-r2 |
| Chainguard | gitlab-rails-ce-doc-fips-18.4 | 0 | 18.4.3-r3 |
| Chainguard | gitlab-rails-ce-fips-18.1 | 0 | 18.1.6-r4 |
| Chainguard | gitlab-rails-ce-fips-18.2 | 0 | 18.2.8-r4 |
| Chainguard | gitlab-rails-ce-fips-18.3 | 0 | 18.3.6-r0 |
| Chainguard | gitlab-rails-ce-fips-18.4 | 0 | 18.4.4-r0 |
| Chainguard | ruby3.3-rack-2.2 | 0 | 2.2.22-r0 |
| Mageia:9 | ruby-rack | 0 | 2.2.21-1.mga9 |
| Wolfi | ruby3.3-rack-2.2 | 0 | 2.2.22-r0 |
| openSUSE:Tumbleweed | rubygem-rack-2.2 | 0 | 2.2.18-1.1 |
| openSUSE:Tumbleweed | rubygem-rack-2.2 | 0 | 2.2.22-1.1 |
Related vulnerabilities
- CVE-2026-25500 Rack is a modular Ruby web server interface. Also affects rack
- CVE-2026-22860 Rack is a modular Ruby web server interface. Also affects rack
- CVE-2025-61919 Rack is vulnerable to a memory-exhaustion DoS through unbounded URL-encoded body parsing Also affects rack
- CVE-2025-61780 Rack has a Possible Information Disclosure Vulnerability Also affects rack
- CVE-2025-61770 Rack's unbounded multipart preamble buffering enables DoS (memory exhaustion) Also affects rack
- CVE-2025-61771 Rack: Multipart parser buffers large non‑file fields entirely in memory, enabling DoS… Also affects rack
- CVE-2025-61772 Rack's multipart parser buffers unbounded per-part headers, enabling DoS (memory… Also affects rack
- CVE-2025-46336 Rack::Session is a session management implementation for Rack. Also affects rack