
CVE-2025-31207 التخفيف ومختبر معزول لعمليات كسر الحماية rootless وrootHide على iOS 15–18.4.1.
AppEnumGuard هو تعديل دفاعي للقناة الجانبية لتعداد التطبيقات المثبّتة المتتبَّعة باسم CVE-2025-31207. يدعم بيئات كسر الحماية التقليدية rootless وrootHide على iOS 15.0–18.4.1. يحتوي المستودع أيضًا على تطبيق اختبار iOS عادي محصور في بيئة معزولة (sandboxed) يوضّح النتيجة القابلة للاستغلال ويتحقق من التخفيف.
CVE-2025-31207 هو ثغرة إفصاح عن المعلومات في منطق إطلاق التطبيقات FrontBoard الخاص بشركة Apple. يمكن لتطبيق محصور في بيئة معزولة إرسال معرّفات حزم (bundle identifiers) عشوائية عبر دالة إطلاق خاصة في SpringBoardServices والتمييز بين التطبيقات المثبّتة والتطبيقات المفقودة باستخدام رموز إرجاع مختلفة. قد يكشف هذا عن معلومات خاصة حول التطبيقات التي ثبّتها المستخدم، بما في ذلك تطبيقات الخدمات المصرفية والمراسلة والأمان والتحميل الجانبي والتطبيقات المرتبطة بكسر الحماية.
تصف Apple المشكلة بأنها مشكلة منطقية قد تسمح لتطبيق بتعداد التطبيقات المثبّتة. عالجت Apple المشكلة بفحوصات محسّنة في iOS وiPadOS 18.5. وبالتالي، تظل الأنظمة الأقدم من iOS 18.5 متأثرة على مستوى نظام التشغيل.
| المكوّن | الهدف المدعوم |
|---|---|
| iOS | 15.0–18.4.1 |
| كسر الحماية | أي بيئة كسر حماية تقليدية rootless أو rootHide |
| معمارية Bootstrap/الحزمة | rootless / iphoneos-arm64؛ rootHide / iphoneos-arm64e |
| معمارية الجهاز | arm64 وarm64e (rootless)؛ arm64e (rootHide) |
| الحزمة | ثبّت الحزمة المطابقة لـ bootstrap الخاص بالجهاز |
يستخدم البناء الافتراضي Theos التقليدي rootless ويتضمن شرائح arm64 وarm64e. يُبنى متغيّر rootHide باستخدام rootHide Theos ويحتوي على مسارات محمّل .jbroot المطلوبة لـ rootHide. تعلن كلتا الحزمتين عن
firmware (>= 15.0) و
firmware (<< 18.5): التخفيف غير ضروري على iOS 18.5 والأحدث، حيث عالجت Apple ثغرة CVE-2025-31207.
تم التحقق من تعديل v1.1 الخاص بجانب SpringBoard وتطبيق الاختبار المحصور في بيئة معزولة معًا على iOS 17.3.1 build 21D61 مع تعطيل الحقن لتطبيق الاختبار. اكتشف تطبيق الاختبار التسريب مع إزالة التعديل وأعاد نتيجة نجاح خضراء بعد تثبيت التعديل.
تستدعي البدائية المنشورة دالة SpringBoardServices الخاصة
SBSLaunchApplicationWithIdentifierAndURLAndLaunchOptions. على نظام قابل للاستغلال، تُرجع أخطاءً مختلفة لتطبيق مثبّت وتطبيق مفقود:
9: الهدف موجود، لكن الإطلاق مرفوض بموجب السياسة7: الهدف غير موجوديحقن AppEnumGuard 1.1 في SpringBoard فقط ويعترض طريقة التحقق من الثقة الشائعة
FBSystemService. عندما يُرجع طلب إطلاق غير مصرّح به خطأ سياسة الأمان 3 في FBSOpenApplicationErrorDomain، يغيّره التعديل إلى خطأ التطبيق غير موجود 4. ثم تُرجع واجهة SpringBoardServices الخارجية 7 لكلٍّ من الأهداف المثبّتة والمفقودة.
يتم التحقق من عدد وسائط الطريقة الخاصة وترميز نوع Objective-C قبل تثبيت الاعتراض. إذا غيّرت Apple واجهة ABI، يفشل AppEnumGuard بشكل مفتوح بدلًا من اعتراض طريقة SpringBoard غير معروفة.
اعترض الإصدار 1.0 دالة SpringBoardServices داخل كل تطبيق UIKit. كان يعمل، لكنه تطلّب الحقن في كل تطبيق تتم حمايته؛ فالتطبيق الذي يعطّل الحقن أو يكتشفه كان يمكنه تجاوز التخفيف. ينقل الإصدار 1.1 التنفيذ إلى SpringBoard، بحيث يحمي اعتراض مركزي واحد المتصلين دون حقن AppEnumGuard في عملياتهم.
يمكن بناء الإصدار 1.2 لأيٍّ من الـ bootstrap:
AppEnumGuard_1.2_rootless_iphoneos-arm64.deb — تعديل rootless تقليديAppEnumGuard_1.2_roothide_iphoneos-arm64e.deb — تعديل rootHideAppEnumGuardTester_1.2_sandboxed.ipa — تطبيق تحقق محصور في بيئة معزولة مع أيقونة.deb المطابق لـ bootstrap الجذري أو rootHide وأعد تشغيل SpringBoard.النتائج المتوقعة مع تثبيت الهدف المحدد:
| الحالة | الهدف | المفقود | نتيجة الاختبار |
|---|---|---|---|
| التعديل غير موجود | 9 | 7 | أحمر / FAIL |
| التعديل نشط | 7 | 7 | أخضر / PASS |
يُظهر الاختبار اللون الأحمر فقط للنتيجة المعروفة القابلة للاستغلال 9 / 7 واللون الأخضر
لكل نتيجة رقمية أخرى؛ وتشير النتيجة الحمراء إلى أن AppEnumGuard غير مثبّت.
النتائج الخضراء موسومة بـ App not detected. أما النتيجة القابلة للاستغلال 9 / 7
فموسومة بـ App detected وAppEnumGuard missing.
اختر فقط تطبيقًا تعرف أنه مثبّت: فالنتيجة 7 / 7 وحدها
لا يمكنها التمييز بين تخفيف فعّال وهدف غير موجود.
يتضمن الاختبار أيضًا وصفًا موجزًا للمشروع ورابطًا قابلًا للنقر إلى مستودع GitHub هذا.
أعاد اختبار الجهاز إنتاج كلتا الحالتين مع تعطيل حقن الاختبار:
فقد أنتجت إزالة التعديل النتيجة الحمراء 9 / 7، بينما أنتج تثبيت الإصدار v1.1
النتيجة الخضراء 7 / 7.
مع Theos القياسي، يكون البناء الافتراضي جذريًا تقليديًا:
cd Tweak
make clean package FINALPACKAGE=1
بالنسبة إلى rootHide، ثبّت rootHide Theos وشغّل:
cd Tweak
THEOS=/path/to/theos-roothide \
make clean package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=roothide
يُجمَّع تطبيق الاختبار باستخدام iPhoneOS SDK الخاص بـ Xcode، ولا يتطلب كسر الحماية (jailbreak) أو أي استحقاقات مرتفعة الصلاحيات:
./scripts/build-tester-ipa.sh
يُوضع ملف IPA الناتج في dist/. وهو موقَّع توقيعًا عشوائيًا (ad-hoc) بحيث يمكن لبرنامج التثبيت إعادة توقيعه بهوية تطوير عادية. لا تمنحه platform-application أو com.apple.private.security.no-sandbox، لأن الاختبار مخصص تحديدًا للتشغيل من صندوق حماية تطبيق عادي.
7 / 7 ذا معنى إلا عندما يكون التطبيق الهدف معروفًا بأنه مثبَّت.MIT