CVE-2024-8508
NoneCVSS
—
EPSS
0.8%
Published
Oct 3, 2024
CISA due date
—
Cloudanix analysis
A bug in widely used DNS software can let attackers slow it down or make it stop answering requests by sending specially crafted data, potentially taking down network services that rely on it.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Network Service
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Unbounded CPU consumption during name compression of very large RRsets in downstream DNS replies, allowing a single malicious upstream response to lock the resolver thread until packet processing completes.
Why it matters to the business
DNS resolution service becomes unavailable or severely degraded under sustained attack, disrupting all dependent applications, authentication, and network connectivity until the resolver is restarted or the attack stops.
How an attack unfolds
An attacker first creates or compromises a DNS zone containing records with extremely large RRsets, then issues queries through the target Unbound instance. Unbound fetches the malicious responses from upstream and enters an unbounded name-compression loop before replying, exhausting CPU and preventing service of other clients.
How to fix it
Upgrade nlnetlabs/unbound to version 1.21.1 or apply commit b7c61d7cc256d6a174e6179622c7fa968272c259. After upgrade, restart the service and verify the new hard limit on compression operations is active.
How to confirm the fix worked
Confirm running version is 1.21.1 or later via unbound -V. Perform load testing with queries that trigger large RRsets and verify CPU usage remains bounded and responses are either semi-compressed or truncated rather than causing long lockups.
Typical attack path
- Attacker registers or takes control of a domain and populates it with records containing very large RRsets.
- Attacker sends crafted queries to the victim Unbound resolver requesting those records.
- Unbound contacts upstream authoritative servers, receives the oversized responses, and begins name compression.
- Compression loop runs to completion without limit, holding the worker thread and starving other queries.
- Repeated queries cause progressive CPU exhaustion leading to denial of service.
How to detect it
Correlate high sustained CPU on the Unbound process with incoming queries for domains known to host large RRsets. Examine resolver logs for repeated requests that produce unusually large or truncated responses and check system performance counters for worker-thread starvation.
What your security team should do
- Immediately schedule upgrade of all Unbound instances to 1.21.1.
- Place Unbound behind rate-limiting or query-filtering layers until patched.
- Monitor CPU utilization and queue depths on resolver hosts for early signs of resource exhaustion.
- Review and tighten upstream ACLs or response-size limits where operationally feasible.
The record
NLnet Labs Unbound up to and including version 1.21.0 contains a vulnerability when handling replies with very large RRsets that it needs to perform name compression for. Malicious upstreams responses with very large RRsets can cause Unbound to spend a considerable time applying name compression to downstream replies. This can lead to degraded performance and eventually denial of service in well orchestrated attacks. The vulnerability can be exploited by a malicious actor querying Unbound for the specially crafted contents of a malicious zone with very large RRsets. Before Unbound replies to the query it will try to apply name compression which was an unbounded operation that could lock the CPU until the whole packet was complete. Unbound version 1.21.1 introduces a hard limit on the number of name compression calculations it is willing to do per packet. Packets that need more compression will result in semi-compressed packets or truncated packets, even on TCP for huge messages, to avoid locking the CPU for long. This change should not affect normal DNS traffic.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| crates.io | hickory-proto | 0.3.1 | 0.26.1 |
| AlmaLinux:10 | python3-unbound | 0 | 1.20.0-10.el10_0 |
| AlmaLinux:10 | unbound | 0 | 1.20.0-10.el10_0 |
| AlmaLinux:10 | unbound-anchor | 0 | 1.20.0-10.el10_0 |
| AlmaLinux:10 | unbound-devel | 0 | 1.20.0-10.el10_0 |
| AlmaLinux:10 | unbound-dracut | 0 | 1.20.0-10.el10_0 |
| AlmaLinux:10 | unbound-libs | 0 | 1.20.0-10.el10_0 |
| AlmaLinux:8 | python3-unbound | 0 | 1.16.2-5.8.el8_10 |
| AlmaLinux:8 | unbound | 0 | 1.16.2-5.8.el8_10 |
| AlmaLinux:8 | unbound-devel | 0 | 1.16.2-5.8.el8_10 |
| AlmaLinux:8 | unbound-libs | 0 | 1.16.2-5.8.el8_10 |
| AlmaLinux:9 | python3-unbound | 0 | 1.16.2-8.el9_5.1 |
| AlmaLinux:9 | unbound | 0 | 1.16.2-8.el9_5.1 |
| AlmaLinux:9 | unbound-devel | 0 | 1.16.2-8.el9_5.1 |
| AlmaLinux:9 | unbound-libs | 0 | 1.16.2-8.el9_5.1 |
| Alpine:v3.17 | unbound | 0 | 1.20.0-r1 |
| Alpine:v3.18 | unbound | 0 | 1.20.0-r1 |
| Alpine:v3.19 | unbound | 0 | 1.20.0-r1 |
| Alpine:v3.20 | unbound | 0 | 1.20.0-r1 |
| Alpine:v3.21 | unbound | 0 | 1.21.1-r0 |
| Alpine:v3.22 | unbound | 0 | 1.21.1-r0 |
| Debian:11 | unbound | 0 | No fix |
| Debian:11 | unbound | 0 | 1.13.1-1+deb11u4 |
| Debian:12 | unbound | 0 | No fix |
| Debian:13 | unbound | 0 | No fix |
| Debian:14 | unbound | 0 | 1.21.1-1 |
| Mageia:9 | unbound | 0 | 1.21.1-1.mga9 |
| Red Hat:enterprise_linux:9::appstream | python3-unbound | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::appstream | python3-unbound-debuginfo | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::appstream | unbound | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::appstream | unbound-debuginfo | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::appstream | unbound-debugsource | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::appstream | unbound-devel | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::appstream | unbound-libs | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::appstream | unbound-libs-debuginfo | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::crb | python3-unbound | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::crb | python3-unbound-debuginfo | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::crb | unbound | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::crb | unbound-debuginfo | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::crb | unbound-debugsource | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::crb | unbound-devel | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::crb | unbound-libs | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:enterprise_linux:9::crb | unbound-libs-debuginfo | 0 | 0:1.16.2-8.el9_5.1 |
| Red Hat:rhel_eus:9.4::appstream | python3-unbound | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::appstream | python3-unbound-debuginfo | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::appstream | unbound | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::appstream | unbound-debuginfo | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::appstream | unbound-debugsource | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::appstream | unbound-devel | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::appstream | unbound-libs | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::appstream | unbound-libs-debuginfo | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::crb | python3-unbound | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::crb | python3-unbound-debuginfo | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::crb | unbound | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::crb | unbound-debuginfo | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::crb | unbound-debugsource | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::crb | unbound-devel | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::crb | unbound-libs | 0 | 0:1.16.2-8.el9_4.1 |
| Red Hat:rhel_eus:9.4::crb | unbound-libs-debuginfo | 0 | 0:1.16.2-8.el9_4.1 |
| Rocky Linux:8 | unbound | 0 | 0:1.16.2-5.8.el8_10 |
| Rocky Linux:9 | unbound | 0 | 0:1.16.2-8.el9_5.1 |
| SUSE:Linux Enterprise Micro 5.5 | unbound | 0 | 1.20.0-150100.10.19.1 |
| SUSE:Linux Enterprise Module for Basesystem 15 SP5 | unbound | 0 | 1.20.0-150100.10.19.1 |
| SUSE:Linux Enterprise Module for Basesystem 15 SP6 | unbound | 0 | 1.20.0-150600.23.9.1 |
| SUSE:Linux Enterprise Module for Package Hub 15 SP5 | unbound | 0 | 1.20.0-150100.10.19.1 |
| SUSE:Linux Enterprise Module for Package Hub 15 SP6 | unbound | 0 | 1.20.0-150600.23.9.1 |
| Ubuntu:20.04:LTS | unbound | 0 | 1.9.4-2ubuntu1.9 |
| Ubuntu:22.04:LTS | unbound | 0 | 1.13.1-1ubuntu5.8 |
| Ubuntu:24.04:LTS | unbound | 0 | 1.19.2-1ubuntu3.3 |
| Ubuntu:24.10 | unbound | 0 | 1.20.0-1ubuntu2.1 |
| Ubuntu:Pro:14.04:LTS | unbound | 0 | 1.4.22-1ubuntu4.14.04.3+esm2 |
| Ubuntu:Pro:16.04:LTS | unbound | 0 | 1.5.8-1ubuntu1.1+esm2 |
| Ubuntu:Pro:18.04:LTS | unbound | 0 | 1.6.7-1ubuntu2.6+esm3 |
| openSUSE:Leap 15.5 | unbound | 0 | 1.20.0-150100.10.19.1 |
| openSUSE:Leap 15.6 | unbound | 0 | 1.20.0-150600.23.9.1 |
| openSUSE:Tumbleweed | unbound | 0 | 1.21.1-1.1 |
Related vulnerabilities
- RUSTSEC-2026-0119 CPU exhaustion during message encoding due to O(n²) name compression Same vulnerability
- RUSTSEC-2026-0120 NSEC3 closest-encloser proof validation enters unbounded loop on cross-zone responses Also affects hickory-proto
- CVE-2023-50868 The Closest Encloser Proof aspect of the DNS protocol (in RFC 5155 when RFC 9276 guidance… Also affects python3-unbound
- CVE-2024-33655 The DNS protocol in RFC 1035 and updates allows remote attackers to cause a denial of… Also affects unbound
- CVE-2024-43168 DISPUTE NOTE: this issue does not pose a security risk as it (according to analysis by… Also affects unbound
- CVE-2024-43167 DISPUTE NOTE: this issue does not pose a security risk as it (according to analysis by… Also affects unbound
- CVE-2019-25031 Unbound before 1.9.5 allows configuration injection in create_unbound_ad_servers.sh upon… Also affects unbound
- CVE-2014-8602 iterator.c in NLnet Labs Unbound before 1.5.1 does not limit delegation chaining, which… Also affects unbound