
خطأ استئناف الجلسة في 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 المقابل لذلك الرقم التسلسلي في القائمة صفرًا. إذا حدث هذا، يمكننا حساب المفتاح وفك تشفير بيانات اتصال TLS.
./matrixssl/matrixssl.c —> int32 matrixResumeSession(ssl_t *ssl)


إضافة مخرجات وحدة التحكم للتصحيح :

نتيجة الاختبار :


استخدم MasterSecret المكوّن من أصفار بالكامل لفك التشفير !
