CVE-2023-22792
High · 7.5CVSS
7.5
EPSS
1.7%
Published
Feb 9, 2023
CISA due date
—
Cloudanix analysis
A flaw in some Rails-based web applications can let someone knock the service offline by sending specially crafted web requests.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Web Framework
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
This is a denial-of-service weakness in Ruby on Rails, most likely in request-processing logic within Action Dispatch where attacker-controlled HTTP metadata can trigger expensive parsing behavior. A crafted request, commonly involving complex or malformed content negotiation headers such as Accept or related MIME-type values, can cause excessive CPU consumption or request-processing stalls. The flaw does not directly provide code execution, authentication bypass, or data disclosure, but it can reduce application availability when vulnerable Rails code is reachable over HTTP.
Why it matters to the business
Successful exploitation can make Rails-backed web applications slow, unstable, or unavailable, disrupting customer-facing services, APIs, internal portals, and background workflows that depend on those applications. The EPSS score is low and the issue is not listed in CISA KEV, with no mature public exploitation indicated, so broad commodity exploitation is not currently strongly signaled; however, because Rails applications are often internet-facing, even low-complexity denial-of-service conditions should be addressed during normal vulnerability remediation cycles.
How an attack unfolds
An attacker identifies an application running a vulnerable Rails version or commit range and sends specially crafted HTTP requests to routes handled by Rails. The requests do not need to reach a sensitive controller action if the vulnerable parsing occurs early in the request lifecycle. By manipulating HTTP headers or request metadata that Rails parses for MIME/content negotiation, the attacker causes Rails to spend disproportionate CPU time processing a small request. Repeating this across concurrent connections can exhaust application worker capacity, increase latency, trigger timeouts, and cause upstream load balancers or reverse proxies to return 5xx errors. There is no indication from the provided data that this issue is being used by named threat actors or ransomware campaigns.
How to fix it
Upgrade Rails to a release or source revision that contains the fix. For source-based deployments of rails/rails, ensure the code includes commit c443466a99f8ed951605fb4993a01de5e41349a4 or a later trusted upstream revision. For gem-based deployments, upgrade the Rails components provided by the vendor or Rails project to versions that include this fix, and rebuild/redeploy application containers or packages so the patched code is actually running. If immediate upgrade is not possible, reduce exposure by placing the application behind a reverse proxy or WAF that limits header size and rejects malformed or excessively complex Accept and Content-Type headers, enforce request-rate limits, cap per-client concurrency, configure application request timeouts, and ensure enough worker isolation exists so expensive requests cannot starve all traffic.
How to confirm the fix worked
Confirm the application dependency inventory shows patched Rails code, not only an updated lockfile. For source deployments, verify the deployed rails/rails revision includes c443466a99f8ed951605fb4993a01de5e41349a4 or a later commit. For packaged deployments, verify the resolved Rails gem versions are vendor-confirmed fixed versions and that running containers, servers, or build artifacts were restarted after upgrade. Perform safe negative testing in a non-production environment by sending malformed or oversized content negotiation headers and confirming requests are rejected quickly or processed without abnormal CPU spikes. Review reverse proxy and application timeout settings to ensure malformed requests are bounded.
Typical attack path
- Discover a Rails-backed HTTP service through fingerprinting, error behavior, headers, or public application behavior.
- Send test requests with unusual, malformed, or deeply structured Accept, Content-Type, or similar request headers.
- Observe whether response latency, worker CPU usage, or application error rates increase disproportionately.
- Automate repeated crafted requests across one or more connections.
- Consume Rails application worker threads/processes or CPU resources.
- Cause degraded service, request timeouts, or application unavailability for legitimate users.
How to detect it
Review web server, reverse proxy, load balancer, WAF, and Rails application logs for periods of elevated latency, CPU saturation, worker exhaustion, or bursts of request timeouts correlated with unusual HTTP request headers. Focus on repeated requests containing malformed, very long, or highly repetitive Accept, Content-Type, or MIME-related header values, especially when they come from a small number of source IPs and produce 400-series parsing errors, 408 timeouts, 429 rate-limit responses, or upstream 502/503/504 errors. In Rails logs, look for ActionDispatch, MIME negotiation, bad request, invalid type, parser, timeout, or request timeout exceptions occurring in bursts. In infrastructure telemetry, correlate application worker CPU spikes with low request volume but high per-request processing time, which is typical of algorithmic complexity denial-of-service rather than normal traffic growth. Because this issue is a DoS condition, durable host artifacts may be limited; evidence is most likely in HTTP access logs, WAF events, APM traces, process CPU history, and application exception logs.
- ActionDispatch::Http::MimeNegotiation
- ActionController::BadRequest
- InvalidType
- Invalid MIME type
- HTTP_ACCEPT
- Accept:
- Content-Type:
- Rack::Timeout
- Rack::Timeout::RequestTimeoutException
- Request timeout
- upstream timed out
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
What your security team should do
- Inventory internet-facing and high-availability applications using Ruby on Rails and prioritize those running unpatched source revisions or older Rails packages.
- Upgrade Rails to a fixed release or to a revision containing c443466a99f8ed951605fb4993a01de5e41349a4, then redeploy all affected application instances.
- Add WAF or reverse-proxy controls for maximum HTTP header size, malformed Accept headers, malformed Content-Type headers, request rate, and per-client concurrency.
- Monitor application CPU saturation, request latency, worker exhaustion, and spikes in 408, 429, 499, 500, 502, 503, and 504 responses.
- Search historical logs for bursts of malformed content negotiation headers or repeated slow requests from the same source networks.
- Treat exploitation likelihood as moderate-to-low based on the provided EPSS, no KEV listing, and no mature exploit signal, but remediate proactively for exposed production services.
The record
A regular expression based DoS vulnerability in Action Dispatch <6.0.6.1,< 6.1.7.1, and <7.0.4.1. Specially crafted cookies, in combination with a specially crafted X_FORWARDED_HOST header can cause the regular expression engine to enter a state of catastrophic backtracking. This can cause the process to use large amounts of CPU and memory, leading to a possible DoS vulnerability All users running an affected release should either upgrade or use one of the workarounds immediately.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| RubyGems | actionpack | 3.0.0 | 5.2.8.15 |
| RubyGems | actionpack | 6.0.0 | 6.1.7.1 |
| RubyGems | actionpack | 7.0.0 | 7.0.4.1 |
| Debian:11 | rails | 0 | 2:6.0.3.7+dfsg-2+deb11u1 |
| Debian:12 | rails | 0 | 2:6.1.7.3+dfsg-1 |
| Debian:13 | rails | 0 | 2:6.1.7.3+dfsg-1 |
| Red Hat:satellite:6.14::el8 | foreman | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-cli | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-debug | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-dynflow-sidekiq | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-ec2 | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-journald | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-libvirt | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-openstack | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-ovirt | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-postgresql | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-redis | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-service | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-telemetry | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | foreman-vmware | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite:6.14::el8 | puppet-agent | 0 | 0:7.26.0-3.el8sat |
| Red Hat:satellite:6.14::el8 | puppetserver | 0 | 0:7.11.0-1.el8sat |
| Red Hat:satellite:6.14::el8 | python-django | 0 | 0:3.2.21-1.el8pc |
| Red Hat:satellite:6.14::el8 | python-future | 0 | 0:0.18.3-1.el8pc |
| Red Hat:satellite:6.14::el8 | python-gitpython | 0 | 0:3.1.32-1.el8pc |
| Red Hat:satellite:6.14::el8 | python-pulp-ansible | 0 | 1:0.16.0-1.el8pc |
| Red Hat:satellite:6.14::el8 | python-requests | 0 | 0:2.31.0-1.el8pc |
| Red Hat:satellite:6.14::el8 | python-sqlparse | 0 | 0:0.4.4-1.el8pc |
| Red Hat:satellite:6.14::el8 | python39-django | 0 | 0:3.2.21-1.el8pc |
| Red Hat:satellite:6.14::el8 | python39-future | 0 | 0:0.18.3-1.el8pc |
| Red Hat:satellite:6.14::el8 | python39-gitpython | 0 | 0:3.1.32-1.el8pc |
| Red Hat:satellite:6.14::el8 | python39-pulp-ansible | 0 | 1:0.16.0-1.el8pc |
| Red Hat:satellite:6.14::el8 | python39-requests | 0 | 0:2.31.0-1.el8pc |
| Red Hat:satellite:6.14::el8 | python39-sqlparse | 0 | 0:0.4.4-1.el8pc |
| Red Hat:satellite:6.14::el8 | rubygem-actionpack | 0 | 0:6.1.7.3-1.el8sat |
| Red Hat:satellite:6.14::el8 | rubygem-activerecord | 0 | 0:6.1.7.3-1.el8sat |
| Red Hat:satellite:6.14::el8 | rubygem-activesupport | 0 | 0:6.1.7.3-1.el8sat |
| Red Hat:satellite:6.14::el8 | rubygem-git | 0 | 0:1.18.0-1.el8sat |
| Red Hat:satellite:6.14::el8 | rubygem-globalid | 0 | 0:1.1.0-1.el8sat |
| Red Hat:satellite:6.14::el8 | rubygem-kubeclient | 0 | 0:4.10.1-1.el8sat |
| Red Hat:satellite:6.14::el8 | rubygem-rack | 0 | 0:2.2.7-1.el8sat |
| Red Hat:satellite:6.14::el8 | yggdrasil-worker-forwarder | 0 | 0:0.0.3-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-cli | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-debug | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-dynflow-sidekiq | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-ec2 | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-journald | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-libvirt | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-openstack | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-ovirt | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-postgresql | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-redis | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-service | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-telemetry | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | foreman-vmware | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | puppet-agent | 0 | 0:7.26.0-3.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | puppetserver | 0 | 0:7.11.0-1.el8sat |
| Red Hat:satellite_capsule:6.14::el8 | python-django | 0 | 0:3.2.21-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | python-future | 0 | 0:0.18.3-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | python-gitpython | 0 | 0:3.1.32-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | python-pulp-ansible | 0 | 1:0.16.0-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | python-requests | 0 | 0:2.31.0-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | python-sqlparse | 0 | 0:0.4.4-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | python39-django | 0 | 0:3.2.21-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | python39-future | 0 | 0:0.18.3-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | python39-gitpython | 0 | 0:3.1.32-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | python39-pulp-ansible | 0 | 1:0.16.0-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | python39-requests | 0 | 0:2.31.0-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | python39-sqlparse | 0 | 0:0.4.4-1.el8pc |
| Red Hat:satellite_capsule:6.14::el8 | rubygem-rack | 0 | 0:2.2.7-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-cli | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-debug | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-dynflow-sidekiq | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-ec2 | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-journald | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-libvirt | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-openstack | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-ovirt | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-postgresql | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-redis | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-service | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-telemetry | 0 | 0:3.7.0.9-1.el8sat |
| Red Hat:satellite_utils:6.14::el8 | foreman-vmware | 0 | 0:3.7.0.9-1.el8sat |
| SUSE:Linux Enterprise High Availability Extension 15 SP1 | rubygem-actionpack-5_1 | 0 | 5.1.4-150000.3.15.1 |
| SUSE:Linux Enterprise High Availability Extension 15 SP2 | rubygem-actionpack-5_1 | 0 | 5.1.4-150000.3.15.1 |
| SUSE:Linux Enterprise High Availability Extension 15 SP3 | rubygem-actionpack-5_1 | 0 | 5.1.4-150000.3.15.1 |
| SUSE:Linux Enterprise High Availability Extension 15 SP4 | rubygem-actionpack-5_1 | 0 | 5.1.4-150000.3.15.1 |
| SUSE:OpenStack Cloud Crowbar 8 | rubygem-actionpack-4_2 | 0 | 4.2.9-7.15.1 |
| SUSE:OpenStack Cloud Crowbar 9 | rubygem-actionpack-4_2 | 0 | 4.2.9-7.15.1 |
| Ubuntu:20.04:LTS | rails | 0 | No fix |
| Ubuntu:22.04:LTS | rails | 0 | No fix |
| Ubuntu:24.04:LTS | rails | 0 | No fix |
| Ubuntu:24.10 | rails | 0 | No fix |
| Ubuntu:25.04 | rails | 0 | No fix |
| Ubuntu:25.10 | rails | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | rails | 0 | No fix |
| Ubuntu:Pro:18.04:LTS | rails | 0 | No fix |
| Ubuntu:Pro:20.04:LTS | rails | 0 | No fix |
| Ubuntu:Pro:22.04:LTS | rails | 0 | No fix |
| gem | actionpack | 3.0.0 | 6.1.7.1 |
| gem | rails | 3.0.0 | 6.0.6.1 |
| gem | rails | 6.1.0 | 6.1.7.1 |
| gem | rails | 7.0.0 | 7.0.4.1 |
| openSUSE:Leap 15.4 | rubygem-actionpack-5_1 | 0 | 5.1.4-150000.3.15.1 |
| openSUSE:Tumbleweed | rubygem-actionpack-7.0 | 0 | 7.0.4.1-1.1 |
| openSUSE:Tumbleweed | rubygem-actionpack-7.0 | 0 | 7.0.8.4-1.1 |
| openSUSE:Tumbleweed | rubygem-actionpack-7.0 | 0 | 7.0.8.6-1.3 |
Related vulnerabilities
- CVE-2023-28362 The redirect_to method in Rails allows provided values to contain characters which are… Also affects actionpack
- CVE-2024-54133 Action Pack is a framework for handling and responding to web requests. Also affects actionpack
- CVE-2024-47887 Action Pack is a framework for handling and responding to web requests. Also affects actionpack
- CVE-2024-41128 Action Pack is a framework for handling and responding to web requests. Also affects actionpack
- CVE-2023-22795 A regular expression based DoS vulnerability in Action Dispatch <6.1.7.1 and <7.0.4.1… Also affects actionpack
- CVE-2022-22577 An XSS Vulnerability in Action Pack >= 5.2.0 and < 5.2.0 that could allow an attacker to… Also affects actionpack
- CVE-2020-8166 A CSRF forgery vulnerability exists in rails < 5.2.5, rails < 6.0.4 that makes it… Also affects actionpack
- CVE-2016-2098 Action Pack in Ruby on Rails before 3.2.22.2, 4.x before 4.1.14.2, and 4.2.x before… Also affects actionpack