
Bug nella ripresa della sessione MatrixSSL
Bug di ripresa della sessione in MatrixSSL
Un problema in MatrixSSL 4.5.1-open e versioni precedenti porta al mancato controllo sicuro del campo SessionID, con conseguente uso improprio di un MasterSecret tutto a zero che può decrittare dati segreti.
MatrixSSL 4.5.1-open e versioni precedenti
decrittazione della sessione di ripresa tls
Il server matrixssl memorizza le informazioni sulla sessione negoziata tramite 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;
I primi quattro byte del campo SessionID sono un numero di sequenza little-endian che va da 0 a 31.

Matrixssl determina se la sessione è una sessione di ripresa confrontando la lunghezza dell'ID di sessione ricevuto con l'indice rapido di quattro byte.
Tuttavia, quando la lista di memorizzazione viene inizializzata, MasterSecret è tutto a zero.
Pertanto, il Client malintenzionato può inviare un SessionID di un byte per la ripresa della sessione con MasterSecret tutto a zero. Quando il server riceve un sessionid di un singolo byte, i byte successivi vengono impostati per impostazione predefinita a 0. Quindi, può essere convalidato e indicizzato nella lista, e il MasterSecret corrispondente a quel numero di sequenza nella lista può essere ancora 0. Se ciò accade, possiamo calcolare la chiave e decrittare i dati di comunicazione TLS.
./matrixssl/matrixssl.c —> int32 matrixResumeSession(ssl_t *ssl)


Aggiunta dell'output console per il debug :

Risultato del test :


Usare un MasterSecret tutto a zero per decrittare !
