الخلاصة
- نفّذ TLS مصافحة ثانية داخل قناة مشفّرة، لكنه لم يربط المصافحتين بدليل تشفيري واحد.
- أضاف RFC 5746 إثباتاً من رسائل Finished السابقة، ثم ألغى TLS 1.3 إعادة التفاوض من الأساس.
اتصال واحد ومصدران للبيانات
يبدأ المهاجم بإنشاء اتصال TLS صحيح مع الخادوم، ثم يرسل بادئة يختارها على مستوى التطبيق. قد تكون بداية طلب لا يكتمل معناه إلا بوصول بايتات لاحقة. بعد ذلك يمرّر المهاجم مصافحة TLS جديدة أطلقتها الضحية عبر الاتصال المشفّر القائم بينه وبين الخادوم.
ترى الضحية أنها تبدأ اتصالها الأول بالخادوم الحقيقي. أما الخادوم فيرى المصافحة نفسها على أنها إعادة تفاوض داخل اتصال المهاجم. بعد اكتمالها لا يستطيع المهاجم قراءة حركة الضحية التالية؛ السرية لم تختف كلياً. الخطأ في الإسناد: يستطيع الخادوم جمع بادئة المهاجم وبيانات الضحية الموثقة في تدفق تطبيقي واحد والتعامل معهما كفعل صادر عن هوية واحدة.
أوضح مخطط RFC 5746 أن استمرار النقل واستمرار التشفير واستمرار نص المحادثة ليست خاصية واحدة. بقاء اتصال TCP مفتوحاً لا يثبت أن البيانات الواقعة قبل انتقال الهوية وبعده لها المؤلف نفسه.
تحويل المصافحة السابقة إلى دليل
يحفظ الإصلاح حالة خاصة بكل اتصال: علماً يدل على استخدام إعادة تفاوض آمنة، وقيمتي verify_data اللتين أرسلهما العميل والخادوم في رسالتي Finished للمصافحة السابقة مباشرة. تثبت هاتان القيمتان أن الطرفين شاهدا نص تلك المصافحة بعينها.
عرّف RFC 5746 الامتداد renegotiation_info بالرقم 0xff01. يكون حقل الربط فارغاً في المصافحة الأولى، فيعلن الطرفان الدعم من دون اختلاق تاريخ سابق. عند إعادة التفاوض يحمل ClientHello قيمة العميل المحفوظة، ويحمل ServerHello قيمة العميل متبوعة بقيمة الخادوم. إذا غاب الامتداد أو لم تتطابق القيمة مع الذاكرة المحلية، يجب إنهاء المصافحة.
يستطيع المهاجم نقل مصافحة الضحية، لكنه لا يستطيع جعلها تحمل إثبات الاتصال السابق الذي أنشأه بنفسه. لذلك لا تُقبل المصافحة الثانية لمجرد أنها سارت داخل تشفير قائم؛ تُقبل لأنها تحدد تشفيرياً أي مصافحة تواصل.
عبء التوافق مع الأنظمة القديمة
كانت بعض التطبيقات القديمة تفشل عند رؤية امتداد ClientHello غير معروف، مع أن القواعد تطلب تجاهله. لذلك أنشأ RFC 5746 أيضاً الإشارة TLS_EMPTY_RENEGOTIATION_INFO_SCSV. تبدو كقيمة ضمن قائمة مجموعات التشفير، لكنها ليست مجموعة حقيقية ولا يمكن التفاوض عليها؛ وظيفتها أن تعبّر عن دعم الربط الفارغ بطريقة تتقبلها خواديم أقدم.
لم يزل ذلك كل الغموض. الخادوم الذي لا يؤكد الامتداد قد يسمح بإعادة تفاوض غير آمنة، أو قد يرفض كل إعادة تفاوض ويكون محمياً من دون أن يعلن ذلك. لا يستطيع العميل التمييز بين الحالتين من داخل TLS. إنهاء الاتصال يعطي ضماناً أقوى، وقبوله يحافظ على توافق أوسع. وهكذا أصبح غياب الدليل قراراً تشغيلياً يجب إظهاره، لا حالة محايدة.
TLS 1.3 يزيل الآلية
يحظر RFC 8446 إعادة التفاوض في TLS 1.3؛ وصول ClientHello في غير موضعه يفرض إنهاء الاتصال. بقي تحديث المفاتيح والمصادقة بعد المصافحة كآليتين منفصلتين بحدود أوضح، لا كعودة إلى إعادة تفاوض عامة.
ويحافظ RFC 9325 على القاعدة الصارمة في TLS 1.2: يجب على العميل والخادوم تنفيذ renegotiation_info، وعلى العميل إنهاء الاتصال إذا لم يؤكدها الخادوم. لا تحصي المصادر عدد ضحايا 2009 ولا عدد الأنظمة التي لا تزال تعيد التفاوض اليوم. لكنها تثبت الخلل والإصلاح والإزالة اللاحقة. والقاعدة الدائمة هي أن انتقال الهوية أو المفتاح يجب أن يثبت الحالة التي يرثها؛ القناة المشفّرة وحدها ليست هذا الإثبات.
المصادر
إحاطة الأعضاء
سياق أعمق للملف الشخصي
سجّل الدخول بمستوى العضوية المناسب لفتح الإحاطة الكاملة وملاحظات المصادر.
للدائرة الاستراتيجية فقط
الدائرة الاستراتيجية
مفتوح لجميع القراء. افتح إحاطات الملف الشخصي بعد الانضمام وتسجيل الدخول.
انضم إلى الدائرة الاستراتيجيةلأعضاء تحالف القيادات فقط
تحالف القيادات
لأصحاب الأصول الفكرية المؤهلين وللإدارة؛ سجّل الدخول للوصول إلى إحاطات التحالف.
انضم إلى تحالف القيادات
