Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
collisions — تصادمات التجزئة والاستغلالات | Kitploit
أدوات/GitHubGitHub/corkami/collisions
الاستغلالتحليل التجزئةالتشفيرتحليل الملفات الثنائيةالتعلم والتعليم
GitHubcorkami/collisions

collisions

تصادمات التجزئة والاستغلالات

عرض المستودع
3.4k21023منذ سنة واحدةتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

تصادمات التجزئة والاستغلالات

بقلم Ange Albertini و Marc Stevens.

FAQ (TL;DR)

س: هل من الممكن جعل ملف يحصل على تجزئة اعتباطية MD2/MD4/MD5/MD6/SHA1/SHA2/SHA3، أو على نفس تجزئة ملف آخر؟
ج: لا.

س: هل يمكن إنشاء ملفين مختلفين لهما نفس التجزئة؟
ج: مع MD5، في بضع ثوانٍ على حاسوب عادي. مع SHA1، الأمر ممكن لكنه غير عملي للمستخدمين النهائيين (التعقيد: 2^61.2 السعر: $11k).

س: هل يمكن جعل ملفين مختلفين يحصلان على نفس التجزئة بإلحاق بيانات؟
ج: مع MD5، في بضع ساعات على حاسوب عادي. مع SHA1، الأمر ممكن لكنه غير عملي للمستخدمين النهائيين (التعقيد: 2^63.4 السعر: $45K).

س: هل سيظل الملفان صالحَين؟
ج: بشكل عام، نعم، لأن معظم تنسيقات الملفات تتحمل البيانات المُلحقة. ومن ناحية أخرى، من المرجح أن تكون توقيعات الملفات مكسورة.

س: هل يمكن إنشاء ملفين مختلفين بمحتويات اعتباطية ولهما نفس التجزئة؟
ج: نعم، يمكن أن يكون ذلك فوريًا بالاعتماد على هياكل ملفات خاصة:

  1. ترويسة تنسيق خاصة (أو زوج منها) بحيل تعمل كمبدّل بين محتويين (بعض التنسيقات لن تسمح بمثل هذه الحيل).
  2. تصادمات محسوبة مسبقًا بناءً على الترويسة (الترويسات) المحددة.
  3. محتويان من تنسيقات محددة، وكلاهما حاضر بعد التصادم (يُضافان بعد الحساب).

س: ما التنسيقات التي يمكنني فيها الحصول على زوج ملفات متصادم فورًا في 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).

س: هل تقدّمون أمثلة على التصادمات؟
ج: نعم.

جدول المحتويات

  • مقدمة
  • الحالة
  • الهجمات
    • بادئة متطابقة
      • FastColl (MD5)
      • UniColl (MD5)
      • Shattered (SHA1)
    • تصادمات بادئة مختارة
      • HashClash (MD5)
      • Shambles (SHA1)
    • ملخص الهجمات
  • الاستغلالات
    • الاستراتيجية القياسية
      • JPG
        • custom scans
      • PNG
        • عدم التوافق
      • GIF
      • GZIP
      • LZ4 / Zstandard
      • Portable Executable
      • MP4 وغيرها
        • JPEG2000
      • PDF
        • JPG في PDF
      • ZIP
        • التنسيقات المعتمدة على ZIP
      • أخرى
    • استراتيجيات غير شائعة
      • MultiColls: سلسلة تصادمات متعددة
        • Hashquines
      • الصلاحية
      • PolyColls: تصادمات أنواع ملفات مختلفة
        • PE - JPG
        • PDF - PE
        • PDF - PNG
      • PileUps (تصادم متعدد)
        • PE - PNG - MP4 - PDF
    • حالات الاستخدام
      • اجعلها كلها تتصادم!
      • ملفات الإدانة
    • حالات الفشل
      • ELF
      • Mach-O
      • Java Class
      • TAR
    • ملخص الاستغلالات
    • ملفات الاختبار
  • الكشف
    • التجزئة الآمنة
  • المراجع
  • الاعتمادات
  • الاستنتاج

مقدمة

الهدف هو استكشاف الهجمات الحالية على نطاق واسع - وإظهار على طول الطريق مدى ضعف MD5 (تصادمات فورية لأي JPG أو PNG أو PDF أو MP4 أو PE...) - وأيضًا استكشاف تنسيقات الملفات الشائعة بالتفصيل لتحديد كيف يمكن استغلالها مع الهجمات الحالية أو المستقبلية.

في الواقع، يمكن استخدام نفس حيلة تنسيق الملف مع عدة تجزئات (استُخدمت نفس حيل JPG مع MD5، وSHA-1 الخبيث وSHA1)، طالما أن التصادمات تتبع نفس أنماط البايت.

هذه الوثيقة ليست حول هجمات جديدة (أحدثها تم توثيقه في 2012)، بل حول أشكال جديدة من استغلال الهجمات القائمة.

الحالة

الوضع الحالي للهجمات المعروفة:

  • الحصول على ملف يحمل تجزئة ملف آخر أو تجزئة معينة: مستحيل

    • لا يزال غير عملي حتى مع MD2 أو MD4.
    • يعمل مع تجزئات أبسط(*)
  • الحصول على ملفين مختلفين بنفس MD5: فوري

    • أمثلة: 1 ⟷ 2
  • جعل ملفين اعتباطيين يحصلان على نفس MD5: بضع ساعات (72 hours.core)

    • أمثلة: 1 ⟷ 2
  • جعل ملفين اعتباطيين من تنسيقات ملفات محددة (PNG، JPG، PE...) يحصلان على نفس MD5: فوري

    • اقرأ أدناه
  • الحصول على ملفين مختلفين بنفس SHA1: 6500 years.core

    • الحصول على ملفي PDF مختلفين بنفس SHA-1 لإظهار صورة مختلفة: فوري (البادئات محسوبة مسبقًا)

(*) مثال مع crypt - شكرًا لـ Sven!```

import crypt crypt.crypt("5dUD&66", "br") 'brokenOz4KxMc' crypt.crypt("O!>',%$", "br") 'brokenOz4KxMc'

root@kitploit:~
# الهجمات

تعمل خوارزميتا MD5 وSHA1 مع كتل بحجم 64 بايت.

إذا كان لمحتويين A وB نفس التجزئة (hash)، فإن إضافة نفس المحتوى C إلى كليهما ستحافظ على نفس التجزئة.``` text
hash(A) = hash(B) -> hash(A + C) = hash(B + C)

تعمل التصادمات (Collisions) عبر إدراج عدد من كتل التصادم المحسوبة عند حد كتلة (block boundary)، ويعتمد هذا العدد على ما سبق في الملف. تبدو كتل التصادم هذه عشوائية جدًا مع بعض الاختلافات الطفيفة (التي تتبع نمطًا محددًا لكل هجوم) وستُدخل اختلافات طفيفة، مع بلوغ نفس قيمة التجزئة في النهاية بعد هذه الكتل.

تُستغل هذه الاختلافات لصنع ملفات صالحة بخصائص محددة.

تعمل تنسيقات الملفات أيضًا من الأعلى إلى الأسفل، ومعظمها يعمل عبر كتل (chunks) على مستوى البايت.

يمكن إدراج بعض كتل 'التعليقات' لمحاذاة كتل الملف إلى حدود الكتل، ولمحاذاة بنى محددة مع اختلافات كتل التصادم، ولإخفاء بقية العشوائية الناتجة عن كتل التصادم عن محللات الملفات، ولإخفاء محتوى صالح بخلاف ذلك عن المحلل (بحيث يرى محتوى آخر).

غالبًا لا تكون كتل 'التعليقات' هذه تعليقات حقيقية رسميًا: فهي تُستخدم فقط كحاويات بيانات يتجاهلها المحلل (على سبيل المثال، كتل PNG التي يبدأ معرّفها بحرف صغير هي كتل مساعدة (ancillary) وليست حرجة).

في معظم الأحيان، يُستخدم اختلاف في كتل التصادم لتعديل طول كتلة تعليق، والتي يُعلن عنها عادةً قبل بيانات هذه الكتلة مباشرة: في الفجوة بين النسخة الأقصر والأطول من هذه الكتلة، يُعلن عن كتلة تعليق أخرى لتجاوز محتوى ملف واحد A. بعد محتوى الملف هذا A، يُلحق فقط محتوى ملف آخر B.

بما أن تنسيقات الملفات عادةً ما تحدد مُنهيًا (terminator) يجعل المحللات تتوقف بعده، فإن A سينهي التحليل، مما يجعل المحتوى الملحق B مهملاً.

لذا عادةً ما تكون هناك حاجة إلى تعليقين على الأقل - وغالبًا ثلاثة:

  1. المحاذاة
  2. إخفاء كتل التصادم
  3. إخفاء محتوى ملف واحد (للتصادمات القابلة لإعادة الاستخدام)

هذه الخصائص الشائعة في تنسيقات الملفات تجعل الأمر ممكنًا - لا تُعتبر عادةً نقاط ضعف، ولكن يمكن اكتشافها أو تطبيعها:

  • كتل وهمية (dummy chunks) - تُستخدم كتعليقات
  • أكثر من تعليق واحد
  • تعليقات ضخمة (الأطوال: 64b لـ MP4، 32b لـ PNG -> تصادمات تافهة. 16b لـ JPG، 8b لـ GIF -> لا يوجد تصادم عام لـ GIF، محدود لـ JPG)
  • تخزين أي بيانات في تعليق (قد يكون ASCII أو UTF8 مفروضًا)
  • تخزين أي شيء بعد المُنهي (يُستخدم عادةً لأغراض خبيثة فقط) - يمكن تجنب ذلك باستخدام تعليقين ينتهيان عند نفس الإزاحات.
  • لا يوجد فحص تكامل. عادةً ما يتم تجاهل CRC32 في PNG. ومع ذلك يمكن أن تكون جميعها صحيحة لأن كتل التصادم تعلن عن كتل بأطوال مختلفة - لذلك حتى لو بدأت بيانات الكتلة بشكل مختلف، فإن أطوال الكتل مختلفة
  • بنية مسطحة: يعرّف ASN.1 بنية أصلية بطول جميع البنى الفرعية المغلّفة، وهذا يمنع هذه الإنشاءات: ستحتاج إلى إساءة استخدام طول، وكذلك طول الأصل.
  • وضع تعليق قبل الترويسة - وهذا يجعل التصادمات العامة القابلة لإعادة الاستخدام ممكنة.

البادئة المتطابقة

  1. حدد بادئة عشوائية (arbitrary prefix) - محتواها وطولها لا يهمان.
  2. تُحشى البادئة إلى كتلة 64-بايت التالية.
  3. تُحسب كتلة (كتل) التصادم اعتمادًا على البادئة وتُلحق. كلا الجانبين عشوائيان جدًا. الاختلافات محددة مسبقًا بواسطة الهجوم.
  4. بعد هذه الكتلة (الكتل)، تكون قيمة التجزئة هي نفسها على الرغم من اختلافات الملف.
  5. يمكن إضافة أي لاحقة متطابقة عشوائية.
البادئة=البادئة
التصادم A≠التصادم B
اللاحقة=اللاحقة

كلا الملفين متطابقان تقريبًا (يحتوي محتواهما على بضعة بتات فقط من الاختلافات)

الاستغلال:

اجمع محتويين، ثم إما:

  • استغلال البيانات: تشغيل كود يتحقق من الاختلافات ويعرض أحدهما أو الآخر (عادة ما يكون بسيطًا لأن الاختلافات معروفة مسبقًا).
  • استغلال البنية: استغلال بنية الملف (عادةً، طول تعليق) لإخفاء محتوى أو إظهار الآخر (يعتمد على تنسيق الملف ومحللاته).

ملفان بهذه البنية:

البادئة=البادئة
التصادم A≠التصادم B
A=A
B=B

سيعرضان إما A أو B.

FastColl (MD5)

الإصدار النهائي في عام 2009.

  • الوقت: بضع ثوانٍ من الحساب
  • المساحة: كتلتان
  • الاختلافات: لا تحكم قبل، لا تحكم بعد. قناع اختلاف FastColl:
    root@kitploit:~
    .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. ..
    .. .. .. X. .. .. .. .. .. .. .. .. .. .. .. ..
    .. .. .. .. .. .. .. .. .. .. .. .. .. X. .X ..
    .. .. .. .. .. .. .. .. .. .. .. X. .. .. .. ..
    
  • الاستغلال: صعب

الاختلافات ليست قريبة من بداية/نهاية الكتل، لذلك من الصعب جدًا استغلالها لأنك لا تتحكم في أي بايت مجاور. الحل المحتمل هو تخمين البايتات المحيطة عن طريق القوة الغاشمة - راجع PoCGTFO 14:10.

أمثلة:

ببادئة فارغة:``` MD5: fe6c446ee3a831ee010f33ac9c1b602c SHA256: c5dd2ef7c74cd2e80a0fd16f1dd6955c626b59def888be734219d48da6b9dbdd

00: 37 75 C1 F1-C4 A7 5A E7-9C E0 DE 7A-5B 10 80 26 7u┴±─ºZτ£α▐z[►Ç& 10: 02 AB D9 39-C9 6C 5F 02-12 C2 7F DA-CD 0D A3 B0 ☻½┘9╔l_☻↕┬⌂┌═♪ú░ 20: 8C ED FA F3-E1 A3 FD B4-EF 09 E7 FB-B1 C3 99 1D îφ·≤ßú²┤∩○τ√▒├Ö↔ 30: CD 91 C8 45-E6 6E FD 3D-C7 BB 61 52-3E F4 E0 38 ═æ╚Eµn²=╟╗aR>⌠α8
40: 49 11 85 69-EB CC 17 9C-93 4F 40 EB-33 02 AD 20 I◄àiδ╠↨£ôO@δ3☻¡ 50: A4 09 2D FB-15 FA 20 1D-D1 DB 17 CD-DD 29 59 1E ñ○-√§· ↔╤█↨═▌)Y▲ ................ 60: 39 89 9E F6-79 46 9F E6-8B 85 C5 EF-DE 42 4F 46 9ë₧÷yFƒµïà┼∩▐BOF ...X............ 70: C2 78 75 9D-8B 65 F4 50-EA 21 C5 59-18 62 FF 7B ┬xu¥ïe⌠PΩ!┼Y↑b { .............XX. ...........X.... ................ 00: 37 75 C1 F1-C4 A7 5A E7-9C E0 DE 7A-5B 10 80 26 7u┴±─ºZτ£α▐z[►Ç& ...X............ 10: 02 AB D9 B9-C9 6C 5F 02-12 C2 7F DA-CD 0D A3 B0 ☻½┘╣╔l_☻↕┬⌂┌═♪ú░ .............XX. 20: 8C ED FA F3-E1 A3 FD B4-EF 09 E7 FB-B1 43 9A 1D îφ·≤ßú²┤∩○τ√▒CÜ↔ ...........X.... 30: CD 91 C8 45-E6 6E FD 3D-C7 BB 61 D2-3E F4 E0 38 ═æ╚Eµn²=╟╗a╥>⌠α8 40: 49 11 85 69-EB CC 17 9C-93 4F 40 EB-33 02 AD 20 I◄àiδ╠↨£ôO@δ3☻¡ / 50: A4 09 2D 7B-15 FA 20 1D-D1 DB 17 CD-DD 29 59 1E ñ○-{§· ↔╤█↨═▌)Y▲ 60: 39 89 9E F6-79 46 9F E6-8B 85 C5 EF-DE C2 4E 46 9ë₧÷yFƒµïà┼∩▐┬NF 70: C2 78 75 9D-8B 65 F4 50-EA 21 C5 D9-18 62 FF 7B ┬xu¥ïe⌠PΩ!┼┘↑b {

MD5: fe6c446ee3a831ee010f33ac9c1b602c SHA256: e27cf3073c704d0665da42d597d4d20131013204eecb6372a5bd60aeddd5d670

root@kitploit:~
Other examples, with an identical prefix: [1](https://github.com/corkami/collisions/blob/master/examples/fastcoll1.bin) ⟷ [2](https://github.com/corkami/collisions/blob/master/examples/fastcoll2.bin)

**Variant**: there is a [single-block MD5 collision](https://marc-stevens.nl/research/md5-1block-collision/) but it takes five weeks of computation.

Here is a [recording](https://github.com/corkami/collisions/blob/master/examples/fastcoll.svg) of a FastColl computation without any prefix
and [another one](https://github.com/corkami/collisions/blob/master/examples/fastcoll-prefix.svg) with a prefix.


### [UniColl](https://github.com/corkami/collisions/blob/master/unicoll.md) (MD5)

Documented in [2012](https://www.cwi.nl/system/files/PhD-Thesis-Marc-Stevens-Attacks-on-Hash-Functions-and-Applications.pdf#page=199), implemented in [2017](https://github.com/cr-marcstevens/hashclash/blob/95c2619a8078990056beb7aaa59104021714ee3c/scripts/poc_no.sh)

[UniColl](https://github.com/cr-marcstevens/hashclash#create-you-own-identical-prefix-collision) lets you control a few bytes in the collision blocks,
before and after the first difference, which makes it an identical-prefix collision with some controllable differences, almost like a chosen-prefix collision.
This is very handy, and even better the difference can be very predictable:
in the case of `m2+= 2^8` (a.k.a. `N=1` / `m2 9` in HashClash [poc_no.sh](https://github.com/cr-marcstevens/hashclash/blob/master/scripts/poc_no.sh#L30) script),
the difference is +1 on the 9th byte, which makes it very exploitable,
as you can even think about the collision in your head:
the 9th character of that sentence will be replaced with the next one: `0` replaced by `1`, `a` replaced by `b`..

- time: a few minutes (depends on the amount of byte you want to control )
- space: two blocks
- differences:   ```
   .. .. .. .. DD .. .. .. ..
   .. .. .. .. +1 .. .. .. ..
  • الاستغلال: سهل جدًا - بايتات محكومة قبل الفرق وبعده، والفرق قابل للتنبؤ. القيود الوحيدة هي المحاذاة وأنك تتحكم 'فقط' في 10 بايتات بعد الفرق.

أمثلة مع N=1 و20 بايتًا من نص محدد في كتل التصادم:``` 00: 55 6E 69 43-6F 6C 6C 20-31 20 70 72-65 66 69 78 UniColl 1 prefix 10: 20 32 30 62-F5 48 34 B9-3B 1C 01 9F-C8 6B E6 44 20b⌡H4╣;∟☺ƒ╚kµD 20: FE F6 31 3A-63 DB 99 3E-77 4D C7 5A-6E B0 A6 88 ■÷1:c█Ö>wM╟Zn░ªê 30: 04 05 FB 39-33 21 64 BF-0D A4 FE E2-A6 9D 83 36 ♦♣√93!d┐♪ñ■Γª¥â6
40: 4B 14 D7 F2-47 53 84 BA-12 2D 4F BB-83 78 6C 70 K¶╫≥GSä║↕-O╗âxlp 50: C6 EB 21 F2-F6 59 9A 85-14 73 04 DD-57 5F 40 3C ╞δ!≥÷YÜà¶s♦▌W_@< .........X...... 60: E1 3F B0 DB-E8 B4 AA B0-D5 56 22 AF-B9 04 26 FC ß?░█Φ┤¬░╒V"»╣♦&ⁿ ................ 70: 9F D2 0C 00-86 C8 ED DE-85 7F 03 7B-05 28 D7 0F ƒ╥♀ å╚φ▐à⌂♥{♣(╫☼ ................ ................ .........X...... 00: 55 6E 69 43-6F 6C 6C 20-31 21 70 72-65 66 69 78 UniColl 1!prefix ................ 10: 20 32 30 62-F5 48 34 B9-3B 1C 01 9F-C8 6B E6 44 20b⌡H4╣;∟☺ƒ╚kµD ................ 20: FE F6 31 3A-63 DB 99 3E-77 4D C7 5A-6E B0 A6 88 ■÷1:c█Ö>wM╟Zn░ªê ................ 30: 04 05 FB 39-33 21 64 BF-0D A4 FE E2-A6 9D 83 36 ♦♣√93!d┐♪ñ■Γª¥â6 40: 4B 14 D7 F2-47 53 84 BA-12 2C 4F BB-83 78 6C 70 K¶╫≥GSä║↕,O╗âxlp / 50: C6 EB 21 F2-F6 59 9A 85-14 73 04 DD-57 5F 40 3C ╞δ!≥÷YÜà¶s♦▌W_@< 60: E1 3F B0 DB-E8 B4 AA B0-D5 56 22 AF-B9 04 26 FC ß?░█Φ┤¬░╒V"»╣♦&ⁿ 70: 9F D2 0C 00-86 C8 ED DE-85 7F 03 7B-05 28 D7 0F ƒ╥♀ å╚φ▐à⌂♥{♣(╫☼

root@kitploit:~
تتمتع UniColl بتحكم أقل من تصادم البادئة المختارة الحقيقي،
لكنها أسرع بكثير خاصةً أنها لا تتطلب سوى كتلتين.

إليك [تسجيل](https://github.com/corkami/collisions/blob/master/examples/unicoll.svg) لحساب UniColl.


### [Shattered](http://shattered.io) (SHA1)

تم توثيقه في [2013](https://marc-stevens.nl/research/papers/EC13-S.pdf)، وحُسب في [2017](http://shattered.io).

- الوقت: 6500 years.CPU و 110 year.GPU
- المساحة: كتلتان
- الاختلافات:  ```
  .. .. .. DD ?? ?? ?? ??
  or
  ?? ?? ?? DD .. .. .. ..
  • الاستغلال: متوسط. الاختلافات تكون في البداية والنهاية مباشرةً لكتل التصادم. لذلك لا يوجد تحكم قبل و بعد طول في البادئة/اللاحقة: يخزّن PNG طوله قبل نوع الكتلة، لذا لن يعمل. لكنه سيعمل مع ملفات JP2 عندما تستخدم صيغة JFIF (نفس صيغة JPG)، ومن المرجح مع MP4 وصيغ atom/box الأخرى إذا استخدمت أطوالًا طويلة على 64bit (في هذه الحالة، توضع بعد نوع الذرة).

الفرق بين كتل التصادم لكل جانب هو قناع Xor هذا:``` 0C 00 00 02 C0 00 00 10 B4 00 00 1C 3C 00 00 04 BC 00 00 1A 20 00 00 10 24 00 00 1C EC 00 00 14 0C 00 00 02 C0 00 00 10 B4 00 00 1C 2C 00 00 04 BC 00 00 18 B0 00 00 10 00 00 00 0C B8 00 00 10

root@kitploit:~


أمثلة: [PoC||GTFO 0x18](https://github.com/angea/pocorgtfo#0x18) تستخدم بادئات SHA1 المحسوبة،
وتعيد استخدام الصورة مباشرة من مصدر PDFLaTeX (انظر [المقال 18:10](https://archive.org/stream/pocorgtfo18#page/n62/mode/1up))،
ولكنها تتحقق أيضًا من قيمة البادئات عبر JavaScript في صفحة HTML (الملف متعدد الصيغ، ZIP وHTML وPDF).


## تصادمات البادئة المختارة

تسمح بتصادم أي محتوى.

| 𝓐            | ≠ | 𝔅             |
| :----:        |:-:| :----:        |
| تصادم *A* | ≠ | تصادم *B* |

1. خذ بادئتين عشوائيتين
2. احشُ الأقصر ليكون بطول الأطول. كلاهما يُحشى حتى الكتلة التالية - ناقص 12 بايت
  - ستُضاف هذه الـ 12 بايت من البيانات العشوائية على الجانبين لتوزيع بحث عيد الميلاد
3. سيتم حساب كتل شبه التصادم X وإلحاقها.

   كلما قلّت الكتل، طال الحساب.

   مثال: [400 kHours لكتلة واحدة](https://www.win.tue.nl/hashclash/SingleBlock/). 72 hours.cores لتسع كتل مع [HashClash](https://github.com/cr-marcstevens/hashclash).



تصادمات البادئة المختارة قوية جدًا، لكنها قد تستغرق وقتًا طويلًا حتى لزوج واحد من الملفات.


### [HashClash](https://github.com/cr-marcstevens/hashclash) (MD5)

النسخة النهائية في [2009](https://www.win.tue.nl/hashclash/ChosenPrefixCollisions/).

أمثلة: لنصادم `yes` و `no`. استغرق الأمر ثلاث ساعات على 24 نواة.```
'yes' prefix:
000:  79 65 73 0A-3D 62 84 11-01 75 D3 4D-EB 80 93 DE  yes◙=bä◄☺u╙MδÇô▐   - Prefix, padding
010:  31 C1 D9 30-45 FB BE 1E-71 F0 0A 63-75 A8 30 AA  1┴┘0E√╛▲q≡◙cu¿0¬
020:  98 17 CA E3-A2 6B 8E 3D-44 A9 8F F2-0E 67 96 48  ÿ↨╩πókÄ=D⌐Å≥♫gûH
030:  97 25 A6 FB-00 00 00 00-49 08 09 33-F0 62 C4 E8  ù%ª√    I◘○3≡b─Φ

040:  D5 F1 54 CD-CA A1 42 90-7F 9D 3D 9A-67 C4 1B 0F  ╒±T═╩íBÉ⌂¥=Üg─←☼  - Collision blocks start
050:  04 9F 19 E8-92 C3 AA 19-43 31 1A DB-DA 96 01 54  ♦ƒ↓ΦÆ├¬↓C1→█┌û☺T
060:  85 B5 9A 88-D8 A5 0E FB-CD 66 9A DA-4F 20 8A AA  à╡Üê╪Ñ♫√═fÜ┌O è¬
070:  BA E3 9C F0-78 31 8F D1-14 5F 3E B9-0F 9F 3E 19  ║π£≡x1Å╤¶_>╣☼ƒ>↓

080:  09 9C BB A9-45 89 BA A8-03 E6 C0 31-A0 54 D6 26  ○£╗⌐Eë║¿♥µ└1áT╓&
090:  3F 80 4C 06-0F C7 D9 19-09 D3 DA 14-FD CB 39 84  ?ÇL♠☼╟┘↓○╙┌¶²╦9ä
0A0:  1F 0D 77 5F-55 AA 7A 07-4C 24 8B 13-0A 54 A2 BC  ▼♪w_U¬z•L$ï‼◙Tó╝
0B0:  C5 12 7D 4F-E0 5E F2 23-C5 07 61 E4-80 91 B2 13  ┼↕}Oα^≥#┼•aΣÇæ▓‼

0C0:  E7 79 07 2A-CF 1B 66 39-8C F0 8E 7E-75 25 22 1D  τy•*╧←f9î≡Ä~u%"↔
0D0:  A7 3B 49 4A-32 A4 3A 07-61 26 64 EA-6B 83 A2 8D  º;IJ2ñ:•a&dΩkâóì
0E0:  BE A3 FF BE-4E 71 AE 18-E2 D0 86 4F-20 00 30 26  ╛ú ╛Nq«↑Γ╨åO  0&
0F0:  0A 71 DE 1F-40 B4 F4 8F-9C 50 5C 78-DD CD 72 89  ◙q▐▼@┤⌠Å£P\x▌═rë

100:  BA D1 BF F9-96 80 E3 06-96 F3 B9 7C-77 2D EB 25  ║╤┐∙ûÇπ♠û≤╣|w-δ%
110:  1E 56 70 D7-14 1F 55 4D-EC 11 58 59-92 45 E1 33  ▲Vp╫¶▼UM∞◄XYÆEß3
120:  3E 0E A1 6E-FF D9 90 AD-F6 A0 AD 0E-C6 D6 88 12  >♫ín ┘É¡÷á¡♫╞╓ê↕
130:  B8 74 F2 9E-DD 53 F7 88-19 73 85 39-AA 9B E0 8D  ╕t≥₧▌S≈ê↓sà9¬¢αì
                                                                          \
140:  82 BF 9C 5E-58 42 1E 3B-94 CF 5B 54-73 5F A8 4A  é┐£^XB▲;ö╧[Ts_¿J
150:  FD 5B 64 CF-59 D1 96 74-14 B3 0C AF-11 1C F9 47  ²[d╧Y╤ût¶│♀»◄∟∙G      ................
160:  C5 7A 2C F7-D5 24 F5 EB-BE 54 3E 12-B0 24 67 3F  ┼z,≈╒$⌡δ╛T>↕░$g?      ................
170:  01 DD 95 76-8D 0D 58 FB-50 23 70 3A-BD ED BE AC  ☺▌òvì♪X√P#p:╜φ╛¼      ...............X
                                                                             ................
180:  B8 32 DB AE-E8 DC 3A 83-7A C8 D5 0F-08 90 1D 99  ╕2█«Φ▄:âz╚╒☼◘É↔Ö
190:  2D 7D 17 34-4E A8 21 98-61 1A 65 DA-FC 9B A4 BA  -}↨4N¿!ÿa→e┌ⁿ¢ñ║      ................
1A0:  E1 42 2B 86-0C 94 2A F6-D6 A4 81 B5-2B 0B E9 37  ßB+å♀ö*÷╓ñü╡+♂Θ7      ................
1B0:  44 D2 E4 23-14 7C 16 B8-84 90 8B E0-A1 A7 BD 27  D╥Σ#¶|▬╕äÉïαíº╜'      ..............X.
                                                                             ................
1C0:  C7 7E E6 17-1A 93 C5 EE-59 70 91 26-4E 9D C7 7C  ╟~µ↨→ô┼εYpæ&N¥╟|
1D0:  1D 3D AB F1-B4 F4 F1 D9-86 48 75 77-6E FE 98 84  ↔=½±┤⌠±┘åHuwn■ÿä      ................
1E0:  EF 3C 1C C7-16 5A 1F 83-60 EC 5C FE-CA 17 0C 74  ∩<∟╟▬Z▼â`∞\■╩↨♀t      ................
1F0:  EB 8E 9D F6-90 A3 CD 08-65 D5 5A 4C-2E C6 BE 54  δÄ¥÷Éú═◘e╒ZL.╞╛T      ...............X
                                                                             ................

'no' prefix:                                                                 ................
000:  6E 6F 0A E5-5F D0 83 01-9B 4D 55 06-61 AB 88 11  no◙σ_╨â☺¢MU♠a½ê◄      ................
010:  8A FA 4D 34-B3 75 59 46-56 97 EF 6C-4A 07 90 CC  è·M4│uYFVù∩lJ•É╠      ............X...
020:  FE 19 D7 CF-6F 92 03 9C-91 AA A5 DA-56 92 C1 04  ■↓╫╧oÆ♥£æ¬Ñ┌VÆ┴♦      ................
030:  E6 4C 08 A3-00 00 00 00-8D B6 4E 47-FF AF 7A 3C  µL◘ú    ì╢NG »z<
                                                                             ................
040:  D5 F1 54 CD-CA A1 42 90-7F 9D 3D 9A-67 C4 1B 0F  ╒±T═╩íBÉ⌂¥=Üg─←☼      ................
050:  04 9F 19 E8-92 C3 AA 19-43 31 1A DB-DA 96 01 54  ♦ƒ↓ΦÆ├¬↓C1→█┌û☺T      ............X...
060:  85 B5 9A 88-D8 A5 0E FB-CD 66 9A DA-4F 20 8A A9  à╡Üê╪Ñ♫√═fÜ┌O è⌐      ................
070:  BA E3 9C F0-78 31 8F D1-14 5F 3E B9-0F 9F 3E 19  ║π£≡x1Å╤¶_>╣☼ƒ>↓
                                                                             ................
080:  09 9C BB A9-45 89 BA A8-03 E6 C0 31-A0 54 D6 26  ○£╗⌐Eë║¿♥µ└1áT╓&      ................
090:  3F 80 4C 06-0F C7 D9 19-09 D3 DA 14-FD CB 39 84  ?ÇL♠☼╟┘↓○╙┌¶²╦9ä      .............X..
0A0:  1F 0D 77 5F-55 AA 7A 07-4C 24 8B 13-0A 54 B2 BC  ▼♪w_U¬z•L$ï‼◙T▓╝      ................
0B0:  C5 12 7D 4F-E0 5E F2 23-C5 07 61 E4-80 91 B2 13  ┼↕}Oα^≥#┼•aΣÇæ▓‼
                                                                             ................
0C0:  E7 79 07 2A-CF 1B 66 39-8C F0 8E 7E-75 25 22 1D  τy•*╧←f9î≡Ä~u%"↔      ................
0D0:  A7 3B 49 4A-32 A4 3A 07-61 26 64 EA-6B 83 A2 8D  º;IJ2ñ:•a&dΩkâóì      ...............X
0E0:  BE A3 FF BE-4E 71 AE 18-E2 D0 86 4F-20 00 30 22  ╛ú ╛Nq«↑Γ╨åO  0"      ................
0F0:  0A 71 DE 1F-40 B4 F4 8F-9C 50 5C 78-DD CD 72 89  ◙q▐▼@┤⌠Å£P\x▌═rë
                                                                           /
100:  BA D1 BF F9-96 80 E3 06-96 F3 B9 7C-77 2D EB 25  ║╤┐∙ûÇπ♠û≤╣|w-δ%
110:  1E 56 70 D7-14 1F 55 4D-EC 11 58 59-92 45 E1 33  ▲Vp╫¶▼UM∞◄XYÆEß3
120:  3E 0E A1 6E-FF D9 90 AD-F6 A0 AD 0E-CA D6 88 12  >♫ín ┘É¡÷á¡♫╩╓ê↕
130:  B8 74 F2 9E-DD 53 F7 88-19 73 85 39-AA 9B E0 8D  ╕t≥₧▌S≈ê↓sà9¬¢αì

140:  82 BF 9C 5E-58 42 1E 3B-94 CF 5B 54-73 5F A8 4A  é┐£^XB▲;ö╧[Ts_¿J
150:  FD 5B 64 CF-59 D1 96 74-14 B3 0C AF-11 1C F9 47  ²[d╧Y╤ût¶│♀»◄∟∙G
160:  C5 7A 2C F7-D5 24 F5 EB-BE 54 3E 12-70 24 67 3F  ┼z,≈╒$⌡δ╛T>↕p$g?
170:  01 DD 95 76-8D 0D 58 FB-50 23 70 3A-BD ED BE AC  ☺▌òvì♪X√P#p:╜φ╛¼

180:  B8 32 DB AE-E8 DC 3A 83-7A C8 D5 0F-08 90 1D 99  ╕2█«Φ▄:âz╚╒☼◘É↔Ö
190:  2D 7D 17 34-4E A8 21 98-61 1A 65 DA-FC 9B A4 BA  -}↨4N¿!ÿa→e┌ⁿ¢ñ║
1A0:  E1 42 2B 86-0C 94 2A F6-D6 A4 81 B5-2B 2B E9 37  ßB+å♀ö*÷╓ñü╡++Θ7
1B0:  44 D2 E4 23-14 7C 16 B8-84 90 8B E0-A1 A7 BD 27  D╥Σ#¶|▬╕äÉïαíº╜'

1C0:  C7 7E E6 17-1A 93 C5 EE-59 70 91 26-4E 9D C7 7C  ╟~µ↨→ô┼εYpæ&N¥╟|
1D0:  1D 3D AB F1-B4 F4 F1 D9-86 48 75 77-6E FE 98 84  ↔=½±┤⌠±┘åHuwn■ÿä
1E0:  EF 3C 1C C7-16 5A 1F 83-60 EC 5C FE-CA 17 0C 54  ∩<∟╟▬Z▼â`∞\■╩↨♀T
1F0:  EB 8E 9D F6-90 A3 CD 08-65 D5 5A 4C-2E C6 BE 54  δÄ¥÷Éú═◘e╒ZL.╞╛T

هذا هو السجل للعملية كاملة.

Shambles (SHA-1)

Shambles هو تصادم بادئة مختارة مكلف للغاية يستخدم 9 كتل.

كل كتلة لها نفس نمط xor كما في Shattered:``` 0C 00 00 02 C0 00 00 10 B4 00 00 1C 3C 00 00 04 BC 00 00 1A 20 00 00 10 24 00 00 1C EC 00 00 14 0C 00 00 02 C0 00 00 10 B4 00 00 1C 2C 00 00 04 BC 00 00 18 B0 00 00 10 00 00 00 0C B8 00 00 10

root@kitploit:~
ولكن حتى إذا كان Shattered أسهل بكثير في الاستغلال من FastColl،
فإن قيود الاختلافات في كتل التصادم غير ذات صلة
بما أن Shambles هو تصادم بادئة مختارة.


## ملخص الهجمات

التجزئة | الاسم      | التاريخ | المدة      | نوع البادئة | التحكم قرب الاختلاف
---- | --------- | ---- | -------- | ----------- | -----------------
MD5  | FastColl  | 2009 | 2s       | متطابقة    | لا شيء
     | UniColl   | 2012 | 7-40min  | متطابقة    | 4-10 بايت
     | HashClash | 2009 | 72h      | مختارة     | لا ينطبق
     |           |      |          |             |
SHA1 | Shattered | 2013 | 6500yr   | متطابقة    | بادئة ولاحقة
     | Shambles  | 2020 | ?        | مختارة     | لا ينطبق


# الاستغلالات

تعتبر تصادمات البادئة المتطابقة عادةً محدودة (للغاية)، لكن البادئة المختارة تستغرق وقتًا طويلاً.

نهج آخر هو صياغة بادئات قابلة لإعادة الاستخدام إما عبر هجوم البادئة المتطابقة مثل UniColl - أو البادئة المختارة للتغلب على بعض القيود - ولكن إعادة استخدام زوج البادئات مع حمولتين مثل هجوم البادئة المتطابقة الكلاسيكي.

بمجرد حساب زوج البادئات، يصبح تصادم محتويين فوريًا:
الأمر مجرد معالجة بيانات الملف (وفقًا لتنسيقات ملفات محددة) بحيث تناسب مواصفات تنسيقات الملفات ومتطلبات البادئة المحسوبة مسبقًا.


## الاستراتيجية القياسية

التصادمات الكلاسيكية لملفين صالحين من نفس نوع الملف.


### JPG



القيود النظرية والحلول البديلة:
- من الناحية النظرية، يجب أن يأتي مقطع *Application* مباشرة بعد علامة *Start of Image*.
  من الناحية العملية، هذا ليس ضروريًا، لذا يمكن أن يكون تصادمنا عامًا: القيد الوحيد هو حجم أصغر صورة.
- طول التعليق يُخزن في بايتين، لذا فإن الكمية التي يمكنه تخزينها محدودة بـ 65536 بايت (تقريبًا حجم صورة 400x400)
- بدلاً من القفز فوق ملف JPG كامل، يمكن تقسيم هذا الملف إلى مقاطعه وإضافة ترامبولينات قفز بين المقاطع

  

  *تعليقات فوق كل مقاطع الصورة*

  

  *كيفية عمل ترامبولين التعليقات*

- في حين أن معظم بنية JPG تتكون من مقاطع جميعها محدودة الحجم بـ 65536 بايت،
تُخزن البيانات المضغوطة الفعلية في *مقطع الترميز الإنتروبي (Entropy Coded Segment)* الذي لا يحترم حدوده:
حجمه غير معروف مسبقًا ويزيد عن هذا الحد.
إنه ينمو مع حجم الصورة، مما يجعل معظم حجم الملف في صورة خط الأساس (غير تدريجية).
لجعل الصورة بأكملها تناسب أجزاء بحجم 64kb، الطريقة السهلة هي أولًا محاولة حفظ الصورة بالتنسيق التدريجي (وهو ما يمكن لأي برنامج فعله، ويقسم ECS عادةً إلى ما يصل إلى ستة مسحات). الطريقة الأكثر تقدمًا هي استخدام *JPEGTran* مع معلمة سطر الأوامر 'wizard' `--scans` وتحديد مسحات مخصصة.

لا توجد قيود أخرى بخلاف مقاطع المسح،
لذا فإن تصادم MD5 لأي ملفي JPG عشوائيين هو *فوري*، ولا يتطلب تصادم بادئة مختارة، فقط UniColl.

مع [البرنامج النصي](https://github.com/corkami/collisions/blob/master/scripts/jpg.py):```
21:07:35.65>jpg.py Ange.jpg Marc.jpg

21:07:35.75>

أمثلة:

⟷

عمليات مسح مخصصة

صورتا JPG متصادمتان عبر MD5

هذا مثال لتعريف عمليات مسح JPEGTran لتحويل صورة RGB بدقة 1944×2508 إلى JPG بنسبة 100% مع 20 عملية مسح تتسع جميعها في 64 كيلوبايت.``` // : -, , ;

// 0=luma 0: 0-0, 0, 0; 0: 1-1, 0, 0; 0: 2-6, 0, 0; 0: 7-10, 0, 0; 0: 11-13, 0, 0; 0: 14-20, 0, 0; 0: 21-26, 0, 0; 0: 27-32, 0, 0; 0: 33-40, 0, 0; 0: 41-48, 0, 0; 0: 49-54, 0, 0; 0: 55-63, 0, 0;

// 1=blueness 1: 0-0, 0, 0; 1: 1-16, 0, 0; 1: 17-32, 0, 0; 1: 33-63, 0, 0;

// 2=redness 2: 0-0, 0, 0; 2: 1-16, 0, 0; 2: 17-32, 0, 0; 2: 33-63, 0, 0;

root@kitploit:~
النتيجة:



*صورة RGB بمقاس 1944x2508 كملف JPG بجودة 100% مع 20 مسحًا*


### PNG



القيود النظرية والحلول البديلة:
- يستخدم PNG دالة CRC32 في نهاية أجزائه، لكنها تُتجاهل عمليًا. يمكن أن تكون صحيحة لكن ذلك غير مطلوب.
- بيانات الصورة الوصفية (الأبعاد، الفضاء اللوني...) مخزنة في جزء `IHDR`،
  والذي يجب نظريًا أن يكون مباشرة بعد التوقيع (أي قبل أي تعليق محتمل)،
  لذا فهذا يعني أننا نستطيع فقط حساب التصادمات مسبقًا للصور ذات البيانات الوصفية نفسها.
  ومع ذلك، يمكن أن يكون هذا الجزء فعليًا بعد كتلة تعليق (في الغالبية العظمى من القارئات، باستثناء قارئات Apple)، لذا يمكننا وضع بيانات التصادم قبل الترويسة،
  مما يتيح تصادم أي زوج من صور PNG مع حساب مسبق واحد.

بما أن طول جزء PNG محدد بأربعة بايتات، فلا حاجة لتعديل بنية أي من الملفين: يمكننا القفز فوق صورة كاملة دفعة واحدة.

يمكننا إدراج أي عدد نريده من الأجزاء المهملة، لذا يمكننا إضافة جزء للمحاذاة، ثم جزء سيتغير طوله بواسطة UniColl. فيصبح الطول `00` `75` و `01` `75`.

إذن التصادم MD5 لصورتي PNG عشوائيتين يكون *فوريًا*، دون أي شرط مسبق (لا حساب، فقط بعض التغييرات البسيطة في الملفات)، ولا يتطلب تصادم بادئة مختارة، فقط UniColl.

مع [البرنامج النصي](https://github.com/corkami/collisions/blob/master/scripts/png.py):```
19:27:04.79>png.py nintendo.png sega.png

19:27:04.87>

أمثلة:

⟷

صورتا PNG متصادمتان عبر MD5 بخصائص مختلفة

إليك تسجيل للعملية كاملة.

تسجيل لتصادم PNG شامل (تعسفي)

عدم التوافق

معظم القارئات تقبل بسلاسة ملفات PNG التي تبدأ بكتلة ليست IHDR.

ومع ذلك، فإن بعضها (مثل Safari وPreview - أي غيرها؟) لا يتسامح مع ذلك. في هذه الحالة، يجب أن تكون ترويسة الصورة وخصائصها (الأبعاد، فضاء الألوان) أولاً، قبل أي كتل تصادم.

في هذه الحالة، يجب أن يكون للملفين المتصادمين نفس الخصائص. مرة أخرى، يكفي UniColl، وبالطبع يمكن إعادة استخدام زوج البادئات المحسوب لأي زوج آخر من الملفات ذات الخصائص نفسها.

إليك نص برمجي لتصادم أي زوج من هذه الملفات، ويشغّل UniColl عند الحاجة لحساب زوج البادئات.

أمثلة:

⟷

⟷

زوجان من صور PNG المتصادمتين عبر MD5 بخصائص متطابقة لتحقيق أقصى توافق

إليك تسجيل للعملية كاملة عند استدعاء UniColl،

تسجيل لتصادم PNG عبر UniColl

وتسجيل آخر عندما تكون البادئة قد حُسِبت بالفعل.

تسجيل لتصادم PNG محسوب مسبقاً

GIF

GIF صعب:

  • يخزّن بياناته الوصفية في الترويسة قبل إمكانية أي تعليق، لذلك لا يمكن أن تكون هناك بادئة عامة لجميع ملفات GIF.
  • إذا كان الملف يحتوي على لوحة ألوان عامة، فإنها تُخزَّن أيضًا قبل إمكانية أي تعليق.
  • كتل التعليقات فيه محدودة بطول بايت واحد، أي بحد أقصى 256 بايت!

ومع ذلك، تتبع كتل التعليقات بنية غريبة: إنها سلسلة من <length:1> <data:length> حتى يتم تعريف طول صفري. وهذا يجعل أي بايت غير صفري 'قفزة إلى الأمام' صالحة. وهذا يجعلها مناسبة للاستخدام مع FastColl، كما هو موضح في PoC||GTFO 14:11.

إذن على الأقل، حتى لو لم نتمكن من الحصول على بادئة عامة، يمكننا تصادم أي زوج من صور GIF بنفس البيانات الوصفية (الأبعاد، اللوحة)، ولا نحتاج سوى ثانية من FastColl لحساب باديته.

المشكلة الآن هي أننا لا نستطيع القفز فوق صورة كاملة مثل PNG أو فوق بنية كبيرة مثل JPG.

الحل البديل الممكن هو معالجة البيانات المضغوطة أو تقسيم الصورة إلى مناطق صغيرة جداً كما في حالة GIF hashquine، لكن هذا ليس الأمثل.

فكرة أخرى تعمل بشكل عام هي أن بيانات الصورة تُخزَّن أيضًا باستخدام بنية تسلسل length data هذه: لذا إذا أخذنا صورتَي GIF بدون حركة، علينا فقط:

  • توحيد اللوحة (normalize palette)
  • ضبط مدة الإطار الأول على الحد الأقصى
  • صياغة تعليق سيقفز إلى بداية بيانات الإطار الأول، بحيث ينزلق التعليق فوق بيانات الصورة كما لو كان تعليقًا، وينتهي بالطريقة نفسها: حتى يصادف طولًا صفريًا. عندها سيواجه المحلل الإطار التالي ويعرضه.

مع إعداد بسيط (بضع مئات من البايتات فقط كزيادة)، يمكننا الانزلاق فوق أي صورة GIF والتغلب على حد الـ256 بايت.

هذه الفكرة اقترحها Marc، وهي رائعة!

لذا في النهاية، القيود الحالية لتنسيق GIF لتصادمات MD5 الفورية هي:

  • بدون حركة (no animation)
  • يجب توحيد الصور على نفس اللوحة - انظر gifsicle --use-colormap web
  • يجب أن تكون أبعاد الصور متطابقة
  • بعد 11 دقيقة، سيُظهر كلا الملفين الصورة نفسها

اختصار سهل لتوحيد صور GIF الثابتة هو جعلها إطارات حركة للصورة نفسها، ثم يمكننا استخدام نص برمجي لإعادة استخدام كتل FastColl أو حسابها لإنشاء زوج ملفات يعرض كلًا منهما.

أمثلة:

⟷

صورتا GIF متصادمتان عبر MD5 - الصور من KidMoGraph

إليك تسجيل للعملية كاملة.

تسجيل لتصادم GIF عبر FastColl

GZIP

مواصفات GZIP الإصدار 4.3: RFC 1952 (1996).

  • يتكوّن ملف Gzip من 'عضو' واحد أو أكثر (تدفقات gzip) متراصة. سيتم فك ضغطها جميعًا وإلحاق محتواها غير المضغوط ببعضه البعض - حتى لو كان المحتوى غير المضغوط للعضو فارغًا.
  • يمكن فصل هذه الأعضاء بأصفار. سيتم تخطي الأصفار ببساطة، باستثناء بداية الملف. سيتم فحص أي بايت غير صفري بحثًا عن التوقيع 1F 8B. إذا لم يطابق التوقيع، سيتوقف التحليل، ويمكن استخدام ذلك لإيقاف التحليل قسريًا بين حمولتين، لكنه سيطلق بعض التحذيرات التي قد تسبب مشاكل. إستراتيجية أخرى هي إضافة عضو فارغ إضافي في نهاية الملف، وجعل تحليل الحمولتين ينتهي هناك - عند العضو أو عند جسمه.
  • حقلا filename وfile comment الاختياريان ينتهيان بحرف صفري، بينما Extra field محدد بحقل حجم 16 بت، وبالتالي قابل للاستغلال. يتكون من حقل فرعي واحد أو أكثر، مع معرّف وطول فرعي خاص به، لكن الحقول الفرعية غير إلزامية - فعدد قليل جدًا منها معرّف رسميًا.

لذلك فإن عضو gzip فارغ مع حقل إضافي هو مضيف طفيلي مثالي.

إذا كان الملف العلوي كبيرًا جدًا بحيث لا يتسع في حقل إضافي، فيمكن تقسيم تدفقه غير المضغوط إلى ملفات أصغر حتى تتسع جميعها في حقول إضافية.

بعد ترويسة العضو يأتي جسمه المضغوط، وCRC32 الخاص به، وحجمه غير المضغوط (غير إلزامي). لذلك فإن جسم بيانات فارغ مع CRC32 وحجم صفريين يشكلان غلافًا ختاميًا عامًا (postwrap)، يمكن حتى مشاركته بين ترويسات أعضاء مختلفة.

تعتمد تطبيقات مختلفة على الحجم غير المضغوط للعضو الأخير بدلاً من مجموع جميع الأعضاء. لذا ستُظهر ملفاتنا المتصادمة أن حجمها صفري، لأن هذه الملفات تنتهي بعضو فارغ يُستخدم كنقطة انطلاق (trampoline).

إليك نص برمجي لتوليد تصادمات MD5 فورية لملفَي GZip. يستغرق معظم وقته في فك ضغط البيانات وإعادة ضغطها إذا كانت ملفات الإدخال كبيرة - بادئات التصادم محسوبة مسبقًا. لا يمكن تقسيم الأعضاء دون فك الضغط لأن CRC32 غير المضغوط يحتاج إلى الحساب.

ملف .tar.gz هو مجرد أرشيف gzip لأرشيف tar. سيعمل بشكل جيد مع tar المضغوط عبر gzip، بخلاف tar نفسه.

أمثلة: collision1.tar.gz (Pacome) ⟷ collision2.tar.gz (Reg)

LZ4 / Zstandard

LZ4 وZstandard هما تنسيقا ضغط مختلفان، ببنية عامة متشابهة: يتكونان من إطارات، يبدأ كل إطار بسحر محدد: 0xFD2FB528 لإطارات Zstandard، و0x184D2204 لإطارات Lz4.

كما أنهما يتشاركان نفس إطارات TLV 'القابلة للتخطي'، والتي تبدأ بـ4 بايتات من القيم السحرية في النطاق 0x184D2A50 - 0x184D2A5F، ثم طول بيانات المستخدم (4 بايتات، بترتيب البايتات الأقل أهمية أولاً)، ثم بيانات المستخدم نفسها. هذه الإطارات اختيارية تمامًا، وبأي طول، وقابلة للتكرار. يمكن أن تبدأ الملفات بهذه الإطارات. لذا يمكن ربط هذه الإطارات معًا لإنشاء بادئة تصادم عامة مثالية، عبر التنسيقين.

إليك نص برمجي لتوليد تصادمات MD5 فورية لملفَي Zstd/Lz4. مثل Gzip، سيظهر أرشيفان مختلفان من الخارج بغض النظر عن المحتوى: على سبيل المثال، ملف .cpio.zst.

أمثلة:

  • md5-1.lz4 ⟷ md5-2.lz4
  • md5-1.zstd ⟷ md5-2.zstd
  • md5-c6a611ce.zstd ⟷ md5-c6a611ce.lz4

Portable Executable

الملف التنفيذي المحمول (Portable Executable) له بنية فريدة من نوعها:

  • ترويسة DOS القديمة عديمة الفائدة تقريبًا، وتشير إلى البنية التالية، وهي ترويسة PE. لا دور آخر لترويسات DOS. يمكن تبادل ترويسات DOS بين الملفات التنفيذية.
  • يجب أن تكون ترويسة DOS عند الإزاحة 0، ولها طول ثابت يساوي كتلة كاملة، ويكون المؤشر في نهاية البنية، بعيدًا عن متناول UniColl: لذلك فإن تصادم البادئة المختارة فقط هو المفيد لتصادم ملفات PE بهذه الطريقة.
  • ترويسة PE وما يليها يحددان الملف بأكمله.

إذن الإستراتيجية هي:

  1. يمكن نقل ترويسة PE إلى الأسفل لإفساح مجال لكتل التصادم بعد ترويسة DOS.
  2. يمكن استغلال ترويسة DOS (عبر تصادمات البادئة المختارة) للإشارة إلى إزاحتين مختلفتين، حيث سيتم نقل ترويستَي PE مختلفتين.
  3. يمكن وضع المقاطع بجانب بعضها البعض، بعد بنية DOS/Collisions/Header1/Header2. تحتاج فقط إلى تطبيق فرق (delta) على إزاحتي جدولي المقاطع.

هذا يعني أنه من الممكن تصادم أي زوج من الملفات التنفيذية PE فورًا، حتى لو كانت تستخدم أنظمة فرعية أو معماريات مختلفة.

في حين أن تصادم الملفات التنفيذية عادة ما يكون تافهًا عبر أي محمّل (loader)، فإن هذا النوع من الاستغلال هنا شفاف: الكود متطابق ويُحمَّل على نفس العنوان.

أمثلة: tweakPNG.exe (GUI) ⟷ fastcoll.exe (CLI)

إليك نص برمجي لتوليد تصادمات MD5 فورية للملفات التنفيذية لنظام Windows.

MP4 وغيرها

حاوية هذا التنسيق عبارة عن سلسلة من كتل Length Type Value تُسمى ذرات (Atoms). الطول هو 32 بت بترتيب البايتات الكبير (big-endian) ويغطي نفسه والنوع والقيمة، لذا فإن الحد الأدنى للطول الطبيعي هو 8 (النوع عبارة عن سلسلة من 4 أحرف ASCII).

إذا كان الطول صفريًا، فإن الذرة تستحوذ على بقية الملف - مثل ذرات jp2c في ملفات JP2. إذا كان 1، فإن النوع يتبعه طول 64 بت، مما يحوّل الذرة إلى Type Length Value، ويجعلها متوافقة مع تصادمات أخرى مثل Shattered.

بعض الذرات تحتوي ذرات أخرى: في هذه الحالات، تُسمى صناديق (boxes). لهذا السبب تُسمى هذه البنية التي لا اسم لها بخلاف ذلك 'ذرة/صندوق' (atom/box).

تنسيق 'ذرة/صندوق' المستخدم في MP4 هو في الواقع مشتق من Apple Quicktime، ويُستخدم بواسطة العديد من التنسيقات الأخرى (JP2, HEIF, F4V).

نوع الذرة الأول هو عادةً ftyp، مما يتيح التمييز بين تنسيق الملف الفعلي.

التنسيق متساهل إلى حد كبير: فقط اربط ذرات free، واستغل طول إحداها باستخدام UniColl، ثم اقفز فوق الحمولة الأولى.

بالنسبة لملفات MP4، الشيء الوحيد الذي يجب إضافته هو ضبط جداول stco (جدول العينات - إزاحات الكتل) أو co64 (المكافئ 64 بت)، لأنها إزاحات مطلقة (!) تشير إلى بيانات الفيلم mdat - وهي إلزامية فعلًا!

وهذا يعطينا نصًا برمجيًا يصادم أي فيديو عشوائي فورًا - و كما ذُكر، قد يعمل على تنسيقات أخرى غير MP4.

Nirvana - Smells like Teen Spirit / Weird Al Yankovik - Smells like Nirvana

أمثلة (فيديوهات من KidMoGraph):

  • أطوال 32 بت (قياسي) collision1.mp4 ⟷ collision2.mp4

    ⟷

  • أطوال 64 بت collisionl1.mp4 ⟷ collisionl2.mp4

    ⟷

لاحظ أن بعض المشاهدات (OS X, Safari, FireFox) لا تسمح بملف يبدأ بذرة ليست ftyp. في هذه الحالة، يجب أن تغطي البادئة ذلك، وهي ليست عامة جدًا، لكن بخلاف ذلك فهي نفس الإستراتيجية - محدودة فقط بنوع ملف واحد.

JPEG2000

تبدأ ملفات JPEG2000 عادةً ببنية Atom/Box مثل MP4، ثم تكون الذرة الأخيرة jp2c عادةً حتى نهاية الملف (طول صفري)، ثم من هذه النقطة فصاعدًا تتبع بنية JFIF، مثل JPEG (بدءًا بـFF 4F كعلامة مقطع).

الشكل النقي لـJFIF مقبول أيضًا، وفي هذه الحالة يكون التصادم مثل JPEG: متوافق مع Shattered، لكن مع تعليقات محدودة بـ64 كيلوبايت.

من ناحية أخرى، إذا عالجت ملفات JPEG2000 باستخدام Atom/Box، فلن تواجه هذا القيد.

كما ذُكر سابقًا، إذا كنت تحاول تصادم هذه البنية و إذا كانت هناك قيود أكثر - على سبيل المثال، بعض التنسيقات لا تتسامح مع البدء بذرة free - فيمكنك حساب أزواج بادئات UniColl أخرى خاصة بهذا التنسيق: يبدو أن JPEG2000 يفرض ذرة 'jP ' أولاً قبل ftyp المعتاد، لكن بخلاف ذلك، هذا هو القيد الوحيد: لا حاجة لنقل أي شيء.

لذا فإن النص البرمجي الناتج أبسط حتى!

Oded Goldreich / Neal Koblitz

أمثلة: collision1.jp2 ⟷ collision2.jp2

PDF

حول Shattered

استغلال Shattered لم يكن خدعة PDF، بل خدعة JPG داخل ملف PDF. لقد مكّن فقط ملف PDF من احتواء كائن مضغوط بصيغة JPG يمكن أن يكون له محتويان مختلفان. كان يجب أن يكون ملفا PDF متطابقين تمامًا فيما عدا ذلك.

لاحظ أن المستندات يمكن أن تكون طبيعية تمامًا، ويمكنها فقط قص صورة JPG المتصادمة وعرضها في أماكن مختلفة، مثل المستندات متعددة الصفحات.

أمثلة: ورقة Shattered المعدّلة ⟷ ورقة Shattered الأصلية

ورقة Shattered تستخدم صورة JPG متصادمة في موضعين

تصادمات PDF باستخدام MD5

باستخدام MD5 (وأنماط تصادم أخرى)، يمكننا إجراء تصادمات PDF على مستوى المستند، بدون أي قيود على أيٍّ من الملفين!

بنية PDF مختلفة جدًا عن تنسيقات الملفات الأخرى. يستخدم أرقام الكائنات والمراجع لتعريف شجرة. يعتمد المستند بأكمله على عنصر الجذر (Root).

هذا ملف PDF (صالح)``` text %PDF-1. 1 0 obj<</Pages 2 0 R>>endobj 2 0 obj<</Kids[3 0 R]/Count 1>>endobj 3 0 obj<</Parent 2 0 R>>endobj trailer <</Root 1 0 R>>

root@kitploit:~
يعادل:``` text
%PDF-1.
11 0 obj<</Pages 12 0 R>>endobj
12 0 obj<</Kids[13 0 R]/Count 1>>endobj
13 0 obj<</Parent 12 0 R>>endobj
trailer <</Root 11 0 R>>

Tricks:

  • تخزين كائنات غير مستخدمة في ملف PDF أمر مقبول.
  • تخطي أي أرقام كائنات مسموح به أيضًا. بل توجد طريقة رسمية لتخطي الأرقام في جدول XREF.

إذن تخزين شجرتي مستندات في نفس الملف أمر مقبول. كل ما نحتاجه هو جعل الكائن الجذر يشير إلى أيٍّ من الكائنين الجذرين للمستندين.

لذا نحتاج فقط إلى أخذ مستندين، وإعادة ترقيم الكائنات والمراجع بحيث لا يكون هناك تداخل، وصنع تصادم بحيث يمكن تغيير رقم العنصر المُشار إليه ككائن جذر مع الحفاظ على نفس قيمة التجزئة، وهذا مناسب تمامًا لـ UniColl مع N=1، وضبط جدول XREF وفقًا لذلك.

بهذه الطريقة، يمكننا تصادم أي زوج من ملفات PDF بأمان، بغض النظر عن أرقام الصفحات والأبعاد والصور...

تعليقات

يمكن لملف PDF تخزين بيانات خارجية بطريقتين:

  • كتعليق سطري، حيث الأحرف الوحيدة غير المسموح بها هي السطر الجديد (\r و \n). يمكن استخدام هذا داخل كائن قاموس، لتعديل مرجع كائن على سبيل المثال، عبر UniColl. إذن هذا كائن PDF صالح حتى لو احتوى على كتل تصادم ثنائية - فقط أعد المحاولة حتى لا تحتوي على أحرف سطر جديد: ``` 1 0 obj << /Type /Catalog /MD5_is /REALLY_dead_now__ /Pages 2 0 R %¥┬•σe╕█╙X₧_~π▌╒εX∟■φe♦%τ8╞■[...]p╛╬ûFZ»‼v◘Åp↑╝%▓% ▼σφj╔◄dZ▀c²aU≤╨╩[├└─yNΓ5╔+▀╪yδ☻ß⌐░¼à(☺z₧
    endobj
    root@kitploit:~
  • ككائن دفق، وفي هذه الحالة تكون أي بيانات ممكنة، لكن بما أننا داخل كائن، لا يمكننا تغيير بنية ملف PDF بالكامل، لذلك يتطلب الأمر تصادم بادئة مُختارة لتعديل البنية خارج كائن الدفق المحتوي.

نص متصادم

الحالة الأولى تجعل من الممكن إبراز جمال UniColl، وهو تصادم تكون فيه الاختلافات قابلة للتنبؤ، حتى تتمكن من كتابة الشعر على بيانات متصادمة - بفضل Jurph!

بدلاً من تعديل بنية المستند وخداع المحللات، سنستخدم كتل التصادم مباشرة لإنتاج نص مباشر، مع قراءة بديلة!``` V V Now he hash MD5, Now he hath MD5, No enemy cares! No enemy dares! Only he gave Only he have the shards. the shares. Can’t be owned & Can’t be pwned & his true gold, his true hold, like One Frail, like One Grail, sound as fold. sound as gold. ^ ^

root@kitploit:~
أمثلة: [poeMD5 A](https://github.com/corkami/collisions/blob/master/examples/poeMD5_A.pdf) ⟷ [poeMD5 B](https://github.com/corkami/collisions/blob/master/examples/poeMD5_B.pdf)



*إبداع فني تشفيري حقيقي :)*

(ملاحظة: لقد أفسدت التوافق مع Adobe، لكن هذا خطأي وليس خطأ UniColl)


**بنية تصادم المستندات**

سواء استخدمت UniColl كتعليق سطري أو بادئة مختارة داخل كائن دفق وهمي، فإنّ الاستراتيجية متشابهة:
أعد ترتيب أرقام الكائنات، ثم اجعل كائن Root يشير إلى كائنات مختلفة، لذا وعلى عكس Shattered، يعني هذا تصادمًا فوريًا لأي زوج عشوائي من ملفات PDF، على مستوى المستند.

خدعة مفيدة هي أنّ مخرجات [`mutool clean`](https://mupdf.com/docs/manual-mutool-clean.html) يمكن التنبؤ بها بشكل موثوق،
لذا يمكن استخدامها لتطبيع ملفات PDF كمدخلات، وإصلاح ملف PDF المدمج لديك مع الحفاظ على الأجزاء المهمة من الملف دون تعديل.
إنّ MuTool لا يتجاهل المفاتيح/القيم الزائفة - إلا إذا طُلب منه ذلك، ويُبقيها بالترتيب نفسه،
لذا فإنّ استخدام إدخالات قاموس وهمية مثل `/MD5_is /REALLY_dead_now__` مثالي لمحاذاة الأمور بشكل يمكن التنبؤ به دون الحاجة إلى نوع آخر من التعليقات.
ومع ذلك، فإنّه لا يُبقي التعليقات في القواميس (لذلك لا توجد خدعة تعليق سطري)

طريقة سهلة للقيام بعملية إعادة ترتيب الكائنات دون عناء هي ببساطة دمج ملفي PDF معًا عبر `mutool merge` ثم تقسيم كائن `/Pages` إلى قسمين.

لإفساح مجال لهذا الكائن، ما عليك سوى دمج ملف PDF وهمي في مقدمة المستندين.

اختياريًا، أنشئ مرجعًا وهميًا إلى المصفوفة المعلّقة لمنع جامع القمامة من حذف المجموعة الثانية من الصفحات.


**مثال**:
مع هذا [البرنامج النصي](https://github.com/corkami/collisions/blob/master/scripts/pdf.py)، يستغرق الأمر [أقل من ثانية](https://github.com/corkami/collisions/blob/master/examples/pdf.log) لتصادم الورقتين البحثيتين العامتين بتنسيق PDF مثل Spectre وMeltdown:

أمثلة: [spectre.pdf](https://github.com/corkami/collisions/blob/master/examples/collision1.pdf) ⟷ [meltdown.pdf](https://github.com/corkami/collisions/blob/master/examples/collision2.pdf)



امتداد محتمل: سلسلة كتل UniColl للحفاظ أيضًا على أزواج من [الكائنات غير الحرجة](https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf#page=81) المختلفة التي يمكن الإشارة إليها في كائن Root - مثل `Outlines` و`Names` و`AcroForm` والإجراءات الإضافية (`AA`) - في ملفات المصدر الأصلية.

**في PDFLaTeX**

تعمل التقنيات السابقة مع مجرد زوج من ملفات PDF، لكن من الممكن أيضًا القيام بذلك مباشرةً من مصادر TeX عبر [عوامل PDFTeX المحددة](http://texdoc.net/texmf-dist/doc/pdftex/manual/pdftex-a.pdf).

يمكنك تعريف الكائنات مباشرةً - بما في ذلك المفاتيح والقيم الوهمية للمحاذاة - وتعريف كائنات فارغة لحجز بعض فتحات الكائنات، وذلك بإدراج ما يلي في بداية ملفات مصدر TeX الخاصة بك:``` latex
% set PDF version low to prevent stream XREF
\pdfminorversion=3

\begingroup

  % disable compression to keep alignments
  \pdfcompresslevel=0\relax

  \immediate
  \pdfobj{<<
    /Type /Catalog

    % cool alignment padding
    /MD5_is /REALLY_dead_now__

    % the first reference number should be on offset 0x49,
    % so the '2' object number will be changed to '3' by UniColl
    /Pages 2 0 R

    % now padding so that the collision blocks (ends at 0xC0) are covered
    /0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF
    % with an extra character to be replaced by a return char
    /0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0
  >>}

  % the original catalog of the shifted doc
  \immediate\pdfobj{<</Type/Pages/Count 1/Kids[8 0 R]>>}

  % the original catalog of the host doc
  \immediate\pdfobj{<</Type/Pages/Count 1/Kids[33 0 R]>>}

  % now we need to reserve PDF Objects so that there is no overlap
  \newcount\objcount

  % the host size (+3 for spare object slots) - 1
  % putting a higher margin will just work, and XREF can have huge gaps
  \objcount=25
  \loop
    \message{\the\objcount}
    \advance \objcount -1

  \immediate\pdfobj{<<>>} % just an empty object

  \ifnum \objcount>0
  \repeat

\endgroup

لا تنسَ تطبيع مخرجات PDFLaTeX - باستخدام mutool على سبيل المثال - إذا لزم الأمر: من الصعب الحصول على بنى قابلة لإعادة الإنتاج عبر التوزيعات باستخدام PDFLaTeX - قد ترغب حتى في ربط وقت التنفيذ للحصول على نفس الهاش بالضبط إذا لزم الأمر.

JPG في PDF

قد تتوقع أن يكون JPG مجرد صور، لكنه في ملف PDF وفي بعض قارئات PDF (غير المتصفحات، مثل Evince وAdobe Reader)، يمكن استخدامه كمحتوى صفحة تمامًا مثل أي كائن مضمّن آخر، أي أنه مضمّن داخل صورة JPEG.

لتخزين بيانات JPEG دون فقدان، خزّنها بتدرج رمادي 100%، ثم إما استخدم صورة من صف/عمود واحد، أو كرّر سطر البيانات 8 مرات (نظرًا لأن كتل JPEG بحجم 8×8)، وستُخزَّن بياناتك دون فقدان وتُستشهد بها صفحات PDF.

أمثلة على تصادم SHA-1 بين ملفي PDF عبر بيانات صفحة JPEG (صورة بتدرج رمادي تعرض ألوانًا) كمحتوى صفحة متجهي:

If ⟷ Shattered - the movie

ملفا PDF متصادمان SHA-1 مع بيانات صورة مخزنة بصيغة JPG

من الممكن الإشارة إلى JPG المتصادم مرتين: كمحتوى صفحة، دون فقدان، وهو يشير أيضًا إلى نفسه كصورة مفقودة الجودة (lossy) لعرضها. مرة أخرى، الصورة التي سيتم عرضها بتدرج رمادي، لكن محتوى الصفحة يمكنه عرض بعض الألوان عبر عوامل تشغيل PDF.

أعلى الصورة يُظهر محتوى الصفحة مكررًا 8 مرات.

أمثلة على تصادم SHA-1 بين ملفي PDF عبر JPEG مُستخدم كبيانات صفحة وصورة ليتم عرضها:

Skulls & Crossbones ⟷ Golden Axe

ملفا PDF متصادمان SHA-1 مع JPG مستخدم كصورة ومحتوى صفحة

ZIP

TL;DR لا يوجد تصادم عام قابل لإعادة الاستخدام لـ ZIP، لكن يوجد لتنسيق قائم على ZIP. يجب أن يكون من الممكن تصادم ملفين في 2h.core (أسرع 36 مرة من chosen-prefix)

أرشيفات ZIP عبارة عن شطيرة من 3 طبقات (على الأقل). أولاً يأتي محتوى الملفات (سلسلة من بنى Local File Header، واحدة لكل ملف أو دليل مؤرشف)، ثم بعض الفهرس (مرة أخرى، سلسلة من Central Directory)، ثم بنية واحدة تشير إلى هذا الفهرس (End Of Central Directory).

لا يمكن تغيير ترتيب هذه الطبقات. بعض المحللات تحتاج فقط إلى بنية محتوى الملف، لكن هذه ليست طريقة صحيحة للتحليل ويمكن استغلالها.

بسبب هذا الترتيب المطلوب، لا توجد بادئة عامة يمكن أن تساعد في أي تصادم.

نهج غير عام

يمكن أن يكون نهج آخر هو مجرد دمج الأرشيفين، بطبقاتهما المدمجة، واستخدام UniColl - لكن مع N=2، مما يُحدث فرقًا في البايت الرابع - لقتل التوقيع السحري لـ End of Central Directory.

هذا يعني أنه يمكن للمرء أن يصطدم بملفي ZIP عشوائيين باستخدام UniColl واحد و24 بايتًا من البادئة المحددة.

أحد الأمثلة النموذجية لبنية End of Central Directory، والتي يبلغ طولها 22 بايتًا إذا كان التعليق فارغًا:``` 00: 504b 0506 0000 0000 0000 0000 0000 0000 PK.............. 10: 0000 0000 0000 ......

root@kitploit:~
إذا استخدمنا هذا كبادئة (قم بحشو البادئة إلى 16 بت) لـ UniColl و `N=2`، فإن الاختلاف يكون في البايت الرابع، مما يقتل السحر `.P .K 05 06` بتغييره بشكل متوقع إلى `.P .K 05 86````
00: 504b 0506 0000 0000 0000 0000 0000 0000  PK..............
10: 0000 0000 0000 2121 eb66 cf9d db01 83bb  ......!!.f......
20: 2888 4c41 e345 7d07 1634 5d4a 3b61 89a0  (.LA.E}..4]J;a..
30: 0029 94af 4168 2517 0bbc b841 cbf2 9587  .)..Ah%....A....
40: e438 0043 6390 279d 7c9e a01e e476 4c36  .8.Cc.'.|....vL6
50: 527f b1f4 653e d866 f98d 7278 5324 0bd5  R...e>.f..rxS$..
60: b31d ef6d d5d6 1163 5a2e a8a5 21bf eab4  ...m...cZ...!...
70: c59c 028e a913 f6b7 0036 c93f 5092 a628  .........6.?P..(

علاوةً على ذلك، يمكننا تمرير الأسرار بأمان باستخدام موفِّر خزينة عن بُعد.``` 00: 504b 0586 0000 0000 0000 0000 0000 0000 PK.............. 10: 0000 0000 0000 2121 eb66 cf1d db01 83bb ......!!.f...... 20: 2888 4c41 e345 7d07 1634 5d4a 3b61 89a0 (.LA.E}..4]J;a.. 30: 0029 94af 4168 251f 0bbc b841 cbf2 9587 .)..Ah%....A.... 40: e438 00c3 6390 279d 7c9e a01e e476 4c36 .8..c.'.|....vL6 50: 527f b1f4 653e d866 f98d 72f8 5324 0bd5 R...e>.f..r.S$.. 60: b31d ef6d d5d6 1163 5a2e a8a5 21bf eab4 ...m...cZ...!... 70: c59c 028e a913 f6af 0036 c93f 5092 a628 .........6.?P..(

root@kitploit:~
هذا ليس عامًا على الإطلاق، ولكنه أسرع بكثير من تصادم البادئة المختارة:```
real 12m23.993s
user 112m24.072s
sys 2m0.194s

المشكلة هي أن بعض المحللات (Parsers) ما تزال تحلل ملفات ZIP من الأعلى إلى الأسفل حتى وإن كان ينبغي تحليلها من الأسفل إلى الأعلى: من الطرق لضمان تحليل كلا الملفين بشكل صحيح هو ربط كتلتين من UniColl معًا، لتفعيل/تعطيل كل End of Central Directory.

لمنع محللات ZIP من الشكوى بشأن المساحة غير المستخدمة، يمكن إساءة استخدام Extra Fields، وتعليقات الملفات في Central Directory وتعليقات الأرشيف في End of Central Directory.

diagram of ZIP collision

مثال: يوجد هنا كود تجميع (assembly) يصف بنية ملف ZIP مزدوج، يمكنه استضافة ملفي أرشيف مختلفين.

بعد عمليتي حساب Unicoll، يعطي الملفين المتصادمين: collision1.zip ⟷ collision2.zip

الصيغ المعتمدة على Zip

حتى إذا لم يكن من الممكن استغلال صيغة Zip نفسها بشكل عام مثل Gzip، فإن بعض الصيغ التي تعتمد على Zip يمكن استغلالها بشكل عام داخل أرشفة Zip ذات بنية محددة مسبقًا. يجب اتخاذ بعض الاحتياطات لجعل تصادم Zip عامًا.

بعض الصيغ هي ملفات متعددة مخزنة في أرشيف Zip، وتعتمد على ملف جذر باسم ثابت يشير إلى ملفات أخرى في الأرشيف. يستخدم الكثير منها XML أو نصًا للملف الجذر، ويخزن الملفات الأخرى كما هي.

الفكرة : جعل مجموعتين من الملفات تتعايشان في نفس الأرشيف، والإشارة إلى إحدى المجموعتين. يمكن تخزين جذر عام في بداية الملف، لكن كتل التصادم تُخزن خارج محتوى الملف، داخل الأرشيف (بما أن التصادمات ذات إنتروبيا عالية جدًا، فمن المستحيل استغلال ملفات XML أو الملفات النصية بنمط ASCII فقط مع التصادمات).

الخطوات:

  1. ضع مجموعتين من الملفات من مصدرين مختلفين في نفس الأرشيف - أي في مجلدات فرعية مختلفة.

  2. عدّل الملف الجذر ليشير بالتناوب إلى كل مجموعة.

  3. بما أن الطابع الزمني والطول وCRC للملف الجذر مخزنة في كل من Local File Header - قبل محتويات الملف - وفي Central Directory - بعد محتويات الملف - يجب ألا تتغير هذه القيم بين النسختين من الملف.

    • إذا تغيّر الطول، فستتغير جميع المؤشرات اللاحقة، وبالتالي لن يكون من الممكن الحصول على لاحقة متطابقة.
    • إذا كانت قيمة CRC32 غير صحيحة في Central Directory، فقد تتجاهل المحللة هذه النسخة من القيمة، لكن تزوير CRC32 إلى قيمة ثابتة يساعد في تجنب المشكلة تمامًا. تزوير CRC بإضافة 4 بايتات عشوائية لن يكون كافيًا غالبًا، لأن هذه الملفات الجذرية تكون عادةً في XML أو نص بصياغات صارمة، وبالتالي ستصبح غير صالحة. يساعد CrcHack بشكل كبير في تزوير قيم CRC ببتات عشوائية دون الحاجة إلى brute-forcing، مع ضمان أن يكون الملف الناتج بنمط ASCII، وأن البتات المعدلة لا تزال داخل تعليق.
  4. استخدام extra field لملف وهمي إضافي -- حتى وإن كان فارغًا -- في الأرشيف بعد الملف الجذر هو طريقة أنيقة لتخزين كتل تصادم Hashclash: بهذه الطريقة، يحافظ أرشيف Zip على بنية قياسية ويمكن معالجته بسهولة لاحقًا، حتى باستخدام الأدوات القياسية.

Extra Fields ليس لها CRC32، وطولها 16 بت معلن في الترويسات مسبقًا. لها صيغة داخلية خاصة ID:2 Size:2 Data لكنها تُتجاهل عادةً، وهي موجودة في كل من Local File Header وCentral Directory، لكن يمكن أن تكون غائبة عن Central Directory للحفاظ على اللاحقة متطابقة بعد كتل التصادم.

قد يلزم الإعلان عن وجود الملف الإضافي الذي يغطي كتل التصادم في extra field الخاص به في بنية الصيغة، مثل ملف [Content_Types].xml في مستند OOXML. وقد يلزم تعديل ملفات XML أخرى في اللاحقة، حيث تتطلب بعض الصيغ استخدام مسارات مطلقة.

فيما يلي البنية العامة للاستغلال العام لصيغة معينة معتمدة على Zip:``` [Root file] (with constant CRC32)

[Dummy file] (with collision blocks in the extra field)

[...] <- rest of the archive, with 2 documents merged

root@kitploit:~
إذًا من خلال تحديد محتويات ملف الجذر مسبقًا وتزوير قيم CRC32 بنصوص ASCII، يمكن حساب تصادم Hashclash عام قابل لإعادة الاستخدام لتنسيق محدد قائم على zip.


### ملخص المتطلبات

- بادئتان أو أكثر
- نوع ملف واحد أو أكثر (الملفات متعددة الصيغ تعمل دون مشاكل)
- ملف جذر XML باسم ملف ثابت، وطول ملف ثابت، وCRC ثابتة: هذه المعلومات موجودة مرتين، قبل وبعد كتل التصادم
 - المحتويات هي XML عشوائي
 - الحشو ممكن، حتى عبر تعليق XML، للوصول إلى نفس الطول.
 - يمكن ضبط CRC (عبر CrcHack) على كل محتوى.
- مجموعتا الملفات تتعايشان معًا في اللاحقة، غالبًا في مجلدات مختلفة. بعض الأدوات تثبّت المسار، مما قد يقلل من التوافق.
- قد يلزم دمج ملف XML من نوع *Content type* لتغطية جميع الملفات، المدعومة وغير المدعومة (كتل التصادم، والمستند البديل)


### أمثلة

#### CRC32

تعليق XML بسيط (ASCII فقط) مع CRC32 مزورة (حساب فوري) باستخدام CrcHack.``` bash
echo "<!--ABCDEF-->" | crchack -b 4.0:+.8*6:1 -b 4.1:+.8*6:1 -b 4.2:+.8*6:1 -b 4.3:+.8*6:1 -b 4.4:+.8*6:1 -b 4.5:+.8*5:1 - 0xdeadf00d
<!--X{]EZF-->

مثال آخر حيث تقوم بضبط CRC في حالة رسالة أبجدية.```bash echo "" | crchack.exe -b 4:+.8*32:.8 - 0xcafebabe

root@kitploit:~
#### التصادمات

[zInsider](https://github.com/corkami/collisions/blob/master/scripts/zinsider.py) هو سكربت لإنشاء تصادمات MD5 فورًا لأزواج من المستندات العشوائية باستخدام صيغ ZIP+XML التالية:
- Office Open XML: docx / pptx / xlsx
- Open Container Format: epub
- Open Packaging Conventions:
  - 3D manufacturing format: 3mf
  - XML Paper Specification: xps / oxps

لإنشاء بادئات التصادم الخاصة بك، [إليك سكربت](https://github.com/corkami/collisions/blob/master/scripts/makezip.py) لتوليد زوج جذر من zip.
بعد حساب التصادمات، استخدم [هذا السكربت الآخر](https://github.com/corkami/collisions/blob/master/scripts/extendzip.py) لدمج زوج الجذور هذا مع لاحقة مشتركة.

بعض نماذج إثبات المفهوم للتصادم:
- Office Open XML: Excel ([1](https://github.com/corkami/collisions/blob/master/examples/free/md5-1.xls) - [2](https://github.com/corkami/collisions/blob/master/examples/free/md5-2.xls))، Powerpoint ([1](https://github.com/corkami/collisions/blob/master/examples/free/md5-1.pptx) - [2](https://github.com/corkami/collisions/blob/master/examples/free/md5-2.pptx))، Word ([1](https://github.com/corkami/collisions/blob/master/examples/free/md5-1.docx) - [2](https://github.com/corkami/collisions/blob/master/examples/free/md5-2.docx)).
- Open Container Format: Epub ([1](https://github.com/corkami/collisions/blob/master/examples/collision-1.epub) - [2](https://github.com/corkami/collisions/blob/master/examples/collision-2.epub)).
- Open Packaging Conventions: 3MF ([1](https://github.com/corkami/collisions/blob/master/examples/collision-1.3mf) - [2](https://github.com/corkami/collisions/blob/master/examples/collision-2.3mf))، XPS ([1](https://github.com/corkami/collisions/blob/master/examples/collision-1.xps) - [2](https://github.com/corkami/collisions/blob/master/examples/collision-2.xps)).


بعض الصيغ ذات الملفات المتعددة القائمة على Zip لا يمكن استغلالها بشكل عام:
- Quake PK3: أرشيف zip من الملفات دون جذر محدد.
- Open Document Format: يجب أن يذكر ملف `META-INF/manifest.xml` كل ملف آخر، لذا لا يمكن أن يكون عامًا.
- APK, JAR, XPI: يجب أن يذكر ملف `META-INF/MANIFEST.mf` أيضًا كل ملف آخر مع تجزئاته.


الشكر لـ [Philippe Lagadec](https://twitter.com/decalage2) على مساعدته في صيغ ملفات Office!


### أخرى

- Wasm، عبر قسم مخصص: [سكربت](https://github.com/corkami/collisions/blob/master/scripts/wasm.py)، أمثلة: [md5-1.wasm](https://github.com/corkami/collisions/blob/master/examples/free/md5-1.wasm) ⟷ [md5-2.wasm](https://github.com/corkami/collisions/blob/master/examples/free/md5-2.wasm)


## استراتيجيات غير شائعة

التصادمات عادةً ما تتعلق بملفين صالحين من النوع نفسه.


### MultiColls: سلسلة تصادمات متعددة

لا شيء يمنع تسلسل عدة كتل تصادم، والحصول على أكثر من محتويين بنفس قيمة التجزئة.
مثال على ذلك *hashquines* - التي تُظهر قيمة MD5 الخاصة بها.
يحتوي ملف [PoCGTFO 14](https://github.com/angea/pocorgtfo#0x14) على 609 تصادمات FastColl،
للقيام بذلك عبر نوعي ملفات داخل الملف نفسه.


#### Hashquines

Hashquines هي ملفات تُظهر قيمة التجزئة الخاصة بها. وهي مغطاة [هنا](https://github.com/corkami/collisions/blob/master/hashquines).


### الصلاحية

استراتيجية مختلفة تتمثل في إبطال نوع الملف لتجاوز الفحص كملف تالف.
مجرد الكتابة فوق التوقيع السحري سيكون كافيًا.
إلحاق كلا الملفين (صالحًا أو غير صالح) بصيغة
لا تحتاج إلى أن تكون عند الإزاحة 0 (أرشيف، مثل ZIP/RAR/...) سيكشف نوع ملف آخر.

هذا يتيح تصادمات polyglot دون استخدام تصادم ببادئة مختارة:
1. استخدم UniColl لتمكين أو تعطيل توقيع سحري، مثل PNG:
2. ألحق أرشيف ZIP

رغم أن كلا الملفين تقنيًا أرشيف ZIP صالح، إلا أن معظم المحللات تُرجع أول نوع ملف يتم العثور عليه وتبدأ المسح عند الإزاحة 0، لذا سترى نوع ملف مختلفًا.

أمثلة:

 ⟷ [غير صالحة](https://github.com/corkami/collisions/blob/master/examples/png-invalid.png)



### PolyColls: تصادمات لأنواع ملفات مختلفة

من الممكن أيضًا أن يكون طرفا التصادم من نوعين مختلفين لتقليل الشبهات:

سيناريو الهجوم:
1. أرسل `holiday.jpg`
2. احصل على إدراجه في القائمة البيضاء
3. أرسل `evil.exe`، الذي يملك نفس MD5.

في هذه الحالات، يكون تصادم البادئة المختارة مطلوبًا
إذا كان كلا النوعين بحاجة إلى البدء عند الإزاحة 0.

بعض الأمثلة على تخطيطات polycoll:

![pdf-jpg polyglot collision](https://assets.kitploit.com/production/public/readmes/47471/3dcd55e877a4ce9c933bf1478d0a71ede85e129b9e746414d754ffabceabe463.png)

*PDF/JPG polycoll*


![pe-png polyglot collision](https://assets.kitploit.com/production/public/readmes/47471/63df55a15e7ca33153f352f13ba273604df6b1ae3e1e8838b601fea39de801e0.png)

*PE/PNG polycoll*


#### PE - JPG

بما أن ترويسة PE أصغر عادةً من 0x500 بايت، فهي مناسبة تمامًا لتعليق JPG:
1. ابدأ بترويسات DOS/JPG
2. قفزة تعليق JPEG فوق ترويسة PE
3. ضع صورة JPG كاملة
4. ضع مواصفات PE كاملة

مرة أخرى، التصادم [فوري](https://github.com/corkami/collisions/blob/master/scripts/jpgpe.py)

أمثلة: [fastcoll.exe](https://github.com/corkami/collisions/blob/master/examples/jpg-pe.exe) ⟷ [Marc.jpg](https://github.com/corkami/collisions/blob/master/examples/jpg-pe.jpg)


#### PDF - PE

دمج PDF مع ملف وهمي باستخدام `mutool` طريقة عامة جيدة لإعادة ترتيب الكائنات
ثم جعل أول كائنين قابلين للتجاهل (صفحة وهمية ومحتوى)،
وهو مناسب تمامًا لاستضافة كائن `stream` بطول غير معروف كـ `1 0`،
وطوله مُشار إليه لاحقًا (بعد كتل التصادم) في الكائن الثاني.

المشكلة الوحيدة هي أن `mutool` سيضمّن الطول دائمًا - ويزيل مرجع الطول،
لذا يجب إعادة إدراجه في PDF بدلاً من القيمة،
لكن معظم المراجع `2 0 R` ستكون أصغر من الأطوال المرمزة.
لحسن الحظ يمكن إصلاح ذلك دون تغيير أي إزاحة كائن،
فلا حاجة لتعديل XREF.

إليك [سكربت](https://github.com/corkami/collisions/blob/master/scripts/pdfpe.py) مثلاً للتصادم الفوري بين عارض PDF ([Sumatra](https://www.sumatrapdfreader.org/free-pdf-reader.html) خفيف ومستقل) ومستند PDF:

أمثلة: [Poster.pdf](https://github.com/corkami/collisions/blob/master/examples/pepdf.pdf) ⟷ [Sumatra.exe](https://github.com/corkami/collisions/blob/master/examples/pepdf.exe)

![عارض PDF يعرض PDF (يعرض نفسه PDF) بنفس MD5](https://assets.kitploit.com/production/public/readmes/47471/4356d710fc4b60297ee05999be64f596198e9d4a02c826666818eb8ae117310f.png)

*عارض PDF يعرض PDF (يعرض نفسه PDF) بنفس MD5*


#### PDF - PNG

وبالمثل، من الممكن التصادم مثلاً بين ملفات PDF وPNG عشوائية دون قيود على أي من الجانبين. هذا فوري وقابل لإعادة الاستخدام وعام.

أمثلة: [Hello.pdf](https://github.com/corkami/collisions/blob/master/examples/png-pdf.pdf) ⟷ [1x1.png](https://github.com/corkami/collisions/blob/master/examples/png-pdf.png)


### PileUps (تصادم متعدد)

التصادمات التشفيرية ليست محصورة بملفين!

كما ثبت في تجربة [Nostradamus](https://www.win.tue.nl/hashclash/Nostradamus/) عام 2008،
فإن تسلسل التصادمات يجعل من الممكن التصادم لأكثر من ملفين.

التصادمات الأولى يمكن أن تكون متطابقة أو ببادئة مختارة، واللاحقة يجب أن تكون ببادئة مختارة.

يمكنك تسميتها multi-collisions، أنا أفضّل *pileups* - فهي أقصر :)


#### PE - PNG - MP4 - PDF

بدمج كل المعرفة المكتسبة سابقًا،
استخدمت 3 تصادمات ببادئة مختارة لصياغة 4 بادئات مختلفة لأنواع ملفات مختلفة:
مستند (PDF)، فيديو (MP4)، قابل للتنفيذ (PE) وصورة (PNG).

![مخطط pileup من PE/PNG/MP4/PDF](https://assets.kitploit.com/production/public/readmes/47471/f7c45f284bad51f431a2993cf4797f679c85671c028cf1862f1c07604740360a.png)

*مخطط pileup من PE/PNG/MP4/PDF*

هذا السكربت عام وفوري:

![مخطط pileup من PE/PNG/MP4/PDF](https://assets.kitploit.com/production/public/readmes/47471/3ec7caeb459eab294c6b9876a8a82e136502c3d11c599804fd7925fc2d819276.png)

أمثلة: [commodore.pdf](https://github.com/corkami/collisions/blob/master/examples/pileup.pdf) ⟷ [diagram.png](https://github.com/corkami/collisions/blob/master/examples/pileup.png) ⟷ [kidmo.mp4](https://github.com/corkami/collisions/blob/master/examples/pileup.mp4) ⟷ [sumatra18.exe](https://github.com/corkami/collisions/blob/master/examples/pileup.exe)


بما أنك قد توزّع ملفًا واحدًا فقط
ويستحيل تخمين قيم البادئات الأخرى منه،
فإن الحل هو تضمين جميع بادئات التصادم في كود JavaScript
وإدراجها في نماذج PoC الخاصة بك،
لتحويل ملفاتك إلى [HTML polyglots](https://github.com/corkami/collisions/blob/master/examples/polyglot.html) لمشاركة الملفات المتصادمة ذات الصلة بسهولة.



إن [العدد 19](https://github.com/angea/pocorgtfo#0x19) من 'PoC or GTFO' هو مثل هذا pileup **و** polyglot،
يجمع مستندًا من 80 صفحة مولّدًا بـ PDFLaTeX، وعارض PDF لنظام Windows،
ومخطط PNG، وفيديو MP4 قصير 'للتصادم' من [KidMoGraph](https://www.kidmograph.com/)
مع حمولة HTML لتوليد الملفات الأخرى من إصدار PDF
(وأرشيف ZIP أيضًا):



شكرًا لرافال هيرش على مساعدته الدائمة في JavaScript.


## حالات الاستخدام

من الأفضل التخلي عن MD5 تمامًا، لأن فحص الملفات الداخلي يستغرق وقتًا طويلاً وينطوي على مخاطر كبيرة!


### فلنصادمها جميعًا!

استخدام آخر للتصادمات الفورية والقابلة لإعادة الاستخدام والعامة هو إخفاء أي ملف من نوع معين - لنقل PNG - خلف ملفات وهمية (أو نفس الملف في كل مرة) - وهو في الواقع مجرد تسلسله مع نفس البادئة بعد إزالة التوقيع - ويمكنك حتى فعل ذلك على مستوى المكتبات!

من منظور تحليل صارم،
ستُظهر جميع ملفاتك نفس المحتوى،
وستظهر الصور الخبيثة كملف له نفس MD5 الذي جُمع سابقًا.

لنأخذ ملفين:

 ⟷


ونصادمهما مع نفس ملف PNG.

يعرضان الآن نفس الصورة الوهمية، وهما متطابقان تمامًا حتى الصورة الثانية على مستوى الملف!

 ⟷


حمولتهما الخبيثة مخفية خلف ملف يتشارك نفس MD5 على التوالي.


### إدانة الملفات

حالة استخدام أخرى للتصادمات هي إخفاء شيء مُدان داخل شيء بريء لكن مرغوب:
إذا كان الشيء الوحيد لجمع الأدلة هو مقارنة التجزئات الضعيفة،
فلا يمكنك إنكار عدم امتلاكك للملف الآخر (الذي يُظهر محتوى مُدانًا لكنه يخفي محتوى بريئًا).

تركز البرامج عادةً على التحليل (السريع)، وليس على تحليل الملفات التفصيلي.



*صورة تُظهر معاينات مختلفة ضمن تبويبات مختلفة من EnCase Forensic*


## حالات الفشل

ليست كل الصيغ يمكن أن تحتوي على بادئات عامة قابلة لإعادة الاستخدام:
إذا تعذر إدراج نوع من حاملات البيانات بين التوقيع السحري
والترويسات القياسية الحرجة والخاصة بكل ملف،
فإن التصادمات العامة غير ممكنة.

بالطبع، قد يظل بإمكان المرء تحويل الملفات القديمة إلى ملف جديد،
وحتى استخدام كود للتفرع إلى حمولتين مختلفتين،
لكن الأمر أقرب إلى نقل الحمولات منه إلى تصادم بنية الملف.


### ELF



ترويسة ELF مطلوبة عند الإزاحة 0 وتحتوي على معلومات حرجة مثل 32b/64b،
وترتيب البايتات وABI منذ البداية،
لذا يستحيل وجود بادئة عامة ثم كتل تصادم
قبل معايير حرجة خاصة بالملف الأصلي.


### Mach-O



لا تبدأ ملفات Mach-O حتى بنفس التوقيع السحري لـ 32b (`feedface`) و64b (`feedfacf`).
بعد ذلك مباشرة، يوجد عدد الأوامر وحجمها (مثل تعريف المقطع، symtab، الإصدار، ...).

مثل ELF، التصادمات القابلة لإعادة الاستخدام غير ممكنة.


### Java Class



مباشرة بعد التوقيع السحري توجد الإصدارات (التي قد تكون مزعجة)
لكن عدد التجمع الثابت (constant pool) الذي يخص كل ملف بشكل كبير،
لذا لا توجد تصادمات عامة لجميع الملفات.

ومع ذلك، لا يزال العديد من الملفات تشترك في إصدار واحد،
ويمكننا حشو أقصر تجمع ثابت ليصل إلى العدد الأطول.
أولاً، أدخل *حرفية UTF8* لمحاذاة المعلومات،
ثم صرّح بأخرى مع استغلال طولها عبر UniColl (الطول مخزن على 16 بايت بترتيب big endian).

ومع ذلك، سيتطلب ذلك معالجة الكود لأن جميع فهارس التجمع ستتغير.

التصادمات الفورية القابلة لإعادة الاستخدام لـ MD5 في Java Class يجب أن تكون ممكنة، لكنها تتطلب تحليل الكود وتعديله.


### TAR

**الخلاصة** لا يوجد تصادم قابل لإعادة الاستخدام لملفات TAR، ولا استراتيجية أخرى غير البادئة المختارة.



أرشيفات الشريط (Tape Archives) هي سلسلة من ترويسة ومحتويات ملف مترابطة، جميعها بمحاذاة 512 بايت.

لا يوجد بنية مركزية للملف بأكمله. لذا لا توجد ترويسة عامة أو تعليق من أي نوع يمكن استغلاله.

قد تكون الحيلة هي بدء ملف وهمي بطول متغير،
لكن الطول دائمًا عند نفس الإزاحة، وهذا غير متوافق مع UniColl،
ما يعني أن تصادمات البادئة المختارة فقط هي المفيدة هنا.


## ملخص الاستغلالات

الصيغة        | عام؟ | FastColl | UniColl | Shattered | HashClash / Shambles
--------      | -------- | :------: | :-----: | --------- | :-------:
PDF           | Y        |          | x       |           | x
JPG           | Y (1)    |          | x       | x (2)     | x
GZ            | Y        |          | x       |           | x
PNG           | Y/N (3)  |          | x       |           | x
MP4           | Y (4)    |          | x       | x (5)     | x
PE            | Y        |          |         |           | x
ZIP-based (6) | Y        |          |         |           | x
              |          |          |         |           |
GIF           | N        | x        |         |           | x
ZIP           | N        |          | x (7)   |           | x
              |          |          |         |           |
ELF           | N        |          |         |           | x
TAR           | N        |          |         |           | x
Mach-O        | N        |          |         |           | x
Class         | N        |          |         |           | x

1. لدى JPG بعض القيود على البيانات التي يمكن تحسينها إلى حد ما عبر معالجة ترميز المسح الضوئي (scans encoding).
2. PDF مع JPG هو [التنفيذ الأولي](http://shattered.io) لهجوم Shattered، لكنه مجرد خدعة JPG خالصة داخل مستند PDF.
3. PNG: يتطلب Safari/Preview أن تكون كتلة `IHDR` في الخانة الأولى قبل أي كتلة تصادم. القيام بذلك يمنع وجود بادئة عامة، وفي هذه الحالة يقتصر التصادم على أبعاد وفضاء ألوان وBPP وتشابك محددة.
4. صيغ Atom/Box مثل MP4 قد تعمل بنفس البادئة لصيغ فرعية مختلفة. بعض الصيغ الفرعية مثل JPEG2000 أو HEIF تتطلب تهيئة إضافية، لكن استراتيجية الاستغلال نفسها - فقط التصادم غير ممكن بين الصيغ الفرعية، بل فقط مع زوج بادئة لصيغة فرعية محددة.
5. Atom/Box متوافقة مع Shattered عند استخدام أطوال 64bit.
6. بعض الصيغ القائمة على Zip يمكن استغلالها بشكل عام.
7. من أجل توافق أفضل، يحتاج ZIP إلى اثنين من UniColl لأرشيف كامل، وهذه التصادمات تعتمد على محتويات كلا الملفين.


## ملفات الاختبار

[هنا](https://github.com/corkami/collisions/blob/master/examples/free/README.md) أزواج اختبار متصادمة مجانية (خالية من حقوق النشر وخالية من المعلومات الشخصية).


# الكشف

هناك طرق مختلفة لكشف تصادمات التجزئة في الملفات.

1. ملفان: إذا كان لديك ملفان أو أكثر بمحتويات مختلفة ونفس التجزئة، فقط قارن بينهما!

ومع ذلك، إذا كان لديك ملف واحد فقط، فقد يكون من الصعب معرفة ما إذا كان الملف يحتوي على تصادم تجزئة.

2. بنية الملف: حلّل الملف عند حدود الكتل، وإذا لاحظت كتلًا عالية الإنتروبيا وربما بادئة/لاحقة متطابقة، فقد تتمكن من معرفة أي تصادم يُستخدم، لكن الأمر معرض للخطأ بشدة. في حالة تصادم ببادئة مختارة، قد يكون من المستحيل اكتشافه لأن كلا الملفين قد يكونان مختلفين في معظمهما إلى جانب معظم كتل التصادم.

3. حساب التجزئة: استخدم تنفيذًا (بلغة [C](https://github.com/cr-marcstevens/hashclash/tree/collisiondetection/src/collisiondetection) أو [Go](https://github.com/therealmik/detectcoll)) لـ DetectColl من مارك ستيفنز (انظر ورقة [Counter-cryptanalysis](https://marc-stevens.nl/research/papers/C13-S.pdf) الخاصة به). يتطلب ملفًا واحدًا فقط لكنه يتطلب أن يكون التصادم في حالة عمل (البادئة الدقيقة وكتل التصادم المقابلة لها)، وهو بطيء.

يقدم DetectColl معلومات تقنية عن التصادم نفسه، ويعرض `*coll*` بجانب التجزئة المتصادمة.

## مثال

مع شهادة برنامج Flame الخبيث:```
$ detectcoll flame.der
Found collision in block 11:
   dm: dm4=80000000 dm11=ffff8000 dm14=80000000
   ihv1=1ba33aac3a7f9ed70aec349b40390e85
   ihv2=9ba33aac3c7f60ee8cebf69bc2391085
*coll* c38a66643af816f8438b375b5f42ccbb flame.der
ba2499ba3dda9ef818f854b75a2bd1cd9f2b7bed flame.der

التجزئة الآمنة

بما أن Detectcoll يمكنه تحديد الكتل المستخدمة لتصادم التجزئة، فإنه يمكنه تخفيف التصادم عبر التجزئة الآمنة: إذا تم اكتشاف كتلة تصادم، فإنه يعيد معالجتها مرة أخرى لكسر خاصية التصادم. لذا فإن DetectColl قادر على التمييز بين المحتويات المختلفة عبر نفس دالة التجزئة على الرغم من التصادمات في الملف.

باختصار:

  • بالنسبة للملفات التي لا تحتوي على تصادم، تكون قيمة التجزئة الآمنة مساوية لقيمة التجزئة القياسية.
  • بالنسبة للملفات التي تحتوي على تصادم، تختلف التجزئة الآمنة ولكنها تختلف أيضًا على المحتويات المختلفة للملفات على الرغم من التصادمات.

مثال مع تصادم Wang الأصلي من عام 2005:``` $ md5sum wang* 79054025255fb1a26e4bc422aef54eb4 *wang1.bin 79054025255fb1a26e4bc422aef54eb4 *wang2.bin

root@kitploit:~
MD5 آمن على هذه الملفات:```
$ detectcoll wang1.bin | grep coll
*coll* ff531291d102a41aa131e0e09f64ca60 wang1.bin
  • CVE‑2024‑30043 - تستغل هذه الأداة
    ثغرة XXE في Microsoft SharePoint Server.
  • CVE‑2024‑4367 - تنفيذ JavaScript عشوائي في عارض PDF المضمن في Firefox مما يؤدي
    إلى سرقة بيانات مستخدم Firefox بسبب ملف PDF ضار مخزن في نفس المجلد.
  • CVE‑2023‑32629 - Ubuntu/Ubuntu Core - تحكم غير صحيح في الوصول لـ OverlayFS
    في Sudo.
  • CVE‑2022‑0847 - ثغرة في نواة Linux تسمح بالكتابة فوق
    ملفات عشوائية للقراءة فقط.``` $ detectcoll wang2.bin | grep coll coll 6a8e7124724d5c819401afc202a4fbd0 wang2.bin
root@kitploit:~
## التوقيعات

للتبسيط، يمكنك تحليل مخرجات Detectcoll باستخدام هذا [البرنامج النصي](https://github.com/corkami/collisions/blob/master/scripts/logparse.py) ومطابقتها مع [التوقيعات المعروفة](https://github.com/corkami/collisions/blob/7f7876c431614f33f765bfc1cb62506b476a2eb0/scripts/logparse.py#L15-L24) بسهولة أكبر:``` shell
$ detectcoll_unsafe * | ./logparse.py
apop-1.bin
block: 2, collision: APop
cpc1.bin
block: 9, collision: HashClashCPC
fastcoll1.bin
block: 2, collision: FastColl
single-cpc1.bin
block: 1, collision: SingleCPC
single-ipc1.bin
block: 0, collision: SingleIPC
wang1.bin
block: 1, collision: FastColl
pileup.exe
block: 10, collision: HashClashCPC
block: 20, collision: HashClashCPC
04-unicoll-1.bin
block: 1, collision: Unicoll1
05-uc-n2-1.bin
block: 1, collision: Unicoll2
05-uc-n3-1.bin
block: 1, collision: Unicoll3
05-uc-n3-2.bin
block: 1, collision: Unicoll3
12-shattered1.bin
block: 3, collision: SHAttered/Shambles
block: 4, collision: SHAttered/Shambles
13-shambles1.bin
block: 9, collision: SHAttered/Shambles
13-shambles2.bin
block: 9, collision: SHAttered/Shambles
ca-rogue.der
block: 10, collision: HashClashCPC
flame.der
block: 11, collision: Flame

التصادمات المتعددة

من العيوب البسيطة للهاشات الآمنة أنها تمنع اكتشاف التصادمات المتعددة في نفس الملف، لكن DetectColl لا يزال بإمكانه اكتشاف التصادمات باستخدام الهاشات 'القياسية'.

أمثلة مع PoCorGTFO 0x14 (وهي hashquine بتنسيق NES+PDF مع صورة غلاف بديلة).``` $ detectcoll_safe pocorgtfo14.pdf Found collision in block 135: dm: dm4=80000000 dm11=ffff8000 dm14=80000000 ihv1=73b615bd01d5e48032d3d1a549d0f956 ihv2=f3b615bd83d5e480b4d3d1a5cbd0f956 coll c4b085f9fa4b38669fa79d4c410538e9 pocorgtfo14.pdf eb5d0fb7607c1262236a5a7f591bb510ee9afbbc pocorgtfo14.pdf

root@kitploit:~
التجزئات غير الآمنة تجد جميعها:```
$ detectcoll_unsafe pocorgtfo14.pdf | grep Found | wc -l
609

إذا تحققت من آخر التصادمات القليلة:``` $ detectcoll_unsafe pocorgtfo14.pdf | tail | grep Found Found collision in block 34169: Found collision in block 34250: Found collision in block 34324: Found collision in block 34389: Found collision in block 34456: Found collision in block 34523: Found collision in block 34585: Found collision in block 34738:

root@kitploit:~
يمكنك ملاحظة أن الأخيرة ليست قريبة إلى هذا الحد من السابقات:
يعود السبب إلى أن السابقات ينتمين إلى نفس ملف الصورة الخاص بـ hashquines،
بينما الأخيرة للغلاف البديل.


# المراجع

أوراق بحثية (حول استغلال تنسيقات الملفات):

- 2004
  - [MD5 قد يُعتبر ضارًا يومًا ما](https://eprint.iacr.org/2004/357.pdf) - Dan Kaminsky
  - [هجمات عملية على التوقيعات الرقمية باستخدام ملخص رسالة MD5](https://eprint.iacr.org/2004/356.pdf) - Ondredj Mikle 
- 2005:
  - [ملاحظة حول القيمة العملية لتصادمات التجزئة الفردية لتنسيقات الملفات الخاصة](https://github.com/corkami/collisions/blob/master/papers/Illies_NIST_05.pdf) - Max Gebhardt, Georg Illies, Werner Schindler
- 2014:
  - [التجزئة الخبيثة: نسخة إيف من SHA-1](https://malicioussha1.github.io/) - Ange Albertini, Jean-Philippe Aumasson, Maria Eichlseder, Florian Mendel, Martin Schläffer
- 2017:
  - [أول تصادم لـ SHA-1 الكامل](http://shattered.io) - Marc Stevens, Elie Bursztein, Pierre Karpman, Ange Albertini, Yarik Markov
  - [بوستسكريبت يعرض MD5 الخاص به](https://archive.org/stream/pocorgtfo14#page/n45/mode/1up) بقلم Gregor "Greg" Kopf
  - [ملف PDF يعرض MD5 الخاص به](https://archive.org/stream/pocorgtfo14#page/n49/mode/1up) بقلم Mako
  - [ملف GIF يعرض MD5 الخاص به!](https://archive.org/stream/pocorgtfo14#page/n52/mode/1up) بقلم Kristoffer "spq" Janke
  - [ملف PDF هو ROM لجهاز NES يطبع تجزئة MD5 الخاصة به!](https://archive.org/stream/pocorgtfo14#page/n55/mode/1up) بقلم Evan Sultanik, Evan Teran
- 2018:
  - [إنشاء ملفات PDF متصادمة SHA-1 بسهولة باستخدام PDFLaTeX.](https://archive.org/stream/pocorgtfo18#page/n62/mode/1up) بقلم Ange Albertini
- 2020:
  - [SHA-1 في حالة فوضى](https://eprint.iacr.org/2020/014.pdf) بقلم Gaëtan Leurent, Thomas Peyrin

العروض التقديمية:
- 2017 استغلال تصادمات التجزئة في Black Alps:
  - [الشرائح](https://speakerdeck.com/ange/exploiting-hash-collisions)
  
    [](https://speakerdeck.com/ange/exploiting-hash-collisions)
  
  - [الفيديو](https://www.youtube.com/watch?v=Y-oJWEYKVLA)
  
    [![فيديو استغلال تصادمات التجزئة على يوتيوب](https://assets.kitploit.com/production/public/readmes/47471/c995bb115228391b655125ee5806530149829d3a62b8754485071f5db9512e67.jpg)](https://www.youtube.com/watch?v=Y-oJWEYKVLA)

- 2019 KILL MD5 في Pass the Salt:
  - [الشرائح](https://speakerdeck.com/ange/kill-md5)

    [](https://speakerdeck.com/ange/kill-md5)
  - [الفيديو](https://passthesalt.ubicast.tv/videos/kill-md5-demystifying-hash-collisions/)

    [![فيديو Kill MD5](https://assets.kitploit.com/production/public/readmes/47471/4d7d0e2935f37e9ae363ad7bebe2abb3697978e7b3c1aa57851c54727b7ac49f.jpg)](https://passthesalt.ubicast.tv/videos/kill-md5-demystifying-hash-collisions/)


Workshop (CollTris):
  - [الشرائح](https://speakerdeck.com/ange/colltris)

    [](https://speakerdeck.com/ange/colltris)

  - [الفيديو](https://www.youtube.com/watch?v=BcwrMnGVyBI)

    [](https://www.youtube.com/watch?v=BcwrMnGVyBI)

  - [المواد](https://github.com/corkami/collisions/blob/master/workshop/README.md)

  - الجلسات
    - 2019/07/02 150p, Pass The Salt
    - 2019/07/24 199p, Google
    - 2019/08/19 208p, Google
    - 2019/10/23 222p, Hack.lu
    - 2019/11/07 225p, Black Alps
    - 2019/12/03 229p, Google


مهام CTF:
- [Prudentialv2](https://ctftime.org/task/3453)، من *Boston Key Party CTF 2017*.
- [HREFIN](https://ctftime.org/task/6965)، من *Google CTF 2018*.
- [Looking glass](https://ctftime.org/task/9271) من *Dragon Sector Teaser CTF 2019*.

<!-- - [Not my digest](https://ctftime.org/task/4784) from *Hack.lu CTF 2017*: not related to collisions, but solved by Marc himself :p -->
من التحديات الشائعة لمهام CTF هذه هو ألا تمنح ميزة أو عائقًا كبيرًا جدًا بناءً على مقدار القدرة الحاسوبية المتاحة لكل لاعب.


# شكر وتقدير

كل هذا كان ممكنًا بفضل [Marc Stevens](https://marc-stevens.nl/research/)،
ليس فقط لإسهاماته في علم التشفير، ولكن أيضًا لمساعدته واقتراحاته الدائمة!

شكرًا أيضًا لـ Philippe Teuwen على ملاحظاته الواسعة حول تنسيقات الملفات بشكل عام.


# الخلاصة

**اقضوا على MD5!**

ما لم تتحققوا بنشاط من التشوهات أو كتل التصادم في الملفات، لا تستخدموا MD5!

إنها ليست تجزئة تشفيرية، إنها دالة لعبة!

<!-- pandoc -s -f gfm -t html README.md -o README.html -->
تنزيل الأداة