
MatrixSSL bug de retomada de sessão
MatrixSSL bug de retomada de sessão
Um problema no MatrixSSL 4.5.1-open e anteriores leva à falha em verificar seguramente o campo SessionID, resultando no mau uso de um MasterSecret todo zero que pode descriptografar dados secretos.
MatrixSSL 4.5.1-open e anteriores
descriptografia de retomada de sessão tls
O servidor matrixssl armazena informações de sessão negociadas através de uma 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;
Os primeiros quatro bytes do campo SessionID são um número de sequência little-endian variando de 0 a 31.

O Matrixssl determina se a sessão é uma retomada de sessão ao comparar o comprimento do ID de sessão recebido com o índice rápido de quatro bytes.
No entanto, quando a lista de armazenamento é inicializada, o MasterSecret é todo zero.
Portanto, o Cliente malicioso pode enviar um SessionID de um byte para retomada de sessão com MasterSecret todo zero. Quando o servidor recebe um sessionid de um único byte, os bytes seguintes são padrão 0. Assim, ele pode ser validado e indexado à lista, e o MasterSecret correspondente àquele número de sequência na lista pode ainda ser 0. Se isso acontecer, podemos calcular a chave e descriptografar os dados de comunicação TLS.
./matrixssl/matrixssl.c —> int32 matrixResumeSession(ssl_t *ssl)


Adicionando saída de console para depuração :

Resultado do teste :


Use MasterSecret todo zero para descriptografar !
