aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGilles Peskine <Gilles.Peskine@arm.com>2021-12-10 21:33:21 +0100
committerGilles Peskine <Gilles.Peskine@arm.com>2021-12-11 14:24:23 +0100
commitd8e2e8347b4a7514d310e6c629aa3a71d9d5f857 (patch)
tree8c92298484c458010c9541048bf63e57f4750d41
parent9e8f3a6b71776a1f9647f6452e4b11d2573e02ae (diff)
downloadmbedtls-d8e2e8347b4a7514d310e6c629aa3a71d9d5f857.zip
mbedtls-d8e2e8347b4a7514d310e6c629aa3a71d9d5f857.tar.gz
mbedtls-d8e2e8347b4a7514d310e6c629aa3a71d9d5f857.tar.bz2
Zeroize local MAC variables
Zeroize local MAC variables used for CBC+HMAC cipher suites. In encryption, this is just good hygiene but probably not needed for security since the data protected by the MAC that could leak is about to be transmitted anyway. In DTLS decryption, this could be a security issue since an adversary could learn the MAC of data that they were trying to inject. At least with encrypt-then-MAC, the adversary could then easily inject a datagram with a corrected packet. TLS would still be safe since the receiver would close the connection after the bad MAC. Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
-rw-r--r--ChangeLog.d/ssl-mac-zeroize.txt5
-rw-r--r--library/ssl_msg.c20
2 files changed, 23 insertions, 2 deletions
diff --git a/ChangeLog.d/ssl-mac-zeroize.txt b/ChangeLog.d/ssl-mac-zeroize.txt
new file mode 100644
index 0000000..b49c7ac
--- /dev/null
+++ b/ChangeLog.d/ssl-mac-zeroize.txt
@@ -0,0 +1,5 @@
+Security
+ * Zeroize intermediate variables used to calculate the MAC in CBC cipher
+ suites. This hardens the library in case stack memory leaks through a
+ memory disclosure vulnerabilty, which could formerly have allowed a
+ man-in-the-middle to inject fake ciphertext into a DTLS connection.
diff --git a/library/ssl_msg.c b/library/ssl_msg.c
index 928d6fc..ce0fd4d 100644
--- a/library/ssl_msg.c
+++ b/library/ssl_msg.c
@@ -717,6 +717,7 @@ int mbedtls_ssl_encrypt_buf( mbedtls_ssl_context *ssl,
ssl_mac( &transform->md_ctx_enc, transform->mac_enc,
data, rec->data_len, rec->ctr, rec->type, mac );
memcpy( data + rec->data_len, mac, transform->maclen );
+ mbedtls_platform_zeroize( mac, transform->maclen );
}
else
#endif
@@ -737,6 +738,7 @@ int mbedtls_ssl_encrypt_buf( mbedtls_ssl_context *ssl,
mbedtls_md_hmac_reset( &transform->md_ctx_enc );
memcpy( data + rec->data_len, mac, transform->maclen );
+ mbedtls_platform_zeroize( mac, transform->maclen );
}
else
#endif
@@ -1021,6 +1023,7 @@ int mbedtls_ssl_encrypt_buf( mbedtls_ssl_context *ssl,
rec->data_len += transform->maclen;
post_avail -= transform->maclen;
auth_done++;
+ mbedtls_platform_zeroize( mac, transform->maclen );
}
#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
}
@@ -1305,13 +1308,20 @@ int mbedtls_ssl_decrypt_buf( mbedtls_ssl_context const *ssl,
transform->maclen );
/* Compare expected MAC with MAC at the end of the record. */
+ ret = 0;
if( mbedtls_ct_memcmp( data + rec->data_len, mac_expect,
transform->maclen ) != 0 )
{
MBEDTLS_SSL_DEBUG_MSG( 1, ( "message mac does not match" ) );
- return( MBEDTLS_ERR_SSL_INVALID_MAC );
+ ret = MBEDTLS_ERR_SSL_INVALID_MAC;
+ goto hmac_failed_etm_enabled;
}
auth_done++;
+
+ hmac_failed_etm_enabled:
+ mbedtls_platform_zeroize( mac_expect, transform->maclen );
+ if( ret != 0 )
+ return( ret );
}
#endif /* MBEDTLS_SSL_ENCRYPT_THEN_MAC */
@@ -1562,7 +1572,7 @@ int mbedtls_ssl_decrypt_buf( mbedtls_ssl_context const *ssl,
if( ret != 0 )
{
MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_ct_hmac", ret );
- return( ret );
+ goto hmac_failed_etm_disabled;
}
mbedtls_ct_memcpy_offset( mac_peer, data,
@@ -1592,6 +1602,12 @@ int mbedtls_ssl_decrypt_buf( mbedtls_ssl_context const *ssl,
correct = 0;
}
auth_done++;
+
+ hmac_failed_etm_disabled:
+ mbedtls_platform_zeroize( mac_peer, transform->maclen );
+ mbedtls_platform_zeroize( mac_expect, transform->maclen );
+ if( ret != 0 )
+ return( ret );
}
/*