
CVE-2026-0013 إثبات مفهوم تصعيد الامتيازات على أندرويد - أصناف مُجمَّعة للبحث الأمني (مشتق من inforcqb/cve-2026-0013-exploit)
ثغرة الوكيل المربك (Confused Deputy) في DocumentsUI على أندرويد - مشروع تحقّق للبحث الأمني
هذا المستودع هو مستودع بناء مُشتقّ، ويرتبط بالمستودع الرئيسي الأصلي بعلاقة تابعة.
| الدور | المستودع | الوصف |
|---|---|---|
| المستودع الرئيسي | inforcqb/cve-2026-0013-exploit | البحث الأصلي للثغرة |
| هذا المستودع | XiaoBaiLovesStirring/cve-2026-0013-poc | توزيع نواتج البناء السحابية |
قبل الوصول إلى هذا المستودع، تأكّد من قراءة وفهم SECURITY_PROTOCOL.md.
النقاط الرئيسية:
GitHub Pages: https://XiaoBaiLovesStirring.github.io/cve-2026-0013-poc/
تشغيل البناء: https://github.com/XiaoBaiLovesStirring/cve-2026-0013-poc/actions
الحصول على النواتج: git clone --branch artifacts https://github.com/XiaoBaiLovesStirring/cve-2026-0013-poc.git
التغيير: أصبح targetIntent الذي يُطلقه DocumentsUI بالوكالة يشير إلى المكوّن المخصص الجديد IdTestActivity. يتولّى هذا المكوّن تنفيذ id وكتابة هوية التشغيل والنتيجة في logcat وشريط الإشعارات، للتحقق الفعلي من حقيقتين أساسيتين:
Intent.EXTRA_INTENT ويُطلق المكوّن الهدف بالوكالة؟شرح الآلية (مهم): وفقًا لنموذج العزل في أندرويد، فإن أي مكوّن من تطبيق طرف ثالث - بغضّ النظر عمّن أطلقه - يعمل فقط داخل العملية/UID المُعلَن عنها ذاتيًا. بالاعتماد على تشغيل DocumentsUI بالوكالة فقط، سيظل IdTestActivity يعمل بمعرّف UID الخاص بـ com.example.cve20260013exploit (مثل u0_a702/10702)، ولن يتحوّل تلقائيًا إلى uid=10054 الخاص بـ DocumentsUI. للحصول على 10054 لكامل ملف APK، يلزم sharedUserId="android.uid.documentsui" (يتطلب توقيع النظام، وهو غير متاح لأطراف ثالثة) أو بيئة root. تكمن قيمة v1.0.4 في التحقق مما إذا كان EXTRA_INTENT مستهلكًا وتحديد الهوية الحقيقية للتشغيل بالوكالة.
المشكلة: على OPPO/ColorOS، لم يعد PickActivity في DocumentsUI يستهلك Intent.EXTRA_INTENT المُمرَّر من المُستدعي. في الاختبار الفعلي، ظلّ mCallingUid هو معرّف المُستدعي u0_a702، واكتفى PickActivity بعرض واجهة التحديد الخاصة به ثم توقف، دون أي إطلاق بالوكالة للإجراء الهدف بهوية DocumentsUI (uid=10054)، وبذلك انقطعت سلسلة الوكيل المربك الأصلية فعليًا.
الإصلاح (إعادة تصميم سلسلة التشغيل):
ACTION_OPEN_DOCUMENT / ACTION_GET_CONTENT + CATEGORY_OPENABLE + */*)picker.PickActivity والمدخل الأصلي PickActivity، لمنع الانهيار عند عدم العثور على المدخلcontent:// الذي يعيده DocumentsUI (probeUriGrant)، للتحقق من قيام الوكيل المربك من منظور المُفوِّضشرح الآلية: لا يمكن للتطبيق نفسه أن يجعل عملية DocumentsUI تنفّذ أوامر عشوائية بالوكالة؛ فـ«رفع الامتياز» في الوكيل المربك يتجسّد في جعله يحتفظ/يعيد توجيه نيابةً عنك موارد التفويض التي لا يمكن الحصول عليها إلا بمعرّف uid الخاص به. لذلك تحوّل v1.0.3 إلى التحقق من «من حصل على إذن URI الممنوح من DocumentsUI»، بدلًا من تنفيذ id داخل عملية التطبيق نفسها.
سجل إصلاح البناء: فشل البناء الأول، إذ كان النوع المُرجَع من getPackageManager().resolveActivity() هو ResolveInfo وليس ComponentName، مع الخطأ error: incompatible types: ResolveInfo cannot be converted to ComponentName. تم الإصلاح باستخراج packageName/name من ResolveInfo.activityInfo لإنشاء ComponentName، ثم نجح البناء.
التغيير: تغيّر إجراء إثبات المفهوم من «تشغيل Termux» إلى «تنفيذ أمر id بعد تشغيل سلسلة الوكيل المربك، وعرض النتيجة في شريط إشعارات النظام».
id داخل التطبيق (محاولة مسارات متعددة: sh -c id وid و/system/bin/id و/system/xbin/id)uid/gid/groups في شريط الإشعاراتpicker.PickActivity → .PickActivity الأصلي)POST_NOTIFICATIONS لأندرويد 13+ لإرسال الإشعاراتالمشكلة: عدّلت عدة شركات مصنّعة (مثل OPPO) مسار فئات DocumentsUI، إذ انتقل المدخل الأصلي com.android.documentsui.PickActivity إلى com.android.documentsui.picker.PickActivity، ما جعل نواتج البناء القديمة غير قادرة على تحديد مدخل استغلال الثغرة على الجهاز المستهدف.
الإصلاح:
com.android.documentsui.picker.PickActivity.PickActivityدليل استكشاف فشل البناء (مهم):
dumpsys package com.android.documentsui أو جدول Activity Resolver Table، ثم عدّل معامل setClassName في ExploitActivity.java وادفع التغيير لبدء إعادة البناءCVE-2026-0013 | HIGH (CVSS 8.4) | CWE-441 | Android 14-16 | DocumentsUI PickActivity
نشرة الإصلاح: Android Security Bulletin 2026-03-01