← Back to Feed CACHED · 2026-09-20 05:59:38 · CACHE_KEY CVE-2026-73508
CVE-2026-73508 · CWE-772 · Disclosed 2026-08-13

Netty is an asynchronous

ASSESSED — NOISGATE
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

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.

"Slow-drip memory leak in Netty DNS codec is a nuisance DoS, not a showstopper."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Identify Netty DNS endpoint

The attacker needs a network path to an application using Netty's DNS codec. This could be a custom DNS server built on Netty, or a service using 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.
Conditions required:
  • Target application loads io.netty:netty-codec-dns
  • Network reachability to the DNS processing endpoint or ability to serve poisoned DNS responses
Where this breaks in practice:
  • 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
STEP 02

Craft malformed DNS packets

The attacker constructs DNS response packets containing domain names with IDNA-violating characters or embedded null bytes. These trigger 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.
Conditions required:
  • Understanding of DNS wire format
  • Ability to craft raw DNS packets (trivial with scapy, dnspython, or similar)
Where this breaks in practice:
  • No weaponized PoC publicly available yet
  • Crafting the payload requires DNS protocol knowledge but is not complex
STEP 03

Sustain packet flow to accumulate leaked ByteBufs

Each malformed packet leaks a small amount of direct memory. The attacker must sustain a high volume of these packets over minutes to hours to push the JVM's direct memory allocation toward exhaustion. The rate depends on the buffer sizes involved and the JVM's -XX:MaxDirectMemorySize setting. A single packet does negligible damage.
Conditions required:
  • Sustained network access to repeatedly trigger the decoder
  • Target JVM has finite direct memory budget (default or configured)
Where this breaks in practice:
  • 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
Detection/coverage: JVM metrics dashboards (Grafana, Datadog) tracking jvm.direct.memory.used will show a monotonic climb. APM tools with Netty buffer-pool instrumentation surface the leak directly.
STEP 04

Trigger OutOfMemoryError — partial service degradation

Once direct memory is exhausted, new buffer allocations fail with 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.
Conditions required:
  • Sufficient leaked memory to exhaust the direct memory budget
  • No automated memory monitoring triggering a restart before full exhaustion
Where this breaks in practice:
  • 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
Detection/coverage: Container orchestrator OOM-kill events in kubectl get events. Alerting on pod restart counts catches this pattern.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNo evidence. Not listed in CISA KEV. No campaigns or threat-actor usage reported as of September 2026.
Proof-of-conceptNone public. The GitHub Security Advisory (GHSA-mfg7-5gfp-c4w3) describes exact vulnerable code paths, making reproduction straightforward, but no weaponized PoC repo was found.
EPSS0.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 statusNot listed. No CISA KEV entry.
CVSS vectorCVSS: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 versionsio.netty:netty-codec-dns — all versions < 4.1.136.Final (4.1.x branch) and < 4.2.16.Final (4.2.x branch).
Fixed versions4.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 dataNo 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 date2026-08-13 via GitHub Security Advisory.
ReporterNetty project maintainers (advisory authored by the Netty team).
04 · The Call

Final Verdict
= UNCHANGED to MEDIUM (4.5/10)

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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. Set explicit direct memory limits on JVMs using Netty DNS — Configure -XX:MaxDirectMemorySize to 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.
  3. Monitor JVM direct memory usage — Add alerting on jvm.direct.memory.used or Netty's PooledByteBufAllocator metrics 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.
  4. 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.
What doesn't work
  • 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-dns artifact. Bumping netty-transport or netty-handler alone does not resolve the vulnerability.
06 · Verification

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).

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
fi
07 · Sources

Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.