Reject trailing data in ClientHello and EncryptedExtensions trust_anchors Bug: 505803427 Change-Id: Ia88e6a12de7ceefad686336272447789b4ecffe3 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/93969 Reviewed-by: Lily Chen <chlily@google.com> Auto-Submit: David Benjamin <davidben@google.com> Presubmit-BoringSSL-Verified: boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com <boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com> Commit-Queue: Lily Chen <chlily@google.com>
diff --git a/ssl/extensions.cc b/ssl/extensions.cc index 640001a..7a93e93 100644 --- a/ssl/extensions.cc +++ b/ssl/extensions.cc
@@ -2865,7 +2865,8 @@ CBS child; if (!CBS_get_u16_length_prefixed(contents, &child) || - !ssl_is_valid_trust_anchor_list(child)) { + !ssl_is_valid_trust_anchor_list(child) || // + CBS_len(contents) != 0) { *out_alert = SSL_AD_DECODE_ERROR; OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR); return false; @@ -2937,8 +2938,9 @@ CBS child; if (!CBS_get_u16_length_prefixed(contents, &child) || // The list of available trust anchors may not be empty. - CBS_len(&child) == 0 || // - !ssl_is_valid_trust_anchor_list(child)) { + CBS_len(&child) == 0 || // + !ssl_is_valid_trust_anchor_list(child) || // + CBS_len(contents) != 0) { *out_alert = SSL_AD_DECODE_ERROR; OPENSSL_PUT_ERROR(SSL, SSL_R_DECODE_ERROR); return false;
diff --git a/ssl/test/runner/extension_tests.go b/ssl/test/runner/extension_tests.go index 1d39e5d..ab9b0b0 100644 --- a/ssl/test/runner/extension_tests.go +++ b/ssl/test/runner/extension_tests.go
@@ -2501,6 +2501,54 @@ expectedError: ":ERROR_PARSING_EXTENSION:", expectedLocalError: "remote error: error decoding message", }) + + testCases = append(testCases, testCase{ + protocol: protocol, + testType: clientTest, + name: "ExtensionTrailingData-TrustAnchors-EncryptedExtensions-Client-" + suffix, + config: Config{ + MaxVersion: ver.version, + AvailableTrustAnchors: [][]byte{{1}}, + Bugs: ProtocolBugs{ + ExtensionsWithTrailingData: []uint16{extensionTrustAnchors}, + }, + }, + flags: []string{"-requested-trust-anchors", trustAnchorListFlagValue([]byte{2})}, + shouldFail: true, + expectedError: ":ERROR_PARSING_EXTENSION:", + expectedLocalError: "remote error: error decoding message", + }) + testCases = append(testCases, testCase{ + protocol: protocol, + testType: clientTest, + name: "ExtensionTrailingData-TrustAnchors-Certificate-Client-" + suffix, + config: Config{ + MaxVersion: ver.version, + Bugs: ProtocolBugs{ + AlwaysMatchTrustAnchorID: true, + ExtensionsWithTrailingData: []uint16{extensionTrustAnchors}, + }, + }, + flags: []string{"-requested-trust-anchors", trustAnchorListFlagValue([]byte{2})}, + shouldFail: true, + expectedError: ":ERROR_PARSING_EXTENSION:", + expectedLocalError: "remote error: error decoding message", + }) + testCases = append(testCases, testCase{ + protocol: protocol, + testType: serverTest, + name: "ExtensionTrailingData-TrustAnchors-ClientHello-Server-" + suffix, + config: Config{ + MaxVersion: ver.version, + RequestTrustAnchors: [][]byte{{1}}, + Bugs: ProtocolBugs{ + ExtensionsWithTrailingData: []uint16{extensionTrustAnchors}, + }, + }, + shouldFail: true, + expectedError: ":ERROR_PARSING_EXTENSION:", + expectedLocalError: "remote error: error decoding message", + }) } } }