
تصادمات التجزئة واستغلالاتها
TL;DR getting an MD5 collision of these two images is now(*) سهلًا وفوريًا.
⟷
<a href=http://gunshowcomic.com/648>
لا تعبث بالنار، لا تعتمد على MD5.
(*) كان من الممكن منذ سنوات عديدة إحداث تصادم بين أي ملفين، لكن الأمر يستغرق عدة ساعات في كل مرة، دون اختصار.
توفر هذه الصفحة حيلًا خاصة بتنسيقات الملفات وبادئات تصادم محسوبة مسبقًا لجعل التصادم فوريًا.
git clone. شغّل السكربت. انتهى.
بقلم Ange Albertini وMarc Stevens.
الهدف هو استكشاف الهجمات الحالية بشكل موسّع - وإظهار على طول الطريق مدى ضعف MD5 (تصادمات فورية لأي JPG أو PNG أو PDF أو MP4 أو PE...) - وكذلك استكشاف تنسيقات الملفات الشائعة بالتفصيل لتحديد كيف يمكن استغلالها بهجمات حالية أو مستقبلية.
في الواقع، يمكن استخدام نفس حيلة تنسيق الملف على عدة هاشات (استُخدمت نفس حيل JPG لـ MD5، و malicious SHA-1 و SHA1)، طالما أن التصادمات تتبع نفس أنماط البايتات.
هذه الوثيقة ليست عن هجمات جديدة (أحدثها وُثّق في 2012)، بل عن أشكال جديدة لاستغلال الهجمات القائمة.
الحالة الحالية - كما في ديسمبر 2018 - للهجمات المعروفة:
الحصول على ملف لهاش ملف آخر أو هاش معيّن: مستحيل
الحصول على ملفين مختلفين لهما نفس 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 نفس التجزئة، فإن إلحاق نفس المحتوى C بكليهما سيحافظ على نفس التجزئة.``` text
hash(A) = hash(B) -> hash(A + C) = hash(B + C)
تعمل التصادمات عن طريق إدراج عدد من كتل التصادم المحسوبة عند حد كتلة يعتمد على ما سبق في الملف. تبدو كتل التصادم هذه عشوائية للغاية مع بعض الاختلافات الطفيفة (تتبع نمطًا محددًا لكل هجوم) وستُحدث اختلافات صغيرة بينما تؤدي في النهاية إلى جعل قيم التجزئة متطابقة بعد هذه الكتل.
تُستغل هذه الاختلافات لصنع ملفات صالحة بخصائص محددة.
تعمل تنسيقات الملفات أيضًا من الأعلى إلى الأسفل، ومعظمها يعمل عبر أجزاء على مستوى البايت.
يمكن إدراج بعض أجزاء 'التعليق' لمحاذاة أجزاء الملف مع حدود الكتل، ولمحاذاة هياكل محددة مع اختلافات كتل التصادم، ولإخفاء ما تبقى من عشوائية كتل التصادم عن محللات الملف، ولإخفاء محتوى صالح آخر عن المحلل (بحيث يرى محتوى آخر).
غالبًا ما لا تكون أجزاء 'التعليق' هذه تعليقات حقيقية رسميًا: تُستخدم فقط كحاويات بيانات يتجاهلها المحلل (على سبيل المثال، أجزاء PNG ذات معرّف يبدأ بحرف صغير هي ثانوية، وليست حرجة).
في معظم الأحيان، يُستخدم اختلاف في كتل التصادم لتعديل طول جزء تعليق،
والذي يُعلن عادةً قبل بيانات هذا الجزء مباشرة:
في الفجوة بين النسخة الأقصر والأطول من هذا الجزء،
يُعلن جزء تعليق آخر لتجاوز محتوى ملف A.
بعد محتوى الملف هذا A، ألحق فقط محتوى ملف آخر B.

نظرًا لأن تنسيقات الملفات عادةً ما تعرّف مُنهيًا يجعل المحللات تتوقف عنده،
فإن A سينهي التحليل، مما يجعل المحتوى الملحق B مهملاً.
لذا عادةً ما يلزم تعليقان على الأقل - وغالبًا ثلاثة:
خصائص تنسيقات الملفات الشائعة هذه تجعل ذلك ممكنًا - لا تُرى عادةً على أنها نقاط ضعف، لكن يمكن اكتشافها أو تطبيعها:
| البادئة | = | البادئة |
|---|---|---|
| التصادم A | ≠ | التصادم B |
| اللاحقة | = | اللاحقة |
كلا الملفين متطابقان تقريبًا (يحتوي محتواهما على بضع بتات فقط من الاختلافات)
الاستغلال:
اجمع محتويين، ثم إما:
ملفان بهذه البنية: