GHSA-c4c3-7fpv-j4q5: Maven/io.netty:netty-handler vulnerability
Summary A fragmented TLS ClientHello whose handshake header spans multiple records makes Netty silently fall back to the default SslContext; where per-SNI selection is the sole mTLS gate, an unauthenticated attacker can bypass the route's mTLS requirement.
Details In io.netty.handler.ssl.SslClientHelloHandler#decode the guard that should wait for the 4-byte handshake header checks the wrong offset - it ignores the 5-byte record header that precedes it - and therefore never fires:
java if (handshakeLength == -1) { if (readerIndex + 4 > endOffset) { // Need more data to read HandshakeType and handshakeLength (4 bytes) return; }
When the first record's payload is < 4 bytes, handshakeLength = in.getUnsignedMedium(readerIndex + SslUtils.SSLRECORDHEADERLENGTH + 1); leads to IndexOutOfBoundsException . That is caught by the generic catch (Exception) block, which calls select(ctx, null) - this is the default SslContext. Fallback to default on parse failure is a problem when per-SNI selection is the sole mTLS gate.
Impact SNI routing bypass. Escalates to an unauthenticated mTLS bypass only when: - mTLS is enforced solely via per-SNI SslContext (clientAuth=REQUIRE) - the default/fallback SslContext is permissive (clientAuth=NONE/OPTIONAL) - no secondary peer-certificate verification exists at the application layer.
Affected Software
Remediation
Recommended actions to resolve this vulnerability, in priority order.
- Upgrade
Upgrade
maven/io.netty:netty-handlerto a version that resolves this vulnerability.Fixed in 4.1.137.Final - Upgrade
Upgrade
maven/io.netty:netty-handlerto a version that resolves this vulnerability.Fixed in 4.2.17.Final
Event History
Frequently Asked Questions
Which deployments can turn this into an unauthenticated mTLS bypass?
The bypass requires mTLS to be enforced solely by the SNI-selected SslContext, with the selected route requiring client authentication while the default SslContext does not. If mTLS is enforced independently of per-SNI context selection, the described escalation condition is not met.
What does an attacker need to send to trigger the fallback?
An attacker needs to send a fragmented TLS ClientHello where the handshake header spans TLS records and the first record contains fewer than four bytes of handshake payload. This causes a parsing exception that results in selection of the default SslContext.
How can we determine whether our configuration is exposed?
Review whether client authentication is configured only on per-SNI SslContexts and whether the default SslContext permits connections without client certificates. A deployment matching both conditions is exposed to the unauthenticated mTLS-bypass scenario.