From 94aeefe8204bec5e0792c8dd7e6296f5ac43f242 Mon Sep 17 00:00:00 2001 From: yuhan6665 <1588741+yuhan6665@users.noreply.github.com> Date: Thu, 10 Sep 2026 23:24:37 -0400 Subject: [PATCH] crypto/tls: reject known extensions in disallowed handshake messages Change-Id: I9f3d9f3575359fb4730e0fb278d2d6a16a6a6964 Reviewed-on: https://go-review.googlesource.com/c/go/+/804180 Reviewed-by: Carlos Amedee Reviewed-by: Roland Shoemaker Auto-Submit: Filippo Valsorda LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com Reviewed-by: Daniel McCarney --- handshake_messages.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/handshake_messages.go b/handshake_messages.go index 610c857..cf3c149 100644 --- a/handshake_messages.go +++ b/handshake_messages.go @@ -1107,6 +1107,16 @@ func (m *encryptedExtensionsMsg) unmarshal(data []byte) bool { return false } m.serverNameAck = true + case extensionStatusRequest, extensionSupportedPoints, + extensionSignatureAlgorithms, extensionSCT, + extensionExtendedMasterSecret, extensionSessionTicket, + extensionPreSharedKey, extensionSupportedVersions, + extensionCookie, extensionPSKModes, + extensionCertificateAuthorities, extensionSignatureAlgorithmsCert, + extensionKeyShare, extensionRenegotiationInfo, + extensionECHOuterExtensions: + // Not allowed in EncryptedExtensions. + return false default: // Ignore unknown extensions. continue @@ -1231,6 +1241,18 @@ func (m *newSessionTicketMsgTLS13) unmarshal(data []byte) bool { if !extData.ReadUint32(&m.maxEarlyData) { return false } + case extensionServerName, extensionStatusRequest, + extensionSupportedCurves, extensionSupportedPoints, + extensionSignatureAlgorithms, extensionALPN, extensionSCT, + extensionExtendedMasterSecret, extensionSessionTicket, + extensionPreSharedKey, extensionSupportedVersions, + extensionCookie, extensionPSKModes, + extensionCertificateAuthorities, extensionSignatureAlgorithmsCert, + extensionKeyShare, extensionQUICTransportParameters, + extensionRenegotiationInfo, extensionECHOuterExtensions, + extensionEncryptedClientHello: + // Not allowed in TLS 1.3 NewSessionTicket. + return false default: // Ignore unknown extensions. continue @@ -1375,6 +1397,15 @@ func (m *certificateRequestMsgTLS13) unmarshal(data []byte) bool { } m.certificateAuthorities = append(m.certificateAuthorities, ca) } + case extensionSupportedCurves, extensionSupportedPoints, + extensionALPN, extensionExtendedMasterSecret, + extensionSessionTicket, extensionPreSharedKey, + extensionEarlyData, extensionSupportedVersions, + extensionCookie, extensionPSKModes, extensionKeyShare, + extensionQUICTransportParameters, extensionRenegotiationInfo, + extensionECHOuterExtensions, extensionEncryptedClientHello: + // Not allowed in TLS 1.3 CertificateRequest. + return false default: // Ignore unknown extensions. continue @@ -1585,6 +1616,18 @@ func unmarshalCertificate(s *cryptobyte.String, certificate *Certificate) bool { certificate.SignedCertificateTimestamps = append( certificate.SignedCertificateTimestamps, sct) } + case extensionServerName, extensionSupportedCurves, + extensionSupportedPoints, extensionSignatureAlgorithms, + extensionALPN, extensionExtendedMasterSecret, + extensionSessionTicket, extensionPreSharedKey, + extensionEarlyData, extensionSupportedVersions, + extensionCookie, extensionPSKModes, + extensionCertificateAuthorities, extensionSignatureAlgorithmsCert, + extensionKeyShare, extensionQUICTransportParameters, + extensionRenegotiationInfo, extensionECHOuterExtensions, + extensionEncryptedClientHello: + // Not allowed in Certificate. + return false default: // Ignore unknown extensions. continue