
MatrixSSL error de reanudación de sesión
Error de reanudación de sesión en MatrixSSL
Un problema en MatrixSSL 4.5.1-open y anteriores provoca un fallo al verificar de forma segura el campo SessionID, resultando en el uso indebido de un MasterSecret todo ceros que puede descifrar datos secretos.
MatrixSSL 4.5.1-open y anteriores
descifrado de sesión reanudada TLS
El servidor matrixssl almacena la información de sesión negociada a través de una lista.
static sslSessionEntry_t g_sessionTable[SSL_SESSION_TABLE_SIZE];
// SSL_SESSION_TABLE_SIZE is 32
typedef struct
{
unsigned char id[SSL_MAX_SESSION_ID_SIZE]; // 32
unsigned char masterSecret[SSL_HS_MASTER_SIZE]; // 48
const sslCipherSpec_t *cipher;
unsigned char majVer;
unsigned char minVer;
short extendedMasterSecret; /* was the extension used? */
psTime_t startTime;
int32 inUse;
DLListEntry chronList;
} sslSessionEntry_t;
Los primeros cuatro bytes del campo SessionID son un número en secuencia little-endian que va de 0 a 31.

Matrixssl determina si la sesión es una sesión reanudada comparando la longitud del ID de sesión recibido con el índice rápido de cuatro bytes.
Sin embargo, cuando la lista de almacenamiento se inicializa, MasterSecret es todo ceros.
Por lo tanto, un Cliente malicioso puede enviar un SessionID de un byte para la reanudación de sesión con MasterSecret todo ceros. Cuando el servidor recibe un sessionid de un solo byte, los bytes siguientes por defecto son 0. Por lo tanto, puede ser validado e indexado en la lista, y el MasterSecret correspondiente a ese número de secuencia en la lista aún puede ser 0. Si esto ocurre, podemos calcular la clave y descifrar los datos de comunicación TLS.
./matrixssl/matrixssl.c —> int32 matrixResumeSession(ssl_t *ssl)


Agregando salida de consola para depuración :

Resultado de la prueba :


¡Usar MasterSecret todo ceros para descifrar!
