CVE-2023-22799
High · 7.5CVSS
7.5
EPSS
1.0%
Published
Feb 9, 2023
CISA due date
—
Cloudanix analysis
A flaw in a Rails support library can let someone slow down or temporarily disrupt an application by sending specially crafted input.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Library
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
CVE-2023-22799 is a denial-of-service vulnerability in the Rails GlobalID component. A crafted GlobalID value can trigger inefficient parsing behavior, causing excessive CPU consumption and request processing latency. The issue does not imply code execution or data disclosure by itself, but it can make application workers, background jobs, or APIs that parse untrusted GlobalID strings slow or unavailable.
Why it matters to the business
Applications that accept or process attacker-controlled GlobalID values may experience degraded performance, worker exhaustion, failed requests, delayed background processing, or temporary service outages. The vulnerability is not listed in CISA KEV, is not known to be used in ransomware campaigns, has low EPSS probability, and has no reported mature public exploitation in the provided data; however, it has been public for a long time, so affected dependencies should still be remediated as part of normal vulnerability management.
How an attack unfolds
An attacker first identifies an application endpoint, API parameter, serialized job payload, signed message, or other input path that is passed into GlobalID parsing or lookup functionality. The attacker then submits specially crafted GlobalID-formatted input designed to exercise the vulnerable parsing behavior. If the application processes the value synchronously, request workers may spend excessive time handling the input, increasing CPU usage and response time. Repeated submissions can amplify the effect, potentially exhausting web or job-processing capacity and causing a denial of service. The supplied threat-actor field references HTTP/2 Rapid Reset, but that is a separate denial-of-service technique and is not specific evidence of exploitation of this GlobalID issue.
How to fix it
Upgrade rails/globalid to a version that includes the upstream fix. The provided fixed artifact is rails/globalid commit 574b99fb9a23a9c637e44c0970616dd32b68e93f; use a released package version that contains this commit, or vendor the patched commit only as a temporary measure if a packaged release is not available. Rebuild and redeploy applications after dependency updates, and refresh lockfiles so all runtime and build environments use the patched dependency. As compensating controls, validate and bound the length of user-supplied GlobalID-like strings, reject malformed GlobalID input before parsing, apply request rate limits, set conservative web and job worker timeouts, and monitor CPU saturation and queue depth.
How to confirm the fix worked
Confirm dependency inventory and lockfiles no longer resolve rails/globalid to a vulnerable revision and that the installed source contains commit 574b99fb9a23a9c637e44c0970616dd32b68e93f or a later equivalent release. In Ruby environments, review Gemfile.lock, bundle info globalid, and deployed container or artifact manifests. Exercise application paths that parse GlobalID values with valid and malformed inputs and verify they return promptly without excessive CPU usage. Confirm CI dependency scanning, software composition analysis, and runtime package inventories all report the patched GlobalID version or commit.
Typical attack path
- Identify a Rails application or service using the vulnerable rails/globalid component.
- Find an externally reachable input that is interpreted as a GlobalID value or passed into GlobalID lookup/parsing logic.
- Send a malformed or adversarial GlobalID string that triggers expensive parsing behavior.
- Repeat requests or submit many payloads concurrently to consume CPU and worker capacity.
- Cause request timeouts, queue growth, elevated error rates, or temporary service unavailability.
How to detect it
Look for signs of denial-of-service activity against endpoints or jobs that process GlobalID values. Useful sources include application logs, web access logs, reverse proxy logs, APM traces, job processor logs, container metrics, host CPU telemetry, and exception reporting systems. Investigate bursts of requests containing unusually long or malformed strings beginning with GlobalID-style prefixes, repeated 408/429/499/500/502/503/504 responses, request timeout exceptions, worker restarts, queue backlogs, and sustained CPU saturation without corresponding normal traffic growth. In Rails logs and exception trackers, search for GlobalID parsing or lookup errors, unusually slow controller actions around parameters containing gid:// values, and repeated failures from the same source IPs, user agents, API clients, or unauthenticated sessions. Because exploitation primarily causes resource exhaustion, absence of a unique payload string does not rule out attempted exploitation; correlate malformed GlobalID input with timing, CPU, and error-rate anomalies.
- gid://
- GlobalID::Locator.locate
- GlobalID::URI
- GlobalID::Identification
- GlobalID::Verifier
- Invalid GlobalID
- URI::InvalidURIError
- Rack::Timeout::RequestTimeoutException
- Net::ReadTimeout
- ActionController::BadRequest
- Completed 500
- Completed 503
- Completed 504
- worker timeout
- request timeout
- execution expired
What your security team should do
- Inventory applications and services that depend on rails/globalid, including transitive Rails dependencies and background job processors.
- Prioritize remediation for internet-facing endpoints, APIs, webhook handlers, and job ingestion paths that accept untrusted GlobalID-like input.
- Upgrade to a GlobalID release containing commit 574b99fb9a23a9c637e44c0970616dd32b68e93f and redeploy all affected workloads.
- Add input validation and length limits for fields expected to contain GlobalID values.
- Review web, application, and job-processing logs for unexplained CPU spikes, request timeouts, or repeated malformed GlobalID parsing errors.
- Ensure rate limiting, request timeouts, worker recycling, and autoscaling thresholds are appropriate for denial-of-service resilience.
- Track this as routine but necessary remediation: EPSS is low, it is not KEV-listed, and no mature exploitation was provided, but the issue is old and should not remain in production dependencies.
The record
A ReDoS based DoS vulnerability in the GlobalID <1.0.1 which could allow an attacker supplying a carefully crafted input can cause the regular expression engine to take an unexpected amount of time. All users running an affected release should either upgrade or use one of the workarounds immediately.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| RubyGems | globalid | 0.2.1 | 1.0.1 |
| Debian:11 | ruby-globalid | 0 | No fix |
| Debian:12 | ruby-globalid | 0 | 0.6.0-2 |
| Debian:13 | ruby-globalid | 0 | 0.6.0-2 |
| 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-globalid | 0 | 0.4.1-150000.3.3.1 |
| SUSE:Linux Enterprise High Availability Extension 15 SP2 | rubygem-globalid | 0 | 0.4.1-150000.3.3.1 |
| SUSE:Linux Enterprise High Availability Extension 15 SP3 | rubygem-globalid | 0 | 0.4.1-150000.3.3.1 |
| SUSE:Linux Enterprise High Availability Extension 15 SP4 | rubygem-globalid | 0 | 0.4.1-150000.3.3.1 |
| Ubuntu:16.04:LTS | ruby-globalid | 0 | No fix |
| Ubuntu:18.04:LTS | ruby-globalid | 0 | No fix |
| Ubuntu:20.04:LTS | ruby-globalid | 0 | No fix |
| Ubuntu:22.04:LTS | ruby-globalid | 0 | No fix |
| Ubuntu:24.04:LTS | ruby-globalid | 0 | No fix |
| Ubuntu:24.10 | ruby-globalid | 0 | No fix |
| Ubuntu:25.04 | ruby-globalid | 0 | No fix |
| Ubuntu:25.10 | ruby-globalid | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | ruby-globalid | 0 | No fix |
| Ubuntu:Pro:18.04:LTS | ruby-globalid | 0 | No fix |
| Ubuntu:Pro:20.04:LTS | ruby-globalid | 0 | No fix |
| gem | globalid | 0.2.1 | 1.0.1 |
| openSUSE:Leap 15.4 | rubygem-globalid | 0 | 0.4.1-150000.3.3.1 |
| openSUSE:Tumbleweed | ruby3.2-rubygem-globalid | 0 | 1.1.0-1.3 |
| openSUSE:Tumbleweed | rubygem-globalid | 0 | 1.1.0-1.1 |
| openSUSE:Tumbleweed | rubygem-globalid | 0 | 1.2.1-1.5 |
| openSUSE:Tumbleweed | rubygem-globalid | 0 | 1.2.1-1.7 |
| openSUSE:Tumbleweed | rubygem-globalid | 0 | 1.2.1-1.9 |
Related vulnerabilities
- CVE-2023-28362 The redirect_to method in Rails allows provided values to contain characters which are… Also affects foreman
- CVE-2024-8376 In Eclipse Mosquitto up to version 2.0.18a, an attacker can achieve memory leaking… Also affects foreman
- CVE-2023-27539 Possible Denial of Service Vulnerability in Rack’s header parsing Also affects foreman
- CVE-2023-27530 A DoS vulnerability exists in Rack <v3.0.4.2, <v2.2.6.3, <v2.1.4.3 and <v2.0.9.3 within… Also affects foreman
- CVE-2022-44566 A denial of service vulnerability present in ActiveRecord's PostgreSQL adapter <7.0.4.1… Also affects foreman
- CVE-2023-22795 A regular expression based DoS vulnerability in Action Dispatch <6.1.7.1 and <7.0.4.1… Also affects foreman
- CVE-2023-22796 A regular expression based DoS vulnerability in Active Support <6.1.7.1 and <7.0.4.1. Also affects foreman
- CVE-2023-22792 A regular expression based DoS vulnerability in Action Dispatch <6.0.6.1,< 6.1.7.1, and… Also affects foreman