
CVE-2026-0091، استغل ثغرة في إدارة النوافذ في أندرويد لتنفيذ كود عشوائي في عملية Launcher من adb
تم إصلاح هذه المشكلة لنظام Android 14+ في نشرة أمان Android لشهر يونيو 2026. اضغط هنا لرؤية التصحيح
TODO
سأكمل الشرح عندما أحصل على القليل من وقت الفراغ
ولكن قبل ذلك، يجب أن أحارب الأعمال المدرسية والامتحانات
قررت إكمال القسم قبل انتهاء الامتحانات
حظاً موفقاً لي 😇
IApplicationThread هو رد اتصال خاص يُقدم من التطبيقات للنظام، بحيث يمكن للنظام استخدامه لإرسال الأوامر (تحميل تطبيق معين، إخطار بتغييرات دورة حياة المكون، إلخ) إلى التطبيق
من المفترض أن يكون قابلاً للاستخدام فقط من قبل النظام، لذلك لا توجد فحوصات أذونات، ويتم ضمان الأمان فقط من خلال حقيقة أن الكائن لا يتم الحصول عليه بواسطة عملية ضارة. هذا يشبه إلى حد ما مفهوم "الكوكيز" أو "الرموز" في الويب. يسمى نموذج التحكم في الوصول هذا الأمان القائم على الإمكانيات
إذا تمكن شخص آخر من الحصول على IApplicationThread من عمليات أخرى، فيمكنه إرسال أوامر عشوائية وسيقوم التطبيق الضحية بمعالجتها كما لو كانت صادرة عن النظام. في استغلال سابق لـ CVE-2022-20452 تم استخدام الحيلة لتنفيذ تعليمات برمجية عشوائية
بينما يجب تمرير IApplicationThread فقط إلى عملية النظام، يمكن إرساله بشكل غير متوقع خارج system_server
لن يقوم أحد بتنفيذ واجهة برمجة تطبيقات getIApplicationThreadForApp(String packageName) معروضة لأي شخص، فهذا انتهاك أمني واضح
ولكن إذا تم تغليف IApplicationThread داخل كائن آخر وتم إرسال كائن الغلاف الخارجي، فهذا سيناريو أكثر احتمالية
RemoteTransition هو مثل هذا الغلاف الذي يحتوي على IApplicationThread من أجل رفع أولوية التطبيق الذي يقوم بتشغيل رسم متحرك
أحد مستخدمي هذه الواجهة هو Launcher3، تطبيق الشاشة الرئيسية الافتراضي على AOSP وأجهزة Pixel، والذي ينشئ ActivityOptions باستخدام RemoteTransition ثم يمرره إلى startActivity()
بينما لا يعرض Launcher3 نفسه الكائن لعوامل غير موثوقة، فإن system_server يفعل ذلك أحيانًا
حدث CVE-2022-20419 لأن system_server أعاد توجيه ActivityOptions التي مررها المتصل إلى التطبيق الذي تم إطلاقه لكنه نسي إزالة RemoteTransition، مما سمح للتطبيق الذي تم إطلاقه باستلامه وتحميل تعليمات برمجية عشوائية داخل عملية المشغل
أثناء الرسوم المتحركة لانتقال العناصر المشتركة، يجب القيام بالكثير من العمل ويجب أن تحدث اتصالات بين WMCore وWMShell، حيث يعني WM مدير النوافذ
يمكنك قراءة هذه المقالة لفهم WMShell
نظرًا لأن WMCore وWMShell يعملان في عمليات مختلفة (WMCore يعمل في system_server وWMShell يعمل في SystemUI)، فإنهما يستخدمان آلية Binder للتواصل مع بعضهما البعض
كشف WMCore عن واجهة برمجة تطبيقات Binder registerTransitionPlayer ويستخدمها WMShell لتسجيل Binder الخاص به
عند بدء الرسم المتحرك، يستدعي WMCore requestStartTransition ويتم تمرير TransitionRequestInfo إلى البعيد، والذي يتضمن RemoteTransition الأولي
لذا إذا تمكنا من استبدال مشغل الانتقال، سنتمكن من استرداد IApplicationThread الخاص بـ Launcher وتحقيق تنفيذ تعليمات برمجية عشوائية داخل عملية متميزة
ومع ذلك، فإن registerTransitionPlayer محمي بإذن MANAGE_ACTIVITY_TASKS الذي لا يمكن لتطبيق طرف ثالث الحصول عليه
ولكن يمكن لـ adb shell أيضًا تشغيل كود مستخدم غير موثوق، ويتم منح shell إذن MANAGE_ACTIVITY_TASKS، لذا لحسن الحظ يمكننا شن هجوم من adb shell
إنه سؤال مضحك حول ما يمكن للمهاجمين فعله من خلال هذه الثغرة
نظرًا لأن معظم الأذونات الممنوحة لـ Launcher يمتلكها أيضًا adb shell، فإن المهاجمين الذين يمكنهم بالفعل تنفيذ تعليمات برمجية تحت هوية shell لا يحتاجون إلى استغلال هذه الثغرة لاختراق الجهاز
هذا更像 مثال تعليمي لتعلم IApplicationThread بدلاً من استغلال يمكن استخدامه بواسطة تطبيق ضار
ومع ذلك، قد يظل شخص ما مهتمًا بهذا
على سبيل المثال، يمكن استخدام هذا لاستخراج الملفات الخاصة لـ Launcher، والتي يمكن أن تكون مفيدة في التحليل الجنائي لتطبيقات Launcher الضارة دون تجذير الجهاز. سابقًا تم تحقيق ذلك عن طريق استغلال CVE-2024-31317، ويكشف اكتشافي طريقة أخرى بعد إصلاح الطريقة السابقة
يسمح هذا أيضًا للمستخدمين باستخدام تراكب موارد وقت التشغيل المُصنّع (FRRO) دون تجذير أجهزتهم أولاً، لذا تعود السمات المخصصة بدون جذر بعد إصلاح CVE-2021-39630. أثبت استغلالي ذلك عن طريق تعيين android:integer/config_multiuserMaximumUsers إلى 100
بالإضافة إلى ذلك، يستضيف Launcher أيضًا مكون شاشة الأخيرة بشكل افتراضي وبالتالي فهو مدرج في القائمة البيضاء لبعض الإجراءات المميزة. أعتقد أن Launcher مسموح له ببدء أي نشاط في مهمة موجودة بغض النظر عن إعدادات التصدير/الأذونات للأنشطة التي تم إطلاقها والتي قد تكون مرغوبة من قبل بعض تطبيقات أدوات إدارة الأجهزة، على الرغم من أنني لم أختبرها بنفسي
قم ببناء المشروع، وقم بتثبيت ملف apk المُنشأ (إذا كنت تستخدم زر التشغيل داخل Android Studio، فقم بتشغيل "Always install with package manager")
قم بتشغيل الأمر التالي على الكمبيوتر
adb shell app_process '-Djava.class.path=$(pm path top.canyie.transitionplayer | cut -c9-) /system/bin top.canyie.transitionplayer.Main'
ثم قم بتشغيل أي تطبيق عن طريق النقر على أيقونته من المشغل
يجب إرسال إشعار من تطبيق المشغل، وإذا كنت على Android 14+، فسيتم حقن تراكب مصنّع في النظام، لذا يجب أن يعيد adb shell cmd overlay lookup android android:integer/config_multiuserMaximumUsers القيمة 100