
إثبات مفهوم لاستغلال يوضح CVE-2020-25265 و CVE-2020-25266، باستخدام ملف MP3 معد لتحقيق تنفيذ تعليمات برمجية عشوائية عبر libappimage و appimaged، متجاوزًا تطبيقات النظام.
هذا هو إثبات مفهوم (PoC) لاستغلال ثغرات libappimage و appimaged.
باستخدام مزيج من الثغرتين، يمكن للمرء إنشاء ملف لا يبدو كصورة AppImage، ومع ذلك يتم التقاطه ضمنيًا بواسطة appimaged وتثبيته، متجاوزًا الإصدار المثبت نظاميًا من نفس التطبيق.
في هذه الحالة، تم استخدام ملف MP3 كحمولة، وكان Nautilus هو التطبيق الذي تم تجاوزه.
يؤثر هذا على جميع إصدارات appimaged وجميع إصدارات libappimage الأقدم من 1.0.3.
لا يحتوي ترميز MP3 على رأس ملف، وبالتالي يجب على برامج الوسائط المسح عبر الملف بحثًا عن رأس إطار. هذا يعني أنه يمكننا وضع رؤوس ELF و AppImage من النوع 2 في مقدمة الملف، وسيظل MP3 قابلاً للتشغيل. هذا يجعل MP3 هدفًا رئيسيًا لاستخدامه في إثبات المفهوم هذا.
يتم تعديل ملف MP3 لاحتواء حمولة ثنائية بعد الوسائط المشغلة، مع استخدام سكريبت Dart لوضع بيانات MP3 بين الملف التنفيذي للحمولة ورأس ELF. (لاحظ أنني لم أعدّل مواقع الرموز في جدول الرموز، لأن ذلك كان سيستغرق جهدًا أكبر ولم يكن ضروريًا لإثبات المفهوم هذا.) الحمولة الثنائية أقل من 1 ميجابايت، وبالتالي لا تسبب زيادة ملحوظة في حجم الملف. في نهاية الملف، يتم إلحاق نظام ملفات squashfs، يحتوي على ملف سطح المكتب المزيف لـ Nautilus والأيقونة.
لاحظ أنه على الرغم من أن إضافة MP3 إلى نهاية squashfs كانت ستعمل تقنيًا، إلا أن لديها فرصة أعلى لإرباك مشغلات الوسائط بسبب ظهورها متأخرًا جدًا في الملف، بينما بعد رأس ELF مباشرة هي بضعة عشرات من البايتات فقط داخل الملف.
يقوم appimaded بمسح جميع الملفات في جميع الدلائل المتعقبة، بغض النظر عن امتداد الملف. عندما يلتقط MP3، يكتشف رؤوس ELF و AppImage، ويشرع في استخراج ملف سطح المكتب الموجود بداخله.
يتم الآن كتابة ملف سطح المكتب المارق ويشير إلى MP3 الخبيث. عندما يقوم المستخدم بعد ذلك بتشغيل "الملفات" (Files)، سيبدأ تشغيل الملف التنفيذي ELF المضمن في MP3 بدلاً من التثبيت النظامي.
عادةً، سيتم تسمية ملف سطح المكتب باسم "appimagekit_...desktop"، وبالتالي لن يكون قادرًا على تجاوز أي تطبيقات نظامية بالكامل. ومع ذلك، فإن Integrator.cpp في libappimage يلتقط حقل الاسم بدون التحقق أو الهروب، وبالتالي يمكننا إضافة هذا إلى ملف سطح المكتب المارق:
Name=/../org.gnome.Nautilus
Name[en]=Files
وسيتم كتابة الملف إلى ~/.local/share/applications/org.gnome.Nautilus.desktop، مما يؤدي إلى إخفاء Nautilus المثبت نظاميًا.
تأكد من أن إصدار libappimage المثبت لديك هو على الأقل 1.0.3، الذي يصلح التحقق من حقل Name.
من الجدير بالذكر أن هذا لا يشمل libappimage الخاص بدبيان في الوقت الحالي، وهو قديم جدًا.
جميع إصدارات appimaged معرضة للخطر، وتم إهمال المشروع.
go-appimage يتجنب مشكلة اسم الملف عن طريق التقاط صور appimage المسماة
*.AppImage فقط. AppImageLauncher يتجنب مشكلة اسم الملف عن طريق
طلب الإذن من المستخدم للتثبيت قبل تنفيذ التثبيت.
ضع ملفًا صوتيًا عشوائيًا في audio.mp3 وقم بتشغيل dart bin/write_mp3.dart لبناء الحمولة وكتابة
ملف MP3 المعدل. تحتاج إلى تثبيت Dart SDK و FreePascal لكي يعمل هذا.
تم استخدام Pascal للثنائي لأنه أنتج أصغر الملفات التنفيذية المرتبطة بشكل ثابت من بين اللغات الأخرى التي تم اختبارها (C مرتبطة بشكل ثابت باستخدام musl، Go) عند استخدام وظائف العمليات الفرعية.
أثناء الاختبار، تم استخدام world.execute(me) كملف صوتي، لأنه بدا مناسبًا.