crypto/tls: reject change_cipher_spec record after handshake in TLS 1.3 #58912
+1
−1
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This change fixes a non-urgent security issue in Golang's implementation of TLS 1.3.
Currently, when using Go crypto/tls, the middleman is able to insert garbage change_cipher_spec records between application_data records without breaking the TLS 1.3 connection. To test it, for example, insert the following code in func writeRecordLocked():
If the peer is Go crypto/tls, it will ignore these bytes and increase
c.retryCount
, instead of sending an alert immediately.With
maxUselessRecords = 16
, this bug can be used to detect whether an application_data record is empty or not.In Golang's existing comment:
go/src/crypto/tls/conn.go
Lines 726 to 727 in 84609d8
In RFC 8446, Appendix D.4:
In OpenSSL:
https://github.com/openssl/openssl/blob/ac57336cd258e0432ffa485615d11c7c7ecfe81a/ssl/record/methods/tls_common.c#L728
In BoringSSL:
https://github.com/google/boringssl/blob/082e953a134ad423a00b8859f9daf5708e729260/ssl/tls_record.cc#L257