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.
5 steps from start to impact.
Identify Netty-based TLS endpoint with SNI
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.- Network reachability to the target TLS port (typically 443 or 8443)
- 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
Send oversized ClientHello length advertisement
handshakeBuffer and waiting for the remaining bytes. No authentication or special TLS configuration is required.- TCP connectivity to the target TLS port
- No friction — standard unauthenticated TCP, trivial to script
Drip thousands of one-byte TLS records
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.- Sustained TCP connection lasting long enough for all fragments (typically a few seconds)
- 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
Saturate Netty event-loop threads
- Ability to open multiple concurrent TCP connections to the target
- Connection-count limits per source IP cap the reachable thread count from one address
- Servers with many CPU cores require proportionally more attack connections
Service-level TLS degradation or refusal
- Sufficient concurrent attack connections to exhaust the event-loop pool
- Upstream load balancers with health checks fail over to healthy instances
- Service restarts or connection-reaping cron jobs restore availability quickly
The supporting signals.
| In-the-wild exploitation | None observed. No campaigns, threat-actor references, or honeypot hits reported. Not listed in CISA KEV. |
|---|---|
| Proof-of-concept | No 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. |
| EPSS | 0.35% probability of exploitation in next 30 days (28th percentile). Low exploitation pressure per FIRST model. |
| KEV status | Not listed in CISA Known Exploited Vulnerabilities catalog as of 2026-09-20. |
| CVSS vector | GHSA (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 versions | io.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 versions | 4.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 / exposure | No 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 date | 2026-08-19 (GHSA published). NVD status: *Awaiting Analysis* as of 2026-09-09. |
| Reporter | Liyi Zhou, Ziyue Wang, Strick, Maurice, Chenchen Yu (University of Sydney). Advisory notes AI tools assisted in surfacing the issue, with independent manual reproduction. |
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.
What to do — in priority order.
- 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.
- 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.
- 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. - 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.
- 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.
- 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.
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.
#!/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
fiWhat defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.