
مستند فني وكود استغلال لـ CVE-2019-11932، وهي ثغرة من نوع double-free في تطبيق WhatsApp لنظام Android تؤدي إلى تنفيذ تعليمات برمجية عن بُعد عبر ملف GIF معدل.
سأشارككم عن ثغرة تحرير مزدوج (double-free) اكتشفتها في واتساب لأندرويد، وكيف حولتها إلى استغلال لتنفيذ تعليمات برمجية عن بُعد (RCE). أبلغت فيسبوك بهذا الأمر. اعترفت فيسبوك بالثغرة وأصلحتها رسميًا في إصدار واتساب 2.19.244. ساعدت فيسبوك في حجز CVE-2019-11932 لهذه المشكلة.
مستخدمو واتساب، يرجى التحديث إلى أحدث إصدار من واتساب (2.19.244 أو أعلى) للحفاظ على سلامتكم من هذه الثغرة.
الخطوات كالتالي:
قد تكون إحدى هذه القنوات هي إرسال المستند عبر واتساب (أي الضغط على زر مشبك الورق واختيار مستند لإرسال ملف GIF المخترق) إذا كان المهاجم في قائمة جهات اتصال المستخدم (أي صديق)، يتم تنزيل ملف GIF المخترق تلقائيًا دون أي تفاعل من المستخدم.
لاحظ أن المستخدم لا يحتاج إلى إرسال أي شيء، فمجرد فتح معرض واتساب يؤدي إلى تفعيل الثغرة. لا حاجة إلى لمس إضافي بعد الضغط على معرض واتساب.
عندما يفتح مستخدم واتساب عرض المعرض في واتساب لإرسال ملف وسائط، يقوم واتساب بتحليله باستخدام مكتبة محلية تسمى libpl_droidsonroids_gif.so لإنشاء معاينة لملف GIF. مكتبة libpl_droidsonroids_gif.so هي مكتبة مفتوحة المصدر مع كود المصدر متاح على https://github.com/koral–/android-gif-drawable/tree/dev/android-gif-drawable/src/main/c.
يحتوي ملف GIF على إطارات متعددة مشفرة. لتخزين الإطارات المفكوكة، يتم استخدام مخزن مؤقت باسم rasterBits. إذا كانت جميع الإطارات لها نفس الحجم، يتم إعادة استخدام rasterBits لتخزين الإطارات المفكوكة دون إعادة تخصيص. ومع ذلك، سيتم إعادة تخصيص rasterBits إذا تم استيفاء أحد الشروط الثلاثة التالية:
إعادة التخصيص هي مزيج من free و malloc. إذا كان حجم إعادة التخصيص هو 0، فإنه مجرد free. لنفترض أن لدينا ملف GIF يحتوي على 3 إطارات بأحجام 100 و 0 و 0.
يؤدي هذا إلى ثغرة تحرير مزدوج. يمكن العثور على موقع التفعيل في ملف decoding.c:
int_fast32_t widthOverflow = gifFilePtr->Image.Width - info->originalWidth; int_fast32_t heightOverflow = gifFilePtr->Image.Height - info->originalHeight; const uint_fast32_t newRasterSize = gifFilePtr->Image.Width * gifFilePtr->Image.Height; if (newRasterSize > info->rasterSize || widthOverflow > 0 || heightOverflow > 0) { void *tmpRasterBits = reallocarray(info->rasterBits, newRasterSize, <<-- التحرير المزدوج هنا sizeof(GifPixelType)); if (tmpRasterBits == NULL) { gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM; break; } info->rasterBits = tmpRasterBits; info->rasterSize = newRasterSize; }
كيف تتحول ثغرة التحرير المزدوج في واتساب إلى تنفيذ تعليمات برمجية عن بعد (RCE) 14 دقيقة قراءة على هذه الصفحة عرض توضيحي (DEMO) ثغرة التحرير المزدوج في DDGifSlurp في decoding.c في مكتبة libpl_droidsonroids_gif التحكم في سجل PC (Program Counter) التعامل مع ASLR و W^X وضع كل شيء معًا الإصدارات المتأثرة ناقلات الهجوم في منشور المدونة هذا، سأشارككم عن ثغرة تحرير مزدوج (double-free) اكتشفتها في واتساب لأندرويد، وكيف حولتها إلى استغلال لتنفيذ تعليمات برمجية عن بُعد (RCE). أبلغت فيسبوك بهذا الأمر. اعترفت فيسبوك بالثغرة وأصلحتها رسميًا في إصدار واتساب 2.19.244. ساعدت فيسبوك في حجز CVE-2019-11932 لهذه المشكلة.
مستخدمو واتساب، يرجى التحديث إلى أحدث إصدار من واتساب (2.19.244 أو أعلى) للحفاظ على سلامتكم من هذه الثغرة.
عرض توضيحي (Demo) https://drive.google.com/file/d/1T-v5XG8yQuiPojeMpOAG6UGr2TYpocIj/view
رابط Google Drive للتحميل إذا كان الرابط أعلاه غير متاح https://drive.google.com/open?id=1X9nBlf5oj5ef2UoYGOfusjxAiow8nKEK
الخطوات كالتالي:
0:16 يرسل المهاجم ملف GIF إلى المستخدم عبر أي قناة قد تكون إحدى هذه القنوات هي إرسال المستند عبر واتساب (أي الضغط على زر مشبك الورق واختيار مستند لإرسال ملف GIF المخترق) إذا كان المهاجم في قائمة جهات اتصال المستخدم (أي صديق)، يتم تنزيل ملف GIF المخترق تلقائيًا دون أي تفاعل من المستخدم. 0:24 يريد المستخدم إرسال ملف وسائط إلى أي من أصدقائه على واتساب. لذلك يضغط على زر مشبك الورق ويفتح معرض واتساب لاختيار ملف وسائط لإرساله إلى صديقه. لاحظ أن المستخدم لا يحتاج إلى إرسال أي شيء، فمجرد فتح معرض واتساب يؤدي إلى تفعيل الثغرة. لا حاجة إلى لمس إضافي بعد الضغط على معرض واتساب. 0:30 بما أن واتساب يعرض معاينات لكل وسائط (بما في ذلك ملف GIF المستلم)، فإنه سيفعل ثغرة التحرير المزدوج واستغلالنا لـ RCE. ثغرة التحرير المزدوج في DDGifSlurp في decoding.c في مكتبة libpl_droidsonroids_gif عندما يفتح مستخدم واتساب عرض المعرض في واتساب لإرسال ملف وسائط، يقوم واتساب بتحليله باستخدام مكتبة محلية تسمى libpl_droidsonroids_gif.so لإنشاء معاينة لملف GIF. مكتبة libpl_droidsonroids_gif.so هي مكتبة مفتوحة المصدر مع كود المصدر متاح على https://github.com/koral–/android-gif-drawable/tree/dev/android-gif-drawable/src/main/c.
يحتوي ملف GIF على إطارات متعددة مشفرة. لتخزين الإطارات المفكوكة، يتم استخدام مخزن مؤقت باسم rasterBits. إذا كانت جميع الإطارات لها نفس الحجم، يتم إعادة استخدام rasterBits لتخزين الإطارات المفكوكة دون إعادة تخصيص. ومع ذلك، سيتم إعادة تخصيص rasterBits إذا تم استيفاء أحد الشروط الثلاثة التالية:
width * height > originalWidth * originalHeight width - originalWidth > 0 height - originalHeight > 0 إعادة التخصيص هي مزيج من free و malloc. إذا كان حجم إعادة التخصيص هو 0، فإنه مجرد free. لنفترض أن لدينا ملف GIF يحتوي على 3 إطارات بأحجام 100 و 0 و 0.
بعد إعادة التخصيص الأولى، لدينا مخزن info->rasterBits بحجم 100. في إعادة التخصيص الثانية بقيمة 0، يتم تحرير مخزن info->rasterBits. في إعادة التخصيص الثالثة بقيمة 0، يتم تحرير info->rasterBits مرة أخرى. يؤدي هذا إلى ثغرة تحرير مزدوج. يمكن العثور على موقع التفعيل في ملف decoding.c:
int_fast32_t widthOverflow = gifFilePtr->Image.Width - info->originalWidth; int_fast32_t heightOverflow = gifFilePtr->Image.Height - info->originalHeight; const uint_fast32_t newRasterSize = gifFilePtr->Image.Width * gifFilePtr->Image.Height; if (newRasterSize > info->rasterSize || widthOverflow > 0 || heightOverflow > 0) { void *tmpRasterBits = reallocarray(info->rasterBits, newRasterSize, <<-- التحرير المزدوج هنا sizeof(GifPixelType)); if (tmpRasterBits == NULL) { gifFilePtr->Error = D_GIF_ERR_NOT_ENOUGH_MEM; break; } info->rasterBits = tmpRasterBits; info->rasterSize = newRasterSize; } في نظام أندرويد، يؤدي التحرير المزدوج للذاكرة بحجم N إلى إرجاع نفس العنوان لعمليتي تخصيص ذاكرة لاحقتين من الحجم N.
(lldb) expr int $foo = (int) malloc(112) (lldb) p/x $foo (int) $14 = 0xd379b250
(lldb) p (int)free($foo) (int) $15 = 0
(lldb) p (int)free($foo) (int) $16 = 0
(lldb) p/x (int)malloc(12) (int) $17 = 0xd200c350
(lldb) p/x (int)malloc(96) (int) $18 = 0xe272afc0
(lldb) p/x (int)malloc(180) (int) $19 = 0xd37c30c0
(lldb) p/x (int)malloc(112) (int) $20 = 0xd379b250
(lldb) p/x (int)malloc(112) (int) $21 = 0xd379b250
كيف تتحول ثغرة التحرير المزدوج في واتساب إلى تنفيذ تعليمات برمجية عن بعد (RCE) 14 دقيقة قراءة على هذه الصفحة عرض توضيحي (DEMO) ثغرة التحرير المزدوج في DDGifSlurp في decoding.c في مكتبة libpl_droidsonroids_gif التحكم في سجل PC (Program Counter) التعامل مع ASLR و W^X وضع كل شيء معًا الإصدارات المتأثرة ناقلات الهجوم في منشور المدونة هذا، سأشارككم عن ثغرة تحرير مزدوج (double-free) اكتشفتها في واتساب لأندرويد، وكيف حولتها إلى استغلال لتنفيذ تعليمات برمجية عن بُعد (RCE). أبلغت فيسبوك بهذا الأمر. اعترفت فيسبوك بالثغرة وأصلحتها رسميًا في إصدار واتساب 2.19.244. ساعدت فيسبوك في حجز CVE-2019-11932 لهذه المشكلة.
مستخدمو واتساب، يرجى التحديث إلى أحدث إصدار من واتساب (2.19.244 أو أعلى) للحفاظ على سلامتكم من هذه الثغرة.