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 フィールドの最初の 4 バイトは リトルエンディアン のシーケンス番号で、0 から 31 の範囲です。

MatrixSSL は、受信したセッション ID の長さを 4 バイトのクイックインデックスと照合することで、セッションが再開セッションかどうかを判断します。
しかし、ストレージリストが初期化されると、MasterSecret はすべてゼロになります。
したがって、悪意のあるクライアントは、すべてゼロの MasterSecret セッション再開のために 1 バイトの SessionID を送信できます。サーバーが 1 バイトの sessionid を受信すると、後続のバイトはデフォルトで 0 になります。そのため、検証されてリストにインデックスされ、リスト内のそのシーケンス番号に対応する MasterSecret がまだ 0 である可能性があります。これが発生した場合、キーを計算し、TLS 通信データを復号化できます。
./matrixssl/matrixssl.c —> int32 matrixResumeSession(ssl_t *ssl)


デバッグ用のコンソール出力を追加:

テスト結果:


すべてゼロの MasterSecret を使用して復号化!
