
Bogue de reprise de session MatrixSSL
Bug de reprise de session MatrixSSL
Un problème dans MatrixSSL 4.5.1-open et versions antérieures conduit à une vérification non sécurisée du champ SessionID, entraînant l'utilisation d'un MasterSecret tout à zéro qui peut décrypter des données secrètes.
MatrixSSL 4.5.1-open et versions antérieures
Décryptage de session de reprise TLS
Le serveur matrixssl stocke les informations de session négociées via une liste.
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;
Les quatre premiers octets du champ SessionID sont un nombre de séquence little-endian allant de 0 à 31.

Matrixssl détermine si la session est une session de reprise en faisant correspondre la longueur de l'ID de session reçu avec l'index rapide de quatre octets.
Cependant, lorsque la liste de stockage est initialisée, MasterSecret est tout à zéro.
Par conséquent, le Client malveillant peut envoyer un SessionID d'un octet pour une reprise de session avec MasterSecret tout à zéro. Lorsque le serveur reçoit un sessionid d'un seul octet, les octets suivants prennent par défaut la valeur 0. Ainsi, il peut être validé et indexé dans la liste, et le MasterSecret correspondant à ce numéro de séquence dans la liste peut encore être 0. Si cela se produit, nous pouvons calculer la clé et décrypter les données de communication TLS.
./matrixssl/matrixssl.c —> int32 matrixResumeSession(ssl_t *ssl)


Ajout d'une sortie console pour le débogage :

Résultat du test :


Utilisation d'un MasterSecret tout à zéro pour décrypter !
