mirror of
				https://github.com/Mbed-TLS/mbedtls.git
				synced 2025-11-03 20:33:16 +03:00 
			
		
		
		
	Zeroize local AES variables before exiting the function
This issue has been reported by Tuba Yavuz, Farhaan Fowze, Ken (Yihang) Bai, Grant Hernandez, and Kevin Butler (University of Florida) and Dave Tian (Purdue University). In AES encrypt and decrypt some variables were left on the stack. The value of these variables can be used to recover the last round key. To follow best practice and to limit the impact of buffer overread vulnerabilities (like Heartbleed) we need to zeroize them before exiting the function.
This commit is contained in:
		
							
								
								
									
										10
									
								
								ChangeLog
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								ChangeLog
									
									
									
									
									
								
							@@ -2,6 +2,16 @@ mbed TLS ChangeLog (Sorted per branch, date)
 | 
			
		||||
 | 
			
		||||
= mbed TLS 2.16.x branch released xxxx-xx-xx
 | 
			
		||||
 | 
			
		||||
Security
 | 
			
		||||
   * Zeroize local variables in mbedtls_internal_aes_encrypt() and
 | 
			
		||||
     mbedtls_internal_aes_decrypt() before exiting the function. The value of
 | 
			
		||||
     these variables can be used to recover the last round key. To follow best
 | 
			
		||||
     practice and to limit the impact of buffer overread vulnerabilities (like
 | 
			
		||||
     Heartbleed) we need to zeroize them before exiting the function.
 | 
			
		||||
     Issue reported by Tuba Yavuz, Farhaan Fowze, Ken (Yihang) Bai,
 | 
			
		||||
     Grant Hernandez, and Kevin Butler (University of Florida) and
 | 
			
		||||
     Dave Tian (Purdue University).
 | 
			
		||||
 | 
			
		||||
Bugfix
 | 
			
		||||
   * Remove redundant line for getting the bitlen of a bignum, since the variable
 | 
			
		||||
     holding the returned value is overwritten a line after.
 | 
			
		||||
 
 | 
			
		||||
@@ -918,6 +918,18 @@ int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
 | 
			
		||||
    PUT_UINT32_LE( X2, output,  8 );
 | 
			
		||||
    PUT_UINT32_LE( X3, output, 12 );
 | 
			
		||||
 | 
			
		||||
    mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
 | 
			
		||||
 | 
			
		||||
    mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
 | 
			
		||||
 | 
			
		||||
    mbedtls_platform_zeroize( &RK, sizeof( RK ) );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
#endif /* !MBEDTLS_AES_ENCRYPT_ALT */
 | 
			
		||||
@@ -986,6 +998,18 @@ int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
 | 
			
		||||
    PUT_UINT32_LE( X2, output,  8 );
 | 
			
		||||
    PUT_UINT32_LE( X3, output, 12 );
 | 
			
		||||
 | 
			
		||||
    mbedtls_platform_zeroize( &X0, sizeof( X0 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &X1, sizeof( X1 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &X2, sizeof( X2 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &X3, sizeof( X3 ) );
 | 
			
		||||
 | 
			
		||||
    mbedtls_platform_zeroize( &Y0, sizeof( Y0 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &Y1, sizeof( Y1 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &Y2, sizeof( Y2 ) );
 | 
			
		||||
    mbedtls_platform_zeroize( &Y3, sizeof( Y3 ) );
 | 
			
		||||
 | 
			
		||||
    mbedtls_platform_zeroize( &RK, sizeof( RK ) );
 | 
			
		||||
 | 
			
		||||
    return( 0 );
 | 
			
		||||
}
 | 
			
		||||
#endif /* !MBEDTLS_AES_DECRYPT_ALT */
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user