
تصادمات التجزئة والاستغلالات
بقلم Ange Albertini و Marc Stevens.
س: هل من الممكن جعل ملف يحصل على تجزئة اعتباطية MD2/MD4/MD5/MD6/SHA1/SHA2/SHA3، أو على نفس تجزئة ملف آخر؟
ج: لا.
س: هل يمكن إنشاء ملفين مختلفين لهما نفس التجزئة؟
ج: مع MD5، في بضع ثوانٍ على حاسوب عادي. مع SHA1، الأمر ممكن لكنه غير عملي للمستخدمين النهائيين (التعقيد: 2^61.2 السعر: $11k).
س: هل يمكن جعل ملفين مختلفين يحصلان على نفس التجزئة بإلحاق بيانات؟
ج: مع MD5، في بضع ساعات على حاسوب عادي. مع SHA1، الأمر ممكن لكنه غير عملي للمستخدمين النهائيين (التعقيد: 2^63.4 السعر: $45K).
س: هل سيظل الملفان صالحَين؟
ج: بشكل عام، نعم، لأن معظم تنسيقات الملفات تتحمل البيانات المُلحقة. ومن ناحية أخرى، من المرجح أن تكون توقيعات الملفات مكسورة.
س: هل يمكن إنشاء ملفين مختلفين بمحتويات اعتباطية ولهما نفس التجزئة؟
ج: نعم، يمكن أن يكون ذلك فوريًا بالاعتماد على هياكل ملفات خاصة:
س: ما التنسيقات التي يمكنني فيها الحصول على زوج ملفات متصادم فورًا في MD5؟
ج: JPG، PNG، GIF، GZIP، Portable Executable، MP4، JPEG2000، PDF، DOCX/PPTX/XSLX، EPUB، 3MF، XPS. فقط قم بتشغيل السكربت المحدد.
س: وماذا عن SHA1؟
ج: بالنسبة لـ SHA1، تم حساب وتنفيذ JPG داخل PDF.
س: وماذا عن التنسيقات المدعومة بالفعل لـ MD5 (JPG، PNG...) لكن لـ SHA1 بدلاً من ذلك؟
ج: على الأرجح أنها مدعومة مع SHA1 أيضًا، لكن لم يتم حساب تصادماتها بعد.
س: هل تكون الحسابات أسرع للمحتويات المتشابهة (ولكن المختلفة)؟
ج: لا. أي اختلاف بسيط يتطلب حسابًا كاملاً.
س: ما التنسيقات التي لا تملك مثل هذا الاختصار؟
ج: ELF، Mach-O، Java Class، TAR، ZIP (من بين أخرى...)
س: هل ما تزال التصادمات التقليدية (في غضون بضع ساعات) ممكنة مع هذه التنسيقات؟
ج: نعم، طالما أنه يتم التسامح مع أي كمية من البيانات المُلحقة (أي على الأرجح ليس ZIP أو Class).
س: هل تقدّمون أمثلة على التصادمات؟
ج: نعم.
الهدف هو استكشاف الهجمات الحالية على نطاق واسع - وإظهار على طول الطريق مدى ضعف MD5 (تصادمات فورية لأي JPG أو PNG أو PDF أو MP4 أو PE...) - وأيضًا استكشاف تنسيقات الملفات الشائعة بالتفصيل لتحديد كيف يمكن استغلالها مع الهجمات الحالية أو المستقبلية.
في الواقع، يمكن استخدام نفس حيلة تنسيق الملف مع عدة تجزئات (استُخدمت نفس حيل JPG مع MD5، وSHA-1 الخبيث وSHA1)، طالما أن التصادمات تتبع نفس أنماط البايت.
هذه الوثيقة ليست حول هجمات جديدة (أحدثها تم توثيقه في 2012)، بل حول أشكال جديدة من استغلال الهجمات القائمة.
الوضع الحالي للهجمات المعروفة:
الحصول على ملف يحمل تجزئة ملف آخر أو تجزئة معينة: مستحيل
الحصول على ملفين مختلفين بنفس MD5: فوري
جعل ملفين اعتباطيين يحصلان على نفس MD5: بضع ساعات (72 hours.core)
جعل ملفين اعتباطيين من تنسيقات ملفات محددة (PNG، JPG، PE...) يحصلان على نفس MD5: فوري
الحصول على ملفين مختلفين بنفس SHA1: 6500 years.core
(*) مثال مع crypt - شكرًا لـ Sven!```
import crypt crypt.crypt("5dUD&66", "br") 'brokenOz4KxMc' crypt.crypt("O!>',%$", "br") 'brokenOz4KxMc'
# الهجمات
تعمل خوارزميتا MD5 وSHA1 مع كتل بحجم 64 بايت.
إذا كان لمحتويين A وB نفس التجزئة (hash)، فإن إضافة نفس المحتوى C إلى كليهما ستحافظ على نفس التجزئة.``` text
hash(A) = hash(B) -> hash(A + C) = hash(B + C)
تعمل التصادمات (Collisions) عبر إدراج عدد من كتل التصادم المحسوبة عند حد كتلة (block boundary)، ويعتمد هذا العدد على ما سبق في الملف. تبدو كتل التصادم هذه عشوائية جدًا مع بعض الاختلافات الطفيفة (التي تتبع نمطًا محددًا لكل هجوم) وستُدخل اختلافات طفيفة، مع بلوغ نفس قيمة التجزئة في النهاية بعد هذه الكتل.
تُستغل هذه الاختلافات لصنع ملفات صالحة بخصائص محددة.
تعمل تنسيقات الملفات أيضًا من الأعلى إلى الأسفل، ومعظمها يعمل عبر كتل (chunks) على مستوى البايت.
يمكن إدراج بعض كتل 'التعليقات' لمحاذاة كتل الملف إلى حدود الكتل، ولمحاذاة بنى محددة مع اختلافات كتل التصادم، ولإخفاء بقية العشوائية الناتجة عن كتل التصادم عن محللات الملفات، ولإخفاء محتوى صالح بخلاف ذلك عن المحلل (بحيث يرى محتوى آخر).