
AppEnumGuard v1.2
CVE-2025-31207 التخفيف ومختبر معزول لعمليات كسر الحماية rootless وrootHide على iOS 15–18.4.1.
AppEnumGuard
AppEnumGuard هو تعديل دفاعي للقناة الجانبية لتعداد التطبيقات المثبّتة المتتبَّعة باسم CVE-2025-31207. يدعم بيئات كسر الحماية التقليدية rootless وrootHide على iOS 15.0–18.4.1. يحتوي المستودع أيضًا على تطبيق اختبار iOS عادي محصور في بيئة معزولة (sandboxed) يوضّح النتيجة القابلة للاستغلال ويتحقق من التخفيف.
CVE-2025-31207
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
اعترض الإصدار 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. - ثبّت ملف IPA الخاص بالاختبار باستخدام توقيع مطوّر/تحميل جانبي عادي.
- اترك حقن AppEnumGuard معطّلًا لـ AppEnum Test؛ الإصدار v1.1 يحميه من SpringBoard.
- اضغط على أيقونة تطبيق تعرف أنه مثبّت. تتوفر إعدادات مسبقة لـ WhatsApp وYouTube وSpotify وDopamine وTrollStore وReddit.
النتائج المتوقعة مع تثبيت الهدف المحدد:
| الحالة | الهدف | المفقود | نتيجة الاختبار |
|---|---|---|---|
| التعديل غير موجود | 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
بناء تطبيق IPA للاختبار
يُجمَّع تطبيق الاختبار باستخدام iPhoneOS SDK الخاص بـ Xcode، ولا يتطلب كسر الحماية (jailbreak) أو أي استحقاقات مرتفعة الصلاحيات:
./scripts/build-tester-ipa.sh
يُوضع ملف IPA الناتج في dist/. وهو موقَّع توقيعًا عشوائيًا (ad-hoc) بحيث يمكن لبرنامج التثبيت إعادة توقيعه بهوية تطوير عادية. لا تمنحه platform-application أو com.apple.private.security.no-sandbox، لأن الاختبار مخصص تحديدًا للتشغيل من صندوق حماية تطبيق عادي.
النطاق والقيود
- هذا تخفيف في مساحة المستخدم للبدائية المنشورة في SpringBoardServices، وليس تصحيح FrontBoard الكامل من Apple.
- لا يتطلب الإصدار 1.1 الحقن في التطبيقات المحمية. سيؤدي تعطيل الحقن عالميًا أو لـ SpringBoard نفسه إلى تعطيل التخفيف.
- تم تأكيد التنفيذ من جانب الخادم على iOS 17.3.1 إصدار 21D61. على الإصدارات المدعومة الأخرى، يثبّت الـ tweak خطافه (hook) فقط عندما يمتلك المحدِّد الخاص (private selector) واجهة ABI المتوقعة والمُتحقَّق منها وقت التشغيل.
- لا يكون اختبار
7 / 7ذا معنى إلا عندما يكون التطبيق الهدف معروفًا بأنه مثبَّت. - يستدعي المُختبِر عمدًا واجهة برمجة تطبيقات خاصة غير موثّقة، وهو غير مناسب للتقديم إلى App Store.
المراجع
- محتوى الأمان في Apple iOS 18.5
- NVD: CVE-2025-31207
- إثبات المفهوم العام الأصلي لـ SpringBoardServices
- وثائق مطوّري rootHide
الترخيص
MIT