
إثبات المفهوم لـ CVE-2020-0113 و CVE-2020-0108
إثبات المفهوم (PoC) لـ CVE-2020-0113 & CVE-2020-0108
في تصحيح AOSP الصادر في 2020-08، تم الكشف عن ثغرة في AMS بطبقة إطار العمل، برقم CVE-2020-0108 وتقييم عالٍ، وثغرة أخرى برقم CVE-2020-0313 وتقييم متوسط. وهي ثغرة منطقية في معالجة AMS للخدمات الأمامية؛ إذ يمكن للمهاجم الذي نجح في استغلالها تجاوز عرض إشعار الخدمة الأمامية ومواصلة التشغيل في الخلفية. يتطلب الهجوم أن يُطلق من تطبيق محلي ضار، دون أي تفاعل من المستخدم. وإذا منح المستخدم التطبيق أذونات أخرى، فقد يتسبب ذلك في أضرار أكبر، مثل التتبع المستمر للموقع أو التسجيل الصوتي الصامت، وما إلى ذلك.
خدمة الواجهة الأمامية مفهوم قدمته Google في Android 8.0. ونظرًا لأن Android 8.0 لا يسمح للتطبيقات في الخلفية بتشغيل الخدمات الخلفية، تم تصميم مفهوم خدمة الواجهة الأمامية. تتميز خدمة الواجهة الأمامية بأولوية أعلى ويمكنها العمل في الخلفية لفترات طويلة، إلا أنه يجب ربطها بإشعار خلال 5 ثوانٍ من بدء التشغيل، وإلا سيتم إنهاؤها. في الواقع، لا تزال خدمة الواجهة الأمامية تعمل في "الخلفية"، ولكن نظرًا لربطها بإشعار مرئي للمستخدم، أطلقت عليها Google اسم "خدمة الواجهة الأمامية".
في طريقة onNotificationError ضمن NotificationManagerService، لم يتم التعامل بشكل صحيح مع الحالات الاستثنائية الناتجة عن عرض الإشعارات. ونظرًا لأن هذه الطريقة تكتفي باستدعاء cancelNotification لإلغاء الإشعار دون إنهاء الخدمة أو إنهاء التطبيق بالكامل، تستمر خدمة الواجهة الأمامية في العمل دون عرض إشعار.
cancelNotification(callingUid, callingPid, pkg, tag, id, 0, 0, false, userId,REASON_ERROR, null);}
عند إنشاء كائن RemoteViews، تم تحديد Layout ID بالقيمة -1، وهي قيمة غير صالحة بشكل واضح، وبهذا يمكن تشغيل استدعاء onNotificationError.
RemoteViews remoteViews = new RemoteViews(getPackageName(), -1);
في طريقة postNotification في ServiceRecord.java، لا يتم التعامل مع الأخطاء الناتجة عن عرض الإشعارات بشكل صحيح، بل يتم إلقاء الاستثناء إلى برنامج المستخدم.
ams.crashApplication(appUid, appPid, localPackageName, -1,
"Bad notification for startForeground: " + e);
تم استخدام معرّف قناة (Channel ID) غير صالح مباشرةً لبناء الإشعار
Notification notification = new NotificationCompat.Builder(this, "InvalidInvalidInvalid")
بالإضافة إلى ذلك، تحتاج كلتا الخدمتين إلى التقاط استثناءات الخيط الرئيسي حتى لا ينهار التطبيق.
محاكي Genymotion، Android 8.0، تصحيح بتاريخ 5 سبتمبر 2017
استخدام MediaRecord لتسجيل الصوت لمدة 10 ثوانٍ
يتم الحصول عليه باستخدام LocationManager
تعرض خدمة الواجهة الأمامية العادية (NormalService) إشعارًا دائمًا في شريط الإشعارات، بينما لا يعرض Poc هذا الإشعار.
في استدعاء onNotificationError، يتم إجبار التطبيق على الانهيار، كما يتم إجباره على الانهيار أيضًا في معالجة الاستثناءات لطريقة postNotification.
[1] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-0108
[2] https://github.com/wrlu/vulnerabilities/tree/master/CVE-2020-0108
[3] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-0313