mirror of
https://github.com/Mbed-TLS/mbedtls.git
synced 2026-08-09 12:47:49 +00:00
Merge pull request #10853 from nvxbug/tls12-session-id-bounds-3.6
Backport 3.6: Reject out-of-bounds session ID length in ssl_tls12_session_load
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
Bugfix
|
||||
* Reject serialized TLS 1.2 sessions whose session ID length exceeds 32,
|
||||
instead of accepting an out-of-range length that is later used to read
|
||||
past the end of the 32-byte session ID buffer.
|
||||
@@ -3652,6 +3652,9 @@ static int ssl_tls12_session_load(mbedtls_ssl_session *session,
|
||||
}
|
||||
|
||||
session->id_len = *p++;
|
||||
if (session->id_len > sizeof(session->id)) {
|
||||
return MBEDTLS_ERR_SSL_BAD_INPUT_DATA;
|
||||
}
|
||||
memcpy(session->id, p, 32);
|
||||
p += 32;
|
||||
|
||||
|
||||
@@ -3200,17 +3200,24 @@ depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_SSL_SESSION_TICKETS:MBEDTLS_SSL_SRV_
|
||||
ssl_serialize_session_load_buf_size:0:"":MBEDTLS_SSL_IS_SERVER:MBEDTLS_SSL_VERSION_TLS1_3
|
||||
|
||||
TLS 1.3: Session serialization rejects trailing data
|
||||
depends_on:MBEDTLS_SSL_CLI_C
|
||||
ssl_tls13_session_load_rejects_bad_serialized_data:MBEDTLS_SSL_IS_CLIENT:TEST_TLS13_SESSION_LOAD_TRAILING_DATA
|
||||
depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_SSL_SESSION_TICKETS:MBEDTLS_SSL_CLI_C
|
||||
ssl_session_load_rejects_bad_serialized_data:MBEDTLS_SSL_VERSION_TLS1_3:MBEDTLS_SSL_IS_CLIENT:TEST_SESSION_LOAD_TRAILING_DATA
|
||||
|
||||
TLS 1.3: Session serialization rejects hostname without terminator
|
||||
depends_on:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SERVER_NAME_INDICATION
|
||||
ssl_tls13_session_load_rejects_bad_serialized_data:MBEDTLS_SSL_IS_CLIENT:TEST_TLS13_SESSION_LOAD_HOSTNAME_NO_NUL
|
||||
depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_SSL_SESSION_TICKETS:MBEDTLS_SSL_CLI_C:MBEDTLS_SSL_SERVER_NAME_INDICATION
|
||||
ssl_session_load_rejects_bad_serialized_data:MBEDTLS_SSL_VERSION_TLS1_3:MBEDTLS_SSL_IS_CLIENT:TEST_TLS13_SESSION_LOAD_HOSTNAME_NO_NUL
|
||||
|
||||
TLS 1.3: Session serialization rejects ALPN without terminator
|
||||
depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_ALPN
|
||||
ssl_tls13_session_load_rejects_bad_serialized_data:MBEDTLS_SSL_IS_SERVER:TEST_TLS13_SESSION_LOAD_ALPN_NO_NUL
|
||||
depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_SSL_SESSION_TICKETS:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_EARLY_DATA:MBEDTLS_SSL_ALPN
|
||||
ssl_session_load_rejects_bad_serialized_data:MBEDTLS_SSL_VERSION_TLS1_3:MBEDTLS_SSL_IS_SERVER:TEST_TLS13_SESSION_LOAD_ALPN_NO_NUL
|
||||
|
||||
TLS 1.2: Session serialization rejects out-of-bounds session ID length (client)
|
||||
depends_on:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_SSL_CLI_C
|
||||
ssl_session_load_rejects_bad_serialized_data:MBEDTLS_SSL_VERSION_TLS1_2:MBEDTLS_SSL_IS_CLIENT:TEST_TLS12_SESSION_LOAD_OOB_ID_LEN
|
||||
|
||||
TLS 1.2: Session serialization rejects out-of-bounds session ID length (server)
|
||||
depends_on:MBEDTLS_SSL_PROTO_TLS1_2:MBEDTLS_SSL_SRV_C
|
||||
ssl_session_load_rejects_bad_serialized_data:MBEDTLS_SSL_VERSION_TLS1_2:MBEDTLS_SSL_IS_SERVER:TEST_TLS12_SESSION_LOAD_OOB_ID_LEN
|
||||
|
||||
Test configuration of EC groups through mbedtls_ssl_conf_curves()
|
||||
conf_curve:
|
||||
|
||||
@@ -22,10 +22,11 @@
|
||||
#define TEST_EARLY_DATA_NO_INITIAL_ALPN 6
|
||||
#define TEST_EARLY_DATA_NO_LATER_ALPN 7
|
||||
|
||||
/* Mutations for ssl_tls13_session_load_rejects_bad_serialized_data */
|
||||
#define TEST_TLS13_SESSION_LOAD_TRAILING_DATA 0
|
||||
/* Mutations for ssl_session_load_rejects_bad_serialized_data */
|
||||
#define TEST_SESSION_LOAD_TRAILING_DATA 0
|
||||
#define TEST_TLS13_SESSION_LOAD_HOSTNAME_NO_NUL 1
|
||||
#define TEST_TLS13_SESSION_LOAD_ALPN_NO_NUL 2
|
||||
#define TEST_TLS12_SESSION_LOAD_OOB_ID_LEN 3
|
||||
|
||||
#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
|
||||
defined(MBEDTLS_SSL_SESSION_TICKETS) && \
|
||||
@@ -2889,9 +2890,10 @@ exit:
|
||||
}
|
||||
/* END_CASE */
|
||||
|
||||
/* BEGIN_CASE depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_SSL_SESSION_TICKETS */
|
||||
void ssl_tls13_session_load_rejects_bad_serialized_data(int endpoint_type,
|
||||
int mutation)
|
||||
/* BEGIN_CASE */
|
||||
void ssl_session_load_rejects_bad_serialized_data(int tls_version,
|
||||
int endpoint_type,
|
||||
int mutation)
|
||||
{
|
||||
mbedtls_ssl_session session, restored;
|
||||
unsigned char *buf = NULL;
|
||||
@@ -2902,12 +2904,34 @@ void ssl_tls13_session_load_rejects_bad_serialized_data(int endpoint_type,
|
||||
const unsigned char *string_to_corrupt = NULL;
|
||||
size_t string_len = 0;
|
||||
|
||||
(void) hostname;
|
||||
(void) alpn;
|
||||
|
||||
mbedtls_ssl_session_init(&session);
|
||||
mbedtls_ssl_session_init(&restored);
|
||||
USE_PSA_INIT();
|
||||
|
||||
TEST_EQUAL(mbedtls_test_ssl_tls13_populate_session(
|
||||
&session, 42, endpoint_type), 0);
|
||||
switch (tls_version) {
|
||||
#if defined(MBEDTLS_SSL_PROTO_TLS1_2)
|
||||
case MBEDTLS_SSL_VERSION_TLS1_2:
|
||||
TEST_EQUAL(mbedtls_test_ssl_tls12_populate_session(
|
||||
&session, 0, endpoint_type, NULL), 0);
|
||||
/* Sentinel session ID so we can locate the length byte later.
|
||||
* The detection code below relies on id_len being exactly
|
||||
* sizeof(session.id), so force it. */
|
||||
memset(session.id, 0x5A, sizeof(session.id));
|
||||
session.id_len = sizeof(session.id);
|
||||
break;
|
||||
#endif
|
||||
#if defined(MBEDTLS_SSL_PROTO_TLS1_3) && defined(MBEDTLS_SSL_SESSION_TICKETS)
|
||||
case MBEDTLS_SSL_VERSION_TLS1_3:
|
||||
TEST_EQUAL(mbedtls_test_ssl_tls13_populate_session(
|
||||
&session, 42, endpoint_type), 0);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
TEST_FAIL("unsupported TLS version");
|
||||
}
|
||||
|
||||
TEST_EQUAL(mbedtls_ssl_session_save(&session, NULL, 0, &len),
|
||||
MBEDTLS_ERR_SSL_BUFFER_TOO_SMALL);
|
||||
@@ -2922,7 +2946,7 @@ void ssl_tls13_session_load_rejects_bad_serialized_data(int endpoint_type,
|
||||
|
||||
bad_len = len;
|
||||
switch (mutation) {
|
||||
case TEST_TLS13_SESSION_LOAD_TRAILING_DATA:
|
||||
case TEST_SESSION_LOAD_TRAILING_DATA:
|
||||
bad_len = len + 1;
|
||||
buf[len] = 0;
|
||||
break;
|
||||
@@ -2937,6 +2961,28 @@ void ssl_tls13_session_load_rejects_bad_serialized_data(int endpoint_type,
|
||||
string_len = sizeof(alpn);
|
||||
break;
|
||||
|
||||
case TEST_TLS12_SESSION_LOAD_OOB_ID_LEN:
|
||||
/* The format writes [id_len][32 id bytes]; find the length byte
|
||||
* that precedes the sentinel run and push it out of range. */
|
||||
for (i = 1; i + sizeof(session.id) <= len; i++) {
|
||||
size_t k = 0;
|
||||
if (buf[i - 1] != (unsigned char) sizeof(session.id)) {
|
||||
continue;
|
||||
}
|
||||
while (k < sizeof(session.id) && buf[i + k] == 0x5A) {
|
||||
k++;
|
||||
}
|
||||
if (k == sizeof(session.id)) {
|
||||
field = buf + i - 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
TEST_ASSERT(field != NULL);
|
||||
/* Smallest value strictly greater than sizeof(id). */
|
||||
*field = (unsigned char) (sizeof(session.id) + 1);
|
||||
field = NULL;
|
||||
break;
|
||||
|
||||
default:
|
||||
TEST_ASSERT(0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user