
MatrixSSL ошибка возобновления сессии
Ошибка возобновления сеанса MatrixSSL
Ошибка в MatrixSSL 4.5.1-open и более ранних версиях приводит к невозможности безопасной проверки поля SessionID, что приводит к неправильному использованию нулевого MasterSecret, который может расшифровать секретные данные.
MatrixSSL 4.5.1-open и более ранние
расшифровка возобновления сеанса tls
Сервер matrixssl хранит согласованную информацию о сеансе через список.
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;
Первые четыре байта поля SessionID представляют собой порядковый номер little-endian в диапазоне от 0 до 31.

Matrixssl определяет, является ли сеанс возобновляемым, сопоставляя длину полученного идентификатора сеанса с четырехбайтовым быстрым индексом.
Однако, когда список хранения инициализируется, MasterSecret состоит из нулей.
Следовательно, вредоносный клиент может отправить однобайтовый SessionID для возобновления сеанса с нулевым MasterSecret. Когда сервер получает однобайтовый sessionid, следующие байты по умолчанию равны 0. Таким образом, он может быть проверен и проиндексирован в списке, и MasterSecret, соответствующий этому порядковому номеру в списке, может все еще быть 0. Если это происходит, мы можем вычислить ключ и расшифровать данные связи TLS.
./matrixssl/matrixssl.c —> int32 matrixResumeSession(ssl_t *ssl)


Добавление вывода консоли для отладки:

Результат тестирования:


Используйте нулевой MasterSecret для расшифровки!
