
MatrixSSL-Session-Resume-Bug
MatrixSSL-Fehler bei der Sitzungswiederaufnahme
Ein Problem in MatrixSSL 4.5.1-open und früheren Versionen führt zu einer fehlenden sicheren Überprüfung des SessionID-Felds, was den Missbrauch eines aus Nullen bestehenden MasterSecret ermöglicht, mit dem geheime Daten entschlüsselt werden können.
MatrixSSL 4.5.1-open und frühere
TLS-Sitzungswiederaufnahme-Entschlüsselung
Der MatrixSSL-Server speichert ausgehandelte Sitzungsinformationen in einer 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;
Die ersten vier Bytes des SessionID-Felds sind eine Little-Endian-Sequenznummer im Bereich von 0 bis 31.

MatrixSSL bestimmt, ob eine Sitzung wiederaufgenommen wird, indem es die Länge der empfangenen Session-ID mit dem Vier-Byte-Schnellindex abgleicht.
Wenn die Speicherliste initialisiert wird, besteht MasterSecret jedoch aus lauter Nullen.
Daher kann ein bösartiger Client eine Ein-Byte-SessionID senden, um eine Sitzungswiederaufnahme mit einem MasterSecret aus lauter Nullen zu erreichen. Wenn der Server eine ein Byte große Session-ID empfängt, werden die nachfolgenden Bytes standardmäßig auf 0 gesetzt. Daher kann sie validiert und in der Liste indiziert werden, und das dieser Sequenznummer in der Liste entsprechende MasterSecret kann noch immer 0 sein. Wenn dies geschieht, können wir den Schlüssel berechnen und die TLS-Kommunikationsdaten entschlüsseln.
./matrixssl/matrixssl.c —> int32 matrixResumeSession(ssl_t *ssl)


Konsolenausgabe zum Debuggen hinzufügen :

Testergebnis :


Mit einem MasterSecret aus lauter Nullen entschlüsseln !
