RFR: 8331682: Slow networks/Impatient clients can potentially send unencrypted TLSv1.3 alerts that won't parse on the server [v20]
Xue-Lei Andrew Fan
xuelei at openjdk.org
Thu Oct 17 17:22:19 UTC 2024
On Thu, 17 Oct 2024 15:55:29 GMT, Artur Barashev <abarashev at openjdk.org> wrote:
> > Does it happen in server side (server send plaintext) as well? I found some cases that the client decryption failed.
>
> Current reports indicate it happens on the server side only (server throws the exception). Please share any cases when it happens on the client side. This PR has a check to handle this scenario on the server side only.
Here is a stack trace:
javax.net.ssl.SSLHandshakeException: Insufficient buffer remaining for AEAD cipher fragment (2). Needs to be more than tag size (16)
at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:131)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:378)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:321)
at java.base/sun.security.ssl.TransportContext.fatal(TransportContext.java:316)
at java.base/sun.security.ssl.SSLTransport.decode(SSLTransport.java:134)
at java.base/sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1510)
at java.base/sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1425)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:455)
at java.base/sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:426)
at java.base/sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:576)
at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:187)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1458)
at java.base/sun.net.www.protocol.http.HttpURLConnection$8.run(HttpURLConnection.java:1421)
at java.base/sun.net.www.protocol.http.HttpURLConnection$8.run(HttpURLConnection.java:1419)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
at java.base/java.security.AccessController.doPrivilegedWithCombiner(AccessController.java:962)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1418)
at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:220)
>> src/java.base/share/classes/sun/security/ssl/SSLTransport.java line 131:
>>
>>> 129: throw context.fatal(Alert.BAD_RECORD_MAC, bte);
>>> 130: } catch (BadPaddingException bpe) {
>>> 131: // Check for unexpected plaintext alert message during TLSv1.3+ handshake.
>>
>> Could the case happen for SSLEngine as well?
>
> Yes, we have tests for both `SSLEngine` and `SSLSocket` usages. In case of SSLEngine the data is passed downstream in `srcs` array.
It looks like SSLEngine does not use the cached record? I did not get the point to have two different logic for SSLEngine and SSLSocket.
-------------
PR Comment: https://git.openjdk.org/jdk/pull/21043#issuecomment-2420087269
PR Review Comment: https://git.openjdk.org/jdk/pull/21043#discussion_r1805143099
More information about the security-dev
mailing list