تحدثت من قبل عن أن نظام الأندرويد يتبع نظام معين في عملية التوثيق (Signing) للتطبيقات وذلك يحدث من خلال Cert يستخدمها المطور لتوثيق التطبيق الخاص به. مقال اليوم مرتبط ارتباط مباشر بعملية التوثيق.

اسم الثغرة: MasterKey

الإصدارات المصابة: Android 1.6 : 4.3

تاريخ النشر: يوليو، 2013

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

قبل أن أبدأ في شرح كيف تعمل الثغرة، سأقوم بتوضيح كيف تعمل عملية التوثيق في نظام الأندرويد، يتطلب أن نظام الأندرويد أن تكون كل التطبيقات موثقة بوثيقة والـPrivate Key الخاص بها لا يمتلكه أحد سوى المطور نفسه. عملية التوثيق هدفها شيئان، الأول وهو أن يتم التأكد من هوية المطور، الثاني وهو أن يتم التأكد من أن هذا التطبيق لم يتم التلاعب به من طرف ثالث.

النقطة الأهم هي أن نظام الأندوريد لن يقوم بتثبيت أي تطبيقات إلا لو كانت موثقة.

دعنا الآن نقوم بأخذ مثال عملي، سأقوم أولاً بتثبيت تطبيق عادي جدًا وفي هذه الحالة سيكون تطبيق اسمه Torch وهي يعمل كـFlashLight. سأستخدم الـADB من أجل تثبيت التطبيق على المحاكي:

01

02

حسنٌ، كما نرى فلا مشكلة واجهتنا في تثبيت التطبيق، دعنا الآن نقوم بفك ضغط ملف الـAPK الخاص بالتطبيق لنرى محتواه:

03

كما نرى في الصورة السابقة يوجد مجلد اسمه META-INF، هذا المجلد هو المسؤول عن عملية توثيق التطبيق فهو يحتوي على Checksum موثقة لكل الملفات الموجودة داخل ملف الـAPK.

04

ملف MANIFEST.MF يحتوي على أسماء كل الملفات الموجودة داخل ملف الـAPK بالإضافة إلى الـDigest-Value الخاصة بها.

05

إن تم تغيير أي كود أو ملف داخل ملف الـAPK فنظام الأندرويد سيمنع تثبيت هذا التطبيق وذلك لحماية المستخدم من أي نشاطات خبيثة.

يقوم نظام الأندرويد بفك ضغط كل ملف من الملفات الموجودة داخل ملف الـAPK وذلك باستخدام ما يسمى بـJava Unzipping Library ثم بعد ذلك ستقوم بالتحقيق من الـChecksum الخاص بكل ملف لترى إن كان مطابق للـDigest الموجود داخل ملف MANIFEST.MF

دعنا الآن نقوم بالتعديل على التطبيق وبعد ذلك محاولة تثبيته لنرى النتيجة.

سأقوم بتعديل الـic_Launcher وبعد ذلك أقوم بضغط ملفات التطبيق مجددًا ومحاولة تثبيتها:

06

كما نرى فإن عملية تثبيت التطبيق فشلت والسبب هو Install Parse Failed No Certificates. هذا يعني أن عندما قام نظام الأندرويد بفك ضغط ملف الـAPK ومقارنة الـChecksum الخاص بكل ملف مع قيمة الـDigest داخل ملف MANIFEST.MF لم تنجح عملية التحقق.

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

فكرة الثغرة هي أننا نقوم بوضع ملفين بنفس الاسم داخل الـAPK وكما قلنا أن الـAPK ما هو إلا ZIP. كيف يمكننا إضافة ملفين بنفس الاسم داخل ملف الـAPK أو الـZIP. الشيء الجدير بالذكر هنا والذي سنعتمد عليه هو أن صيغة الـZIP نفسها لا ترفض وجود ملفين بنفس الاسم، بينما برامج الضغط مثل winzip وwinrar عادة هي التي ترفض ذلك.

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

07

كما نرى في الصورة السابقة يوجد لدينا مجلدين، مجلد Torch وهو ناتج فك ضغط ملف الـAPK الخاص بالتطبيق. ومجلد res وهو نفس مجلد res الخاص بتطبيق Torch، كل ما قمت به أنني أخذت نسخه منه ووضعتها هنا.

08

09

كما نرى هو نفس المجلد بالضبط بنفس محتوياته، ما نحتاج للتعديل عليه هو مجلد res وهذا يعتمد على التعديل الذي أريده، فأنا أريد أن أقوم بالتعديل مثلاً الأيقون ic_launcher، سأقوم بحذف ملف ic_launcher.png من داخل كلاً من المجلدات التالية:

10

طبعًا المطورون سيكون لديهم علم بهذه الخطوة فكل مجلد من المجلدات السابقة خاص بأحجام شاشات مختلفة ليكون مناسب لمعظم المقاسات، لكن هذا ليس مهمًا الآن بالنسبة لنا، فكل ما قمت بفعله هو أنني قمت بحذف ملف الـic_launcher من كل هذه المجلدات وبعدها وضعت ملف ic_launcher خاص بي وهو في هذا المثال أيقون خاص بشعار آي سيكيورتي كما هو موضح في الصورة التالية:

11

سأقوم بالطبع بتكرار الخطوة داخل كل المجلدات التي ذكرتها سابقًا، بهذا نكون جاهزين لصنع الملف المضغوط الخاص بالتطبيق بعد التعديل 🙂

12

تأكد من اختيارك لامتداد ZIP وليس RAR. ثم بعد ذلك نأتي لأهم خطوة وهي التي تحدد نجاح هذه الخدعة وهي أن نقوم بعمل Append لمحتويات المجلد الأصلي الخاص بتطبيق Torch كجزء من الملف المضغوط كما هو موضح في الصورة التالية:

13

الملف الناتج سيكون هو الملف المضغوط الذي نريده وسيكون بامتداد ZIP.

14

سنقوم بتغيير الامتداد لـAPK بشكل عادي جدًا.

15

بهذا نكون انتهينا، لاحظ أننا إن قمنا بالاطلاع على محتويات الملف المضغوط سنرى أنه يوجد نسختين من كل محتويات مجلد res:

16

ما قمنا بتغييره هو ic_launcher لذلك نجد أن النسختين ليستا متطابقتين فحجمهمها مختلف 🙂

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

دعنا الآن نقوم بتجربة تثبيت هذا التطبيق:

17

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

بالطبع يمكننا تغيير أي جزء من التطبيق أو صنع كود جديد للتطبيق واتباع نفس الطريقة في حقنه في التطبيق لكني اتبعت مثال بسيط في هذا المقال وهو تغيير الأيقون 🙂

إذن، كيف حدث ذلك، أنت حتى الآن لم تخبرني كيف نجحت هذه الخدعة!؟

الخدعة هي أننا قمنا باستغلال طريقة نظام الأندرويد في التحقق من التطبيق وتثبيته بعد ذلك، فما حدث كالتالي، كما نعلم هناك ملفين يملكان نفس الاسم وهما كالتالي:

18

لاحظ أن هناك اختلاف في الـTimeStamp فهناك ملف بتوقيت قديم وملف أخر بتوقيت جديد، الفكرة هنا أن نظام الأندرويد يقوم بالتحقق من الملف القديم وهو الملف الأصلي، وبعد ذلك يقوم بتثبيت الملف الجديد وهو الملف الخاص بنا ^_^ وبهذا ننجح في التعديل على التطبيق 🙂

خطورة الثغرة:

الثغرة ليس لها حدود صراحة، فيمكن لمختبر الاختراق أن يقوم بالتعديل على أي جزء من التطبيق كما يريد. فيمكنه التجسس على الهاتف، الاتصال بأرقام بدون علم صاحب الهاتف، أي شيء يفكر فيه الهاكر قادر على فعله 🙂

نصائح لمواجهة االثغرة:

  1. قم بتثبيت التطبيقات من الـGoogle Play Store فقط.
  2. تأكد من ناشر التطبيق.
  3. قم بترقية إصدار الأندرويد الذي تملكه إن كنت تملك إصدار مصاب.
  4. قم بتحميل تطبيق BlueBox Security Scanner للتحقق من إن كانت أي تطبيقات لديك تستغل هذه الثغرة، أو إن كان إصدار الأندرويد الذي تستخدمه مصاب.