CVE-2024-22189
High · 7.5CVSS
7.5
EPSS
1.1%
Published
Apr 4, 2024
CISA due date
—
Cloudanix analysis
Attackers can crash servers that use a popular Go library for fast internet connections by overwhelming them with special connection-management messages until they run out of memory.
- 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
Allows remote attacker to exhaust peer memory by flooding NEW_CONNECTION_ID frames that retire connection IDs while suppressing the expected RETIRE_CONNECTION_ID responses through congestion window collapse via selective ACKs and RTT manipulation.
Why it matters to the business
Denial of service against any service using vulnerable quic-go, causing outages for QUIC-based applications with no available workarounds until patched.
How an attack unfolds
Attacker establishes a QUIC connection then sends a large volume of NEW_CONNECTION_ID frames; by selectively acknowledging packets the attacker shrinks the receiver congestion window and skews RTT estimates so that the vast majority of required RETIRE_CONNECTION_ID responses are never sent, accumulating memory until the peer OOMs.
How to fix it
Upgrade quic-go to version 0.42.0 or later (commit 4a99b816ae3ab03ae5449d15aac45147c85ed47a). No workarounds exist.
How to confirm the fix worked
Verify deployed quic-go version is at least 0.42.0; monitor process memory usage under sustained NEW_CONNECTION_ID load after upgrade to confirm stability.
Typical attack path
- Establish QUIC connection to target
- Transmit large numbers of NEW_CONNECTION_ID frames retiring old connection IDs
- Selectively acknowledge received packets to collapse peer congestion window
- Manipulate observed RTT to further delay or suppress responses
- Continue frame flood until receiver memory exhaustion
How to detect it
Inspect QUIC connection logs or packet captures for abnormally high volumes of NEW_CONNECTION_ID frames without corresponding RETIRE_CONNECTION_ID responses; correlate with sudden memory growth in quic-go processes.
What your security team should do
- Immediately upgrade all quic-go deployments to 0.42.0 or newer
- Monitor memory consumption of QUIC services for anomalous growth
- Add rate limiting or connection ID retirement validation in front of unpatched instances if upgrade cannot be immediate
The record
quic-go is an implementation of the QUIC protocol in Go. Prior to version 0.42.0, an attacker can cause its peer to run out of memory sending a large number of `NEW_CONNECTION_ID` frames that retire old connection IDs. The receiver is supposed to respond to each retirement frame with a `RETIRE_CONNECTION_ID` frame. The attacker can prevent the receiver from sending out (the vast majority of) these `RETIRE_CONNECTION_ID` frames by collapsing the peers congestion window (by selectively acknowledging received packets) and by manipulating the peer's RTT estimate. Version 0.42.0 contains a patch for the issue. No known workarounds are available.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| Go | github.com/quic-go/quic-go | 0 | 0.42.0 |
| Chainguard | caddy | 0 | 2.7.6-r6 |
| Chainguard | caddy-fips | 0 | 2.7.6-r4 |
| Chainguard | caddy-man | 0 | 2.7.6-r6 |
| Chainguard | caddy-man | 0 | 2.7.6-r4 |
| Chainguard | caddy-src | 0 | 2.7.6-r6 |
| Chainguard | cloudflared | 0 | 2024.1.0-r7 |
| Chainguard | coredns | 0 | 1.11.1-r12 |
| Chainguard | coredns-compat | 0 | 1.11.1-r12 |
| Chainguard | coredns-fips | 0 | 1.12.0-r9 |
| Chainguard | eks-distro-coredns-1.9 | 0 | 1.9.3-r4 |
| Chainguard | go-ipfs-fips | 0 | 0.27.0-r3 |
| Chainguard | ipfs | 0 | 0.28.0-r0 |
| Chainguard | k3s | 0 | 1.29.3-r3 |
| Chainguard | k3s-embedded | 0 | 1.29.3-r3 |
| Chainguard | k3s-images | 0 | 1.29.3-r3 |
| Chainguard | k3s-multicall | 0 | 1.29.3-r3 |
| Chainguard | k3s-static | 0 | 1.29.3-r3 |
| Chainguard | kuma-coredns | 0 | 1.11.1-r12 |
| Chainguard | q | 0 | 0.19.2-r2 |
| Debian:11 | golang-github-lucas-clemente-quic-go | 0 | No fix |
| Debian:12 | golang-github-lucas-clemente-quic-go | 0 | No fix |
| Debian:13 | golang-github-lucas-clemente-quic-go | 0 | No fix |
| Red Hat:ansible_automation_platform:2.5::el8 | automation-controller-venv-tower | 0 | 0:4.6.2-1.el8ap |
| Red Hat:ansible_automation_platform:2.5::el8 | automation-gateway-server | 0 | 0:2.5.3-1.el8ap |
| Red Hat:ansible_automation_platform:2.5::el8 | receptor | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform:2.5::el8 | receptor-debuginfo | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform:2.5::el8 | receptor-debugsource | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform:2.5::el8 | receptorctl | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform:2.5::el9 | automation-controller-venv-tower | 0 | 0:4.6.2-1.el9ap |
| Red Hat:ansible_automation_platform:2.5::el9 | automation-gateway-server | 0 | 0:2.5.3-1.el9ap |
| Red Hat:ansible_automation_platform:2.5::el9 | receptor | 0 | 0:1.4.9-2.el9ap |
| Red Hat:ansible_automation_platform:2.5::el9 | receptor-debuginfo | 0 | 0:1.4.9-2.el9ap |
| Red Hat:ansible_automation_platform:2.5::el9 | receptor-debugsource | 0 | 0:1.4.9-2.el9ap |
| Red Hat:ansible_automation_platform:2.5::el9 | receptorctl | 0 | 0:1.4.9-2.el9ap |
| Red Hat:ansible_automation_platform_developer:2.5::el8 | automation-controller-venv-tower | 0 | 0:4.6.2-1.el8ap |
| Red Hat:ansible_automation_platform_developer:2.5::el8 | receptor | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform_developer:2.5::el8 | receptor-debuginfo | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform_developer:2.5::el8 | receptor-debugsource | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform_developer:2.5::el8 | receptorctl | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform_developer:2.5::el9 | automation-controller-venv-tower | 0 | 0:4.6.2-1.el9ap |
| Red Hat:ansible_automation_platform_developer:2.5::el9 | receptor | 0 | 0:1.4.9-2.el9ap |
| Red Hat:ansible_automation_platform_developer:2.5::el9 | receptor-debuginfo | 0 | 0:1.4.9-2.el9ap |
| Red Hat:ansible_automation_platform_developer:2.5::el9 | receptor-debugsource | 0 | 0:1.4.9-2.el9ap |
| Red Hat:ansible_automation_platform_developer:2.5::el9 | receptorctl | 0 | 0:1.4.9-2.el9ap |
| Red Hat:ansible_automation_platform_inside:2.5::el8 | receptor | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform_inside:2.5::el8 | receptor-debuginfo | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform_inside:2.5::el8 | receptor-debugsource | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform_inside:2.5::el8 | receptorctl | 0 | 0:1.4.9-2.el8ap |
| Red Hat:ansible_automation_platform_inside:2.5::el9 | receptor | 0 | 0:1.4.9-2.el9ap |
| Red Hat:ansible_automation_platform_inside:2.5::el9 | receptor-debuginfo | 0 | 0:1.4.9-2.el9ap |
| Red Hat:ansible_automation_platform_inside:2.5::el9 | receptor-debugsource | 0 | 0:1.4.9-2.el9ap |
| Red Hat:ansible_automation_platform_inside:2.5::el9 | receptorctl | 0 | 0:1.4.9-2.el9ap |
| SUSE:Package Hub 15 SP5 | caddy | 0 | 2.8.4-bp155.2.3.1 |
| SUSE:Package Hub 15 SP6 | caddy | 0 | 2.8.4-bp156.3.3.1 |
| SUSE:Package Hub 15 SP6 | coredns | 0 | 1.11.3-bp156.4.3.1 |
| Ubuntu:22.04:LTS | golang-github-lucas-clemente-quic-go | 0 | No fix |
| Ubuntu:24.04:LTS | golang-github-lucas-clemente-quic-go | 0 | 0.38.2-1 |
| Ubuntu:24.10 | golang-github-lucas-clemente-quic-go | 0 | 0.38.2-1 |
| Wolfi | caddy | 0 | 2.7.6-r6 |
| Wolfi | caddy-man | 0 | 2.7.6-r6 |
| Wolfi | caddy-src | 0 | 2.7.6-r6 |
| Wolfi | cloudflared | 0 | 2024.1.0-r7 |
| Wolfi | coredns | 0 | 1.11.1-r12 |
| Wolfi | coredns-compat | 0 | 1.11.1-r12 |
| Wolfi | ipfs | 0 | 0.28.0-r0 |
| Wolfi | k3s | 0 | 1.29.3-r3 |
| Wolfi | k3s-embedded | 0 | 1.29.3-r3 |
| Wolfi | k3s-images | 0 | 1.29.3-r3 |
| Wolfi | k3s-multicall | 0 | 1.29.3-r3 |
| Wolfi | k3s-static | 0 | 1.29.3-r3 |
| Wolfi | kuma-coredns | 0 | 1.11.1-r12 |
| Wolfi | q | 0 | 0.19.2-r2 |
| openSUSE:Leap 15.5 | caddy | 0 | 2.8.4-bp155.2.3.1 |
| openSUSE:Leap 15.6 | caddy | 0 | 2.8.4-bp156.3.3.1 |
| openSUSE:Leap 15.6 | coredns | 0 | 1.11.3-bp156.4.3.1 |
| openSUSE:Leap 16.0 | dnscrypt-proxy | 0 | 2.1.16-bp160.1.1 |
| openSUSE:Tumbleweed | caddy | 0 | 2.8.4-1.1 |
| openSUSE:Tumbleweed | coredns | 0 | 1.11.1-5.1 |
| openSUSE:Tumbleweed | kubo | 0 | 0.27.0-2.1 |
| openSUSE:Tumbleweed | syncthing | 0 | 1.27.6-1.1 |
Related vulnerabilities
- CVE-2025-64702 quic-go is an implementation of the QUIC protocol in Go. Also affects github.com/quic-go/quic-go
- CVE-2024-53259 quic-go is an implementation of the QUIC protocol in Go. Also affects github.com/quic-go/quic-go
- CVE-2026-34986 Go JOSE provides an implementation of the Javascript Object Signing and Encryption set of… Also affects caddy
- CVE-2026-33186 gRPC-Go is the Go language implementation of gRPC. Also affects caddy
- CVE-2026-30836 Step CA is an online certificate authority for secure, automated certificate management… Also affects caddy
- CVE-2026-27141 Due to missing nil check, sending 0x0a-0x0f HTTP/2 frames will cause a running server to… Also affects caddy
- CVE-2026-26958 filippo.io/edwards25519 is a Go library implementing the edwards25519 elliptic curve with… Also affects caddy
- CVE-2026-25793 Nebula is a scalable overlay networking tool. Also affects caddy