← Back to Feed CACHED · 2026-09-20 06:16:05 · CACHE_KEY CVE-2026-75596
CVE-2026-75596 · CWE-407 · Disclosed 2026-08-19

Netty is an asynchronous

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

A copy machine that restarts from page one every time you add a sheet — that is Netty's SniHandler on each TLS fragment

CVE-2026-75596 affects Netty's io.netty.handler.ssl.SniHandler in all versions prior to 4.1.137.Final (4.1.x branch) and 4.2.17.Final (4.2.x branch). When a TLS client sends a fragmented ClientHello, the default SniHandler constructors call handshakeBuffer.clear() followed by writeBytes() on every incoming TLS record, re-copying *all* previously accumulated bytes each time. An unauthenticated remote attacker sends a first record advertising a large ClientHello (e.g., 4096 bytes) and then drips the body in thousands of one-byte records, producing O(n²) CPU work. With 4,095 one-byte fragments the handler internally copies 8,386,560 bytes from just 24,579 bytes on the wire — a 341× amplification ratio — starving the Netty event loop of CPU and degrading TLS handling for every other client sharing that loop.

The Netty project's own GHSA advisory (GHSA-fccg-mwvh-qqg4) scores this at CVSS 6.9 Moderate using CVSS 4.0 with VA:L. Several aggregator sites inflate it to 8.7 by flipping Availability Impact to High — that overshoot is misleading. The attack consumes CPU on event-loop threads but does not crash the JVM, does not leak data, and does not grant code execution. Recovery is automatic once malicious connections close or time out. Real-world severity hinges on whether SNI termination happens inside your Netty application or at an upstream reverse proxy: if a load balancer handles TLS before traffic reaches Netty, the vulnerable code path is never triggered. For teams where Netty *is* the TLS front door, this is a real but bounded availability risk.

"Easy-to-reach DoS via quadratic TLS buffer re-copy, but impact stops at availability"
02 · The Attack Path

5 steps from start to impact.

STEP 01

Identify Netty-based TLS endpoint with SNI

The attacker locates a network-reachable service terminating TLS via Netty's SniHandler. Common targets include Java API gateways, microservices frameworks (Spring WebFlux, Vert.x, Micronaut), message brokers (Kafka), identity platforms (Keycloak), and search clusters (Elasticsearch). Any service presenting SNI-based virtual-hosted TLS certificates backed by Netty qualifies.
Conditions required:
  • Network reachability to the target TLS port (typically 443 or 8443)
Where this breaks in practice:
  • Many enterprises terminate TLS at a reverse proxy (Nginx, HAProxy, Envoy, F5) rather than inside Netty directly
  • Not all Netty deployments use SniHandler — only those doing SNI-based virtual hosting trigger the vulnerable path
Detection/coverage: Shodan or Censys can fingerprint Netty-based TLS endpoints via Server headers or TLS stack behavior, but confirming SniHandler usage specifically requires deeper probing.
STEP 02

Send oversized ClientHello length advertisement

The attacker opens a TCP connection and sends a TLS Handshake record whose ClientHello advertises a large body length (up to 4096 bytes) but transmits only a small initial fragment. This primes the SniHandler to enter the pre-handshake aggregation loop, allocating handshakeBuffer and waiting for the remaining bytes. No authentication or special TLS configuration is required.
Conditions required:
  • TCP connectivity to the target TLS port
Where this breaks in practice:
  • No friction — standard unauthenticated TCP, trivial to script
Detection/coverage: IDS/IPS signatures for abnormally small first-fragment TLS ClientHello records could flag this, but no standard ruleset covers it yet.
STEP 03

Drip thousands of one-byte TLS records

The attacker transmits up to 4,095 subsequent TLS records, each containing a single byte of the ClientHello body. On every record the SniHandler calls handshakeBuffer.clear() then writeBytes(), re-copying all previously accumulated bytes. This produces O(n²) internal copy operations — 8.3 MB of buffer work from roughly 25 KB on the wire. The entire payload fits in a few TCP segments.
Conditions required:
  • Sustained TCP connection lasting long enough for all fragments (typically a few seconds)
Where this breaks in practice:
  • Aggressive TLS handshake timeouts (< 5 s) can terminate the connection before the quadratic cost peaks
  • Per-source connection rate limiting bounds the damage from a single IP
Detection/coverage: Network monitoring for TLS connections exceeding ~100 handshake records before completion would catch this pattern. No commercial scanner has a signature as of September 2026.
STEP 04

Saturate Netty event-loop threads

The quadratic copy operations monopolize the event-loop thread servicing the malicious connection. Netty typically allocates 2× CPU-core I/O threads. By opening concurrent malicious connections the attacker can exhaust the entire event-loop group. Each connection costs the attacker about 25 KB of bandwidth and a few seconds of wall time, making multi-thread saturation feasible from a single host.
Conditions required:
  • Ability to open multiple concurrent TCP connections to the target
Where this breaks in practice:
  • Connection-count limits per source IP cap the reachable thread count from one address
  • Servers with many CPU cores require proportionally more attack connections
Detection/coverage: JVM thread-pool utilization metrics, Netty event-loop queue depth, and CPU-per-thread dashboards would surface the anomaly.
STEP 05

Service-level TLS degradation or refusal

With event-loop threads consumed, legitimate clients attempting TLS handshakes experience timeouts or extreme latency. The application remains running but effectively cannot serve new TLS connections. Impact is strictly availability — no data is leaked, no code is executed, no credentials are exposed. Recovery is automatic once malicious connections close or are reaped.
Conditions required:
  • Sufficient concurrent attack connections to exhaust the event-loop pool
Where this breaks in practice:
  • Upstream load balancers with health checks fail over to healthy instances
  • Service restarts or connection-reaping cron jobs restore availability quickly
Detection/coverage: TLS handshake success-rate alerts, synthetic health probes, and connection-backlog monitoring detect the outage within seconds.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone observed. No campaigns, threat-actor references, or honeypot hits reported. Not listed in CISA KEV.
Proof-of-conceptNo public PoC code. The GHSA advisory details the exact mechanics (fragment count, amplification ratio, affected methods) — sufficient for a competent attacker to reproduce with a custom TLS client script in an afternoon.
EPSS0.35% probability of exploitation in next 30 days (28th percentile). Low exploitation pressure per FIRST model.
KEV statusNot listed in CISA Known Exploited Vulnerabilities catalog as of 2026-09-20.
CVSS vectorGHSA (vendor): CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:L/SC:N/SI:N/SA:N = 6.9 Moderate. Some aggregators report VA:H → 8.7 HIGH. The vendor's VA:L is defensible — event-loop exhaustion degrades but does not destroy the service.
Affected versionsio.netty:netty-handler < 4.1.137.Final (4.1.x) and 4.2.0.Final through 4.2.16.Final (4.2.x). Affects SniHandler and SslClientHelloHandler default constructors.
Fixed versions4.1.137.Final and 4.2.17.Final. Ubuntu tracking at ubuntu.com/security/CVE-2026-75596. Downstream consumers (Keycloak, Kafka, Elasticsearch) shipping updated dependencies on their own schedules.
Scanning / exposureNo GreyNoise or Shodan tags specific to this CVE. Netty is embedded in millions of Java deployments globally, but SniHandler usage is a strict subset — services not doing SNI virtual hosting are unaffected. No mass-scanning activity observed.
Disclosure date2026-08-19 (GHSA published). NVD status: *Awaiting Analysis* as of 2026-09-09.
ReporterLiyi Zhou, Ziyue Wang, Strick, Maurice, Chenchen Yu (University of Sydney). Advisory notes AI tools assisted in surfacing the issue, with independent manual reproduction.
04 · The Call

Final Verdict
= UNCHANGED to MEDIUM (6.0/10)

Why this verdict

  • Unauthenticated remote reach: The attack requires only TCP connectivity to a TLS port — zero credentials, zero prior compromise, zero user interaction. This is the lowest-friction attacker position and supports a higher baseline.
  • Availability-only impact ceiling: The vulnerability cannot produce code execution, data exfiltration, privilege escalation, or persistent compromise under any conditions. Impact is bounded to CPU exhaustion on Netty event-loop threads with automatic recovery when malicious connections close. This hard-caps severity below CRITICAL.
  • SniHandler is a deployment subset: Not every Netty application uses SniHandler. Services that skip SNI-based virtual hosting, or that terminate TLS at an upstream proxy (Nginx, HAProxy, Envoy, F5), never trigger the vulnerable code path. This significantly narrows the reachable population — conservatively 30-50% of Netty deployments.
  • Role multiplier: Netty occupies high-value roles including identity platforms (Keycloak), message brokers (Kafka), API gateways, and search clusters (Elasticsearch). In these roles the attack chain succeeds and produces host-level service degradation. However, the blast radius is availability disruption confined to the targeted process — not domain takeover, fleet compromise, data exfiltration, or supply-chain pivot. DoS on a Keycloak IdP temporarily blocks authentication flows but does not compromise credentials or trust material. DoS on Kafka pauses ingestion but does not corrupt data. These outcomes do not meet the HIGH floor threshold of domain/fleet/supply-chain/safety impact.
  • Low exploitation pressure: EPSS 0.35% (28th percentile), no KEV listing, no public PoC, no active campaigns. The attack is conceptually simple but has not been weaponized, providing time to patch through normal cycles.

Why not higher?

The impact is strictly availability with no path to code execution, data access, or lateral movement. Even in worst-case deployments (DoS on a Keycloak IdP or Kafka broker), the outcome is temporary, recoverable service disruption — not persistent compromise. The HIGH floor requires outcomes like domain takeover, fleet compromise, or supply-chain pivot; a CPU-exhaustion DoS with automatic recovery does not qualify. The 341x amplification is meaningful but bounded by thread-pool size and readily mitigatable with connection-rate limits or upstream TLS termination.

Why not lower?

The attack is unauthenticated, requires minimal bandwidth (~25 KB), and exploits a clear quadratic amplification that is trivial to reproduce. Any internet-facing Netty service using SniHandler is directly reachable with zero preconditions. The GHSA advisory provides enough technical detail for an attacker to build an exploit quickly, and the 341x amplification makes single-source DoS practical against modestly provisioned servers. Dropping below MEDIUM would understate the ease of exploitation and the real disruption potential for services relying on Netty for TLS termination.

05 · Compensating Control

What to do — in priority order.

  1. Upgrade netty-handler to 4.1.137.Final or 4.2.17.Final — The definitive fix eliminates the quadratic re-copy in SniHandler's ClientHello aggregation. As a MEDIUM-severity finding the noisgate remediation SLA allows up to 365 days, but given the trivial exploitation mechanics, prioritize within your next quarterly dependency update cycle.
  2. Terminate TLS at an upstream reverse proxy — If Nginx, HAProxy, Envoy, or a hardware load balancer terminates TLS before traffic reaches Netty, the vulnerable SniHandler path is never invoked. This is the strongest compensating control when an immediate library upgrade is infeasible. Deploy within your standard change window.
  3. Enforce per-source-IP TLS handshake rate limits — Use iptables connlimit, firewall rules, or load-balancer policies to cap concurrent new TLS connections per source IP (e.g., 20/s). This bounds the number of event-loop threads an attacker can exhaust from a single vantage point without affecting legitimate traffic patterns.
  4. Set aggressive TLS handshake timeouts — Configure Netty SslHandler or upstream infrastructure to enforce short TLS handshake timeouts (5-10 seconds). The fragment-drip attack needs sustained delivery of thousands of records — a tight timeout kills the connection before quadratic cost peaks.
  5. Monitor event-loop thread CPU and TLS handshake latency — Instrument JVM monitoring (Micrometer, Prometheus JMX exporter) to alert on sustained high CPU in Netty I/O threads and rising p99 TLS handshake latency. This enables early detection and manual connection termination during an active attack.
What doesn't work
  • Web Application Firewall (WAF): WAFs inspect HTTP at L7 and cannot see or filter TLS handshake-layer record fragmentation. The attack completes entirely within the TLS layer before any HTTP exchange occurs.
  • TLS cipher suite or protocol version hardening: Restricting to TLS 1.3 or removing weak ciphers has zero effect — the vulnerability fires during pre-handshake ClientHello aggregation before cipher negotiation begins.
  • JVM heap or direct-memory tuning: The vulnerability is CPU-bound (quadratic byte-copy operations), not memory-bound. Adjusting -Xmx, -XX:MaxDirectMemorySize, or GC settings does not reduce the CPU amplification.
06 · Verification

Crowdsourced verification payload.

Run on each target host where Java applications may embed Netty. Execute as bash check_cve_2026_75596.sh /opt/apps (substitute your application deployment root). Root access gives full filesystem coverage. The script scans for netty-handler-*.jar files and compares versions against fixed releases.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# CVE-2026-75596 Netty SniHandler Quadratic DoS Check
# Usage: bash check_cve_2026_75596.sh [/path/to/scan]
# Exit: 0=PATCHED  1=VULNERABLE  2=UNKNOWN
set -uo pipefail
SEARCH="${1:-/}"
FOUND=0
VULN=0
echo "=== CVE-2026-75596 Netty SniHandler Check ==="
echo "Scanning: $SEARCH"
echo ""
while IFS= read -r jar; do
  FOUND=1
  name=$(basename "$jar")
  ver=$(echo "$name" | sed 's/netty-handler-//;s/\.Final//g;s/\.jar//;s/-[a-zA-Z].*$//')
  if [ -z "$ver" ]; then
    echo "[?] UNKNOWN: $jar"
    continue
  fi
  maj=$(echo "$ver" | cut -d. -f1)
  min=$(echo "$ver" | cut -d. -f2)
  pat=$(echo "$ver" | cut -d. -f3)
  if [ -z "$pat" ]; then
    echo "[?] UNKNOWN format: $jar ($ver)"
    continue
  fi
  SAFE=0
  if [ "$maj" -eq 4 ] && [ "$min" -eq 2 ] && [ "$pat" -ge 17 ]; then SAFE=1; fi
  if [ "$maj" -eq 4 ] && [ "$min" -eq 1 ] && [ "$pat" -ge 137 ]; then SAFE=1; fi
  if [ "$maj" -gt 4 ]; then SAFE=1; fi
  if [ "$maj" -eq 4 ] && [ "$min" -gt 2 ]; then SAFE=1; fi
  if [ "$SAFE" -eq 1 ]; then
    echo "[+] PATCHED: $jar (v$ver)"
  else
    echo "[!] VULNERABLE: $jar (v$ver)"
    VULN=1
  fi
done < <(find "$SEARCH" -name "netty-handler-*.jar" -type f 2>/dev/null)
echo ""
if [ "$FOUND" -eq 0 ]; then
  echo "UNKNOWN - No netty-handler JARs found under $SEARCH"
  exit 2
elif [ "$VULN" -gt 0 ]; 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.