
MatrixSSL 세션 재개 버그
MatrixSSL 세션 재개 버그
MatrixSSL 4.5.1-open 및 이전 버전의 문제로 인해 SessionID 필드가 안전하게 검사되지 않아 모두 0인 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 필드의 처음 4바이트는 0부터 31까지의 리틀 엔디언 시퀀스 번호입니다.

MatrixSSL은 수신된 세션 ID의 길이를 4바이트 빠른 인덱스와 일치시켜 세션이 재개 세션인지 판단합니다.
그러나 저장 리스트가 초기화되면 MasterSecret은 모두 0입니다.
따라서 악의적인 클라이언트는 1바이트 SessionID를 보내 모두 0인 MasterSecret을 사용한 세션 재개를 시도할 수 있습니다. 서버가 단일 바이트 세션 ID를 수신하면 나머지 바이트는 기본적으로 0이 됩니다. 따라서 유효성 검사를 통과하고 리스트로 인덱싱될 수 있으며, 리스트에서 해당 시퀀스 번호에 해당하는 MasterSecret이 여전히 0일 수 있습니다. 이런 경우 키를 계산하고 TLS 통신 데이터를 복호화할 수 있습니다.
./matrixssl/matrixssl.c —> int32 matrixResumeSession(ssl_t *ssl)


디버그를 위한 콘솔 출력 추가 :

테스트 결과 :


모두 0인 MasterSecret을 사용하여 복호화 !
