Like a faucet left dripping — it won't flood your house today, but the water bill is climbing
CVE-2026-73508 is a resource-leak bug in Netty's netty-codec-dns module. When the DNS record decoder encounters a malformed domain name — one containing characters that violate IDNA rules or embedded null bytes — the call to IDN.toASCII() or encodeDomainName() throws an IllegalArgumentException. The exception handler fails to release the associated ByteBuf objects (either retainedDuplicate() copies in DefaultDnsRecordDecoder or freshly allocated buffers in DnsCodecUtil.decompressDomainName()). An unauthenticated remote attacker can send crafted DNS packets that trigger the leak repeatedly, incrementally exhausting direct memory. Affected versions are netty-codec-dns prior to 4.1.136.Final (4.1.x branch) and prior to 4.2.16.Final (4.2.x branch). Any application that wires up Netty's DnsNameResolver or a custom DNS server using these codecs is in scope — but applications using Netty for HTTP, gRPC, or other protocols without DNS codec are not affected.
The vendor's MEDIUM / 5.3 rating is honest and mostly accurate. The CVSS vector itself encodes the key limitation: A:L, meaning partial degradation, not a full crash. This isn't a one-packet kill — the attacker needs sustained traffic over time to accumulate enough leaked buffers to push the JVM toward OutOfMemoryError. In modern container orchestrators (Kubernetes, ECS), affected pods hit their memory limit, get OOM-killed, and restart automatically, reducing the blast radius to transient service blips rather than sustained outages. The real-world severity is a touch *below* the vendor's 5.3 once you account for the subset of Netty deployments actually loading netty-codec-dns.
4 steps from start to impact.
Identify Netty DNS endpoint
DnsNameResolver where the attacker can influence DNS response traffic (e.g., by controlling a malicious authoritative nameserver for a domain the target resolves). Shodan/Censys can identify DNS listeners, but most Netty DNS usage is internal resolver behavior, not an exposed DNS port.- Target application loads
io.netty:netty-codec-dns - Network reachability to the DNS processing endpoint or ability to serve poisoned DNS responses
- Most Netty deployments use HTTP/gRPC codecs, not the DNS codec — the vulnerable module is a small subset
- Internal DnsNameResolver instances typically query trusted recursive resolvers, not attacker-controlled servers directly
Craft malformed DNS packets
IllegalArgumentException in IDN.toASCII() or encodeDomainName(). No public PoC repository was found as of September 2026, but the advisory describes the exact code paths (AbstractDnsRecord, DefaultDnsRecordDecoder.decodeRecord(), DnsCodecUtil.decompressDomainName()), making reproduction straightforward for anyone who can read Java.- Understanding of DNS wire format
- Ability to craft raw DNS packets (trivial with scapy, dnspython, or similar)
- No weaponized PoC publicly available yet
- Crafting the payload requires DNS protocol knowledge but is not complex
Sustain packet flow to accumulate leaked ByteBufs
-XX:MaxDirectMemorySize setting. A single packet does negligible damage.- Sustained network access to repeatedly trigger the decoder
- Target JVM has finite direct memory budget (default or configured)
- Rate limiting, WAFs, or DNS query-rate controls interrupt the sustained flow
- JVM direct memory defaults are often generous; reaching OOM takes significant traffic volume
- Network monitoring or anomaly detection flags unusual DNS query/response rates
jvm.direct.memory.used will show a monotonic climb. APM tools with Netty buffer-pool instrumentation surface the leak directly.Trigger OutOfMemoryError — partial service degradation
OutOfMemoryError: Direct buffer memory. Depending on the application's error handling, this may crash the JVM or degrade specific request paths. In containerized deployments, the OOM-killed pod restarts automatically, and the attacker must restart the leak cycle. The impact is availability degradation (A:L), not a full sustained outage.- Sufficient leaked memory to exhaust the direct memory budget
- No automated memory monitoring triggering a restart before full exhaustion
- Kubernetes liveness probes and memory limits trigger automatic restarts, capping downtime to seconds
- Horizontal scaling means other replicas continue serving traffic
- A:L impact — the CVSS itself acknowledges this is partial degradation, not a full crash
kubectl get events. Alerting on pod restart counts catches this pattern.The supporting signals.
| In-the-wild exploitation | No evidence. Not listed in CISA KEV. No campaigns or threat-actor usage reported as of September 2026. |
|---|---|
| Proof-of-concept | None public. The GitHub Security Advisory (GHSA-mfg7-5gfp-c4w3) describes exact vulnerable code paths, making reproduction straightforward, but no weaponized PoC repo was found. |
| EPSS | 0.00333 (0.33% probability of exploitation in the next 30 days) — bottom quartile. Reflects the limited attacker value of a slow DoS with no code execution. |
| KEV status | Not listed. No CISA KEV entry. |
| CVSS vector | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L — Unauthenticated remote, no complexity, but only Low availability impact. Zero confidentiality/integrity impact. |
| Affected versions | io.netty:netty-codec-dns — all versions < 4.1.136.Final (4.1.x branch) and < 4.2.16.Final (4.2.x branch). |
| Fixed versions | 4.1.136.Final and 4.2.16.Final. Distro backports: Ubuntu has tracked the CVE (ubuntu.com/security/CVE-2026-73508); check your distro's libnetty-java package. |
| Exposure data | No Shodan/GreyNoise/Censys signatures specific to Netty DNS endpoints. Most Netty DNS usage is internal DnsNameResolver calls, not internet-facing DNS listeners. The exposed population is very small. |
| Disclosure date | 2026-08-13 via GitHub Security Advisory. |
| Reporter | Netty project maintainers (advisory authored by the Netty team). |
Why this verdict
- Availability-only, Low impact: The CVSS vector explicitly encodes A:L — partial degradation, not a full crash. There is zero confidentiality or integrity impact. This is a slow-drip memory leak, not a one-packet kill.
- Subset exposure: The vulnerable module is
netty-codec-dns, not the core Netty transport or HTTP codecs. The vast majority of Netty's massive installed base (Apple, Google, Netflix, Elasticsearch, Kafka, gRPC-Java, Spring WebFlux) uses HTTP/2, gRPC, or TCP codecs — not the DNS codec. Realistic exposure is a small fraction of total Netty deployments. - Sustained attack required: Achieving meaningful memory exhaustion requires sustained, high-volume malicious DNS traffic over minutes to hours. Any rate-limiting, network anomaly detection, or DNS query-rate cap breaks the chain.
- Container orchestration neutralizes impact: In Kubernetes/ECS (where most modern Netty DNS usage lives), OOM-killed pods restart in seconds. Horizontal scaling means other replicas absorb traffic. The practical window of degradation is measured in seconds, not hours.
- Role multiplier: Netty is used in high-value infrastructure (Elasticsearch, Kafka, Spark, gRPC services). However, the *DNS codec* is a narrow optional module. For services that do load it (e.g., Spring WebFlux with Netty DnsNameResolver for service discovery in K8s), the blast radius of a successful attack is single-instance restart — not domain takeover, not fleet compromise, not data exfiltration. The worst plausible high-value-role outcome is transient service disruption of one pod in a replica set. This does not meet the HIGH floor threshold because the outcome is not fleet-scale, identity-scale, or supply-chain-scale even when the chain succeeds.
- No exploitation interest: EPSS at 0.33% (bottom quartile), no KEV listing, no public PoC, no observed campaigns. Attackers have no incentive to invest in a slow DoS with no pivot capability when faster, higher-impact options exist.
Why not higher?
Promoting to HIGH would require either code execution, data exposure, or a fleet-scale blast radius. This vulnerability delivers none of those — it is a gradual memory leak capped at A:L in a narrow optional codec module. Even in the worst-case high-value deployment (an API gateway using Netty DnsNameResolver), the outcome is a pod restart, not a breach. The EPSS score, lack of exploitation evidence, and DoS-only impact class all argue against HIGH.
Why not lower?
Dropping to LOW or IGNORE would understate the fact that this is unauthenticated, remote, zero-complexity, and zero-interaction. An attacker who *can* reach a Netty DNS endpoint *can* degrade it without credentials. The attack surface is narrow but real, and the fix is a simple version bump. This deserves tracking and remediation within a normal patch cycle, not indefinite deferral.
What to do — in priority order.
- Upgrade netty-codec-dns to 4.1.136.Final or 4.2.16.Final — The definitive fix. A dependency version bump in your Maven/Gradle build resolves the leak. Deploy within the noisgate remediation SLA of 365 days for MEDIUM severity. If you manage a BOM (Spring Boot, Quarkus, Micronaut), check whether your framework has already pulled the fix into a platform release.
- Set explicit direct memory limits on JVMs using Netty DNS — Configure
-XX:MaxDirectMemorySizeto a value your monitoring can alert on (e.g., 256m–512m). This caps the blast radius of any direct-memory leak, not just this CVE. The JVM will OOM-kill faster, and container orchestration restarts the pod. No mitigation SLA applies for MEDIUM — go straight to the 365-day remediation window. - Monitor JVM direct memory usage — Add alerting on
jvm.direct.memory.usedor Netty'sPooledByteBufAllocatormetrics via Micrometer/Datadog/Prometheus. A monotonic climb with no plateau is a leak indicator. This is detective, not preventive, but it ensures you catch exploitation attempts early. - Rate-limit DNS traffic to Netty DNS listeners — If you run a custom DNS server on Netty (rare), apply DNS query-rate limiting at the network edge or in-app. For internal DnsNameResolver usage, this is less applicable since the resolver initiates queries, not receives them — but you can restrict which upstream nameservers are queried.
- WAF rules — This is DNS wire protocol, not HTTP. Web application firewalls do not inspect DNS packets and cannot filter the malformed domain names that trigger the leak.
- JVM garbage collection tuning — The leaked memory is *direct* (off-heap) ByteBuf allocations, not heap objects. GC tuning has no effect on direct memory reclamation.
- Upgrading Netty core without upgrading netty-codec-dns — The fix is specifically in the
netty-codec-dnsartifact. Bumpingnetty-transportornetty-handleralone does not resolve the vulnerability.
Crowdsourced verification payload.
Run this script on any host or CI runner with access to the application's classpath or Maven/Gradle dependency tree. It checks whether netty-codec-dns is present and whether its version is patched. No special privileges required. Example: bash check_cve_2026_73508.sh /path/to/app/lib or bash check_cve_2026_73508.sh (scans current directory recursively for JARs).
#!/usr/bin/env bash
# check_cve_2026_73508.sh — Detect CVE-2026-73508 (Netty DNS codec memory leak)
# Usage: bash check_cve_2026_73508.sh [directory_to_scan]
# Exit codes: 0 = PATCHED/not affected, 1 = VULNERABLE, 2 = UNKNOWN
set -euo pipefail
SCAN_DIR="${1:-.}"
FOUND=0
VULNERABLE=0
echo "[*] Scanning for netty-codec-dns JARs in: $SCAN_DIR"
while IFS= read -r -d '' jar; do
basename_jar=$(basename "$jar")
if [[ "$basename_jar" =~ ^netty-codec-dns-([0-9]+)\.([0-9]+)\.([0-9]+)\.Final\.jar$ ]]; then
FOUND=1
MAJOR="${BASH_REMATCH[1]}"
MINOR="${BASH_REMATCH[2]}"
PATCH="${BASH_REMATCH[3]}"
VERSION="${MAJOR}.${MINOR}.${PATCH}.Final"
echo "[*] Found: $jar (version $VERSION)"
# 4.1.x branch: fixed in 4.1.136.Final
if [[ "$MAJOR" -eq 4 && "$MINOR" -eq 1 ]]; then
if [[ "$PATCH" -ge 136 ]]; then
echo "[+] PATCHED — $VERSION >= 4.1.136.Final"
else
echo "[-] VULNERABLE — $VERSION < 4.1.136.Final"
VULNERABLE=1
fi
# 4.2.x branch: fixed in 4.2.16.Final
elif [[ "$MAJOR" -eq 4 && "$MINOR" -eq 2 ]]; then
if [[ "$PATCH" -ge 16 ]]; then
echo "[+] PATCHED — $VERSION >= 4.2.16.Final"
else
echo "[-] VULNERABLE — $VERSION < 4.2.16.Final"
VULNERABLE=1
fi
# Older major/minor branches (< 4.1) are likely vulnerable
elif [[ "$MAJOR" -lt 4 || ("$MAJOR" -eq 4 && "$MINOR" -lt 1) ]]; then
echo "[-] VULNERABLE — $VERSION is older than any patched branch"
VULNERABLE=1
else
echo "[?] UNKNOWN branch $MAJOR.$MINOR — verify manually"
fi
fi
done < <(find "$SCAN_DIR" -type f -name 'netty-codec-dns-*.jar' -print0 2>/dev/null)
# Also check Maven/Gradle dependency output if piped
if [[ "$FOUND" -eq 0 ]]; then
echo "[*] No netty-codec-dns JARs found in $SCAN_DIR"
echo "[*] Tip: try 'mvn dependency:tree | grep netty-codec-dns' or 'gradle dependencies | grep netty-codec-dns'"
echo "UNKNOWN"
exit 2
fi
if [[ "$VULNERABLE" -eq 1 ]]; then
echo "VULNERABLE"
exit 1
else
echo "PATCHED"
exit 0
fiWhat defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.