
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 फ़ील्ड के पहले चार बाइट 0 से 31 तक एक लिटिल-एंडियन क्रमांक हैं।

Matrixssl सत्र आईडी की लंबाई और चार-बाइट त्वरित सूचकांक के मिलान के द्वारा यह निर्धारित करता है कि सत्र पुनरारंभ सत्र है या नहीं।
हालाँकि, जब भंडारण सूची आरंभ की जाती है, तो MasterSecret सभी शून्य होता है।
इसलिए, दुर्भावनापूर्ण क्लाइंट सभी-शून्य MasterSecret सत्र पुनरारंभ के लिए एक-बाइट SessionID भेज सकता है। जब सर्वर एकल बाइट sessionid प्राप्त करता है, तो निम्नलिखित बाइट डिफ़ॉल्ट रूप से 0 हो जाते हैं। इसलिए, इसे मान्य किया जा सकता है और सूची में अनुक्रमित किया जा सकता है, और सूची में उस क्रमांक के अनुरूप MasterSecret अभी भी 0 हो सकता है। यदि ऐसा होता है, तो हम कुंजी की गणना कर सकते हैं और TLS संचार डेटा को डिक्रिप्ट कर सकते हैं।
./matrixssl/matrixssl.c —> int32 matrixResumeSession(ssl_t *ssl)


डिबग के लिए कंसोल आउटपुट जोड़ना :

परीक्षण परिणाम :


सभी-शून्य MasterSecret का उपयोग करके डिक्रिप्ट करें !
