CVE-2023-20938
English
تحليل الثغرة
- يقوم العميل A والعميل B بإنشاء اتصال Binder عبر مدير السياق servicemanager
- ينشئ A العقدة 0xbeef (binder_new_node)، ويشير B إلى العقدة 0xbeef عبر ref->target_node
- يقوم B أولاً بمعالجة target_node 0xbeef بشكل صحيح، ويخزن binder_transaction الذي يشير إلى target_node 0xbeef في قائمة معاملات A (binder_enqueue_work_ilocked)، مما يسمح لـ A بإعادة الإشارة إلى المؤشر المعلق الذي تم تحريره
- يستخدم B حجم offsets_size غير المحاذي لدخول كود معالجة الأخطاء (IS_ALIGNED)، مما يؤدي إلى تمرير buffer_offset الذي لا يزال 0 إلى دالة binder_transaction_buffer_release مما يؤدي إلى تشغيل الثغرة
- تستدعي دالة binder_transaction_buffer_release دالة binder_dec_node_nilocked عبر binder_dec_node، مما يقلل عداد local_strong_refs للعقدة 0xbeef، ولكن مثيل العقدة يحتوي على عدادات وقوائم مراجع متعددة، ولن يتم تحريرها إلا عندما تكون جميع العدادات صفرًا
- يؤدي إغلاق binder الخاص بـ B إلى تشغيل دالة binder_cleanup_ref_olocked، وفي هذه المرحلة يتم أيضًا استدعاء binder_dec_node_nilocked. عندما تُرجع binder_dec_node_nilocked القيمة true، لن يتم مسح المؤشر ref->node الذي يشير إلى العقدة (0xbeef)
- بعد ذلك سيتم استدعاء binder_free_ref، وفي دالة binder_free_ref سيتم تحرير العقدة 0xbeef
- سيقوم A بإعادة الإشارة إلى العقدة 0xbeef المحررة في دالة binder_thread_read (binder_thread_read)
ملاحظة إضافية:
في بيئة Android الحقيقية، لا يمكن للتطبيقات العادية تسجيل الخدمات عبر servicemanager، ولكن يمكنها ربط العمليتين عبر ITokenManager. تستخدم حالة الاختبار هذه ITokenManager.