CVE-2023-22795
High · 7.5CVSS
7.5
EPSS
2.3%
Published
Feb 9, 2023
CISA due date
—
Cloudanix analysis
A flaw in affected web applications can let someone repeatedly send bad requests that slow down or knock the service offline.
- 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 vulnerability is a denial-of-service issue in Ruby on Rails, specifically in request-handling logic where specially crafted HTTP input can trigger excessive processing. A remote attacker may be able to send malformed or adversarial requests that cause application worker processes to consume disproportionate CPU time or become tied up, reducing service capacity. The flaw does not directly enable code execution, privilege escalation, or data theft, but it can degrade or interrupt availability of Rails-based applications and downstream packaged products that include vulnerable Rails components, including listed Cacti packages.
Why it matters to the business
Successful exploitation can make affected web applications slow, unstable, or unavailable, disrupting monitoring, dashboards, APIs, and business workflows that depend on them. For Cacti deployments, this may impair infrastructure monitoring visibility during an incident. The vulnerability is not currently listed in CISA KEV, is not marked as ransomware-used, and has a relatively low EPSS score, but it has been public since 2023, so remediation should be treated as standard hygiene for any internet-facing or critical Rails-based service.
How an attack unfolds
An attacker identifies an exposed application or packaged product using a vulnerable Rails version. They send crafted HTTP requests designed to hit the vulnerable Rails request-processing path. Instead of being handled quickly, the request causes expensive parsing or matching behavior, tying up application workers or consuming CPU. By repeating these requests or sending them concurrently, the attacker can exhaust available web/application server capacity. Users may then experience high latency, failed requests, timeouts, or intermittent service outages. Because this is a denial-of-service condition, exploitation may leave limited application-layer artifacts beyond unusual request patterns and resource exhaustion symptoms.
How to fix it
Upgrade affected packages to fixed versions or later. For Debian Cacti packages, update to cacti 1.1.27+ds1-3 or later on Debian 11, 12, and 13. For Ubuntu 18.04 LTS Cacti packages, update to cacti 1.1.38+ds1-1 or later. For Rails source deployments, ensure the Rails codebase includes the upstream fix at commit c443466a99f8ed951605fb4993a01de5e41349a4 or use a Rails release that incorporates that fix. If immediate patching is not possible, reduce exposure by placing affected applications behind a reverse proxy or WAF with request-size, header-size, URL-length, and rate limits; enforce per-client throttling; tune application server worker limits and request timeouts; and restrict administrative or monitoring interfaces to trusted networks where feasible.
How to confirm the fix worked
Confirm the installed package or dependency version is at or above the fixed version. On Debian or Ubuntu systems, use package inventory tools such as dpkg-query or apt policy to verify the installed Cacti version. For Rails applications, inspect the Gemfile.lock, package manifest, or source revision to confirm the Rails version or commit includes the upstream fix. Validate that web and application servers enforce sane request limits and timeouts. After patching, monitor that application workers no longer show abnormal CPU spikes or request backlog when exposed to malformed or oversized HTTP requests in a controlled test environment.
Typical attack path
- Discover an internet-facing Rails-based application or affected packaged product such as Cacti.
- Fingerprint the application stack or infer Rails usage from headers, routes, errors, assets, or package metadata.
- Send specially crafted HTTP requests that exercise the vulnerable Rails request-processing code path.
- Increase request volume or concurrency to consume application workers, CPU, or web server queues.
- Sustain the traffic until legitimate users experience slow responses, 5xx errors, timeouts, or service unavailability.
How to detect it
Look for signs of attempted or successful denial of service rather than a single definitive exploit string. Useful sources include reverse proxy logs, web server access and error logs, Rails production logs, application server logs, load balancer telemetry, WAF events, host CPU metrics, process monitoring, and APM traces. Investigate time windows with sudden CPU saturation, increased request latency, application worker exhaustion, request queue growth, and spikes in HTTP 408, 429, 499, 500, 502, 503, or 504 responses. In HTTP logs, look for repeated requests from the same source or small source set with unusually long URLs, abnormal headers, malformed parameters, repeated parsing errors, or requests that take much longer than normal while returning errors or timeouts. For Cacti systems, correlate web access anomalies with gaps in polling, graph generation delays, or monitoring collection failures. Because exploitation may not leave a unique artifact, combine application logs with infrastructure metrics to identify whether availability degradation aligns with suspicious request bursts.
What your security team should do
- Inventory all Rails-based applications and affected Cacti deployments, prioritizing internet-facing and business-critical services.
- Patch Cacti and Rails components to the listed fixed versions or later during the next available maintenance window, sooner for externally exposed systems.
- Apply compensating controls at reverse proxies, load balancers, and WAFs: rate limiting, request timeout enforcement, maximum header size, maximum URL length, and per-client concurrency controls.
- Review historical web, reverse proxy, application, and infrastructure monitoring logs for unexplained CPU saturation, request timeouts, 502/503/504 responses, and repeated malformed requests.
- Ensure operational monitoring can alert on application worker exhaustion, queue depth, elevated 5xx rates, and abnormal request latency.
- Restrict access to monitoring tools such as Cacti to trusted networks or VPN paths where possible.
- Do not over-prioritize over actively exploited KEV vulnerabilities solely based on this CVE, but avoid leaving it unpatched because it has been publicly known for an extended period.
The record
A regular expression based DoS vulnerability in Action Dispatch <6.1.7.1 and <7.0.4.1 related to the If-None-Match header. A specially crafted HTTP If-None-Match header can cause the regular expression engine to enter a state of catastrophic backtracking, when on a version of Ruby below 3.2.0. 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 | 0 | 6.1.7.1 |
| RubyGems | actionpack | 4.0.0.beta1 | 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 | 7.0.0 | 7.0.4.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-22792 A regular expression based DoS vulnerability in Action Dispatch <6.0.6.1,< 6.1.7.1, and… 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