
حساب جذر مؤقت (uid 0) على ASUS Zenfone 9 المقفل بواسطة أداة تحميل الإقلاع عبر CVE-2025-21479 + تسريب العنوان الفيزيائي المعتمد على perf. GPLv3.
كود بحثي وملاحظات للحصول على صلاحيات جذر مؤقتة (uid 0) على ASUS Zenfone 9 (AI2202) الذي لا يمكن فتح أداة تحميل الإقلاع الخاصة به — لأن ASUS أوقفت أداة الفتح الخاصة بها، وأزالت مفتاح فتح OEM من خيارات المطور، وترفض بشكل قاطع fastboot oem unlock / flashing unlock على البرامج الثابتة الحالية.
هذا ليس فتحًا لأداة تحميل الإقلاع ولا يقوم بكتابة أي شيء إلى أي قسم. إنه جذر وقت التشغيل: سلسلة من البدائيات على جانب الجهاز تنتهي بامتلاك العملية المستدعية لبيانات اعتماد الجذر. إعادة التشغيل تمحوه.
تم التحقق على: ASUS Zenfone 9 (AI2202)، Android 14، البنية 34.0304.2004.145، SPL 2024-07-05،
النواة 5.10.205-android12-9-00029-g3f12df86bfdb-ab11799032، SM8475 / Adreno 730، أداة تحميل الإقلاع مقفلة.
التفويض / النطاق. كل ما هنا يعمل ضد جهاز يملكه المشغّل، عبر اتصال ADB مُصرّح به. لا يتم مهاجمة أي خادم من البائع، ولا يتم تجاوز أي مفتاح توقيع أو رمز فتح، ولا يُكتب أي شيء إلى أي قسم. الهاتف المستخدم للتطوير هو هاتف احتياطي، تم نسخه احتياطيًا، ويُحفظ دون اتصال. اختبر على أجهزة تملكها وتستطيع تحمل خسارتها.
النتيجة هي uid 0 في سياق SELinux u:r:kernel:s0 (يرث SID الخاص بـ init_cred)، أي غير مقيّد فعليًا. يجب أن يكون SELinux في وضع Permissive لهذه الخطوة — تحت وضع Enforcing تُقتل العملية بدلاً من ذلك، لأن تبديل بيانات الاعتماد يتجاوز خطاف SELinux.
اضبط ZF9_SERIAL على الرقم التسلسلي لجهازك أولاً (جميع السكربتات تقرأه):
export ZF9_SERIAL=<your-device-serial>
# 0. one-time: build and push the device binaries (needs an Android NDK)
# see scripts/ for the exact clang invocations used
adb push cheese_pa call_capset /data/local/tmp/
# 1. full cycle: SELinux -> permissive, patch, run a command as root, restore everything
scripts/root-now.sh id
scripts/root-now.sh sh # root shell
يقوم السكربت دائمًا باستعادة نص النواة الأصلي وحالة SELinux (محمي بـ trap)، ويتحقق من الاستعادة بالقراءة العكسية.
uid=0(root) gid=0(root) context=u:r:kernel:s0،
capset(NULL,NULL) -> 0.gpu fault threshold exceeded 3 faults in 3000 msecs)، وبعدها تفشل الأوامر الإضافية بـ EPERM. نجاح الترقيع الملاحظ يتراوح بين 13/13 و2/13 كلمة مزدوجة عبر التشغيلات.screenrecord قيد التشغيل. تبدأ السكربتات حملها الخاص لكل عملية (القراءات تتسابق أيضًا)، لكن لا تشغّل أبدًا الأجزاء الداخلية لهذه الأدوات عارية.capset يمكنه تنفيذ بيانات غير صالحة). تكتب السكربتات تعليمة الدخول أخيرًا، وتتحقق من كل كلمة مزدوجة، وتستعيد عند الفشل — لكن إذا تدهورت إحدى التشغيلات، أعد التشغيل قبل إعادة المحاولة.قواعد السلامة التي تستحق الحفاظ عليها: اقرأ قبل كل كتابة، استعد دائمًا ما ترقّعه، لا تترك أبدًا إدخال جدول صفحات محقونًا نشطًا، لا تلمس الذاكرة الفيزيائية الآمنة/TZ (فهي قاتلة)، وأعد التشغيل لاستعادة حالة متدهورة. يحتوي ROADMAP.md على القائمة الكاملة للمزالق مع الأدلة وراء كل منها.
ROADMAP.md durable handoff: verified constants, procedure, gotchas, open paths
STATUS.md current state + verification receipts
src/ pa_leak.{c,h} · cheese.c · cheese_pa.c (workhorse: PROBE/POKE/SELFTEST/ROOT modes)
call_capset.c · host_kallsyms.c (offline symbol resolver)
scripts/ root-now.sh · patch-dwords.sh · demo-root.sh · verify-backup.sh
tools/ btf_offsets.py
صور البرامج الثابتة وحزم OTA وسجلات الجهاز لا يتم إيداعها عمدًا (انظر .gitignore).
GPLv3 — انظر LICENSE.
| المرحلة | ما تفعله | الموقع |
|---|
| 1 | CVE-2025-21479 (Adreno KGSL): يتم تصنيف حزمة SDS خطأً كحزمة ringbuffer، مما يسمح لمساحة المستخدم بإصدار CP_SMMU_TABLE_UPDATE وتوجيه TTBR0 الخاص بـ GPU إلى عنوان فيزيائي يختاره المهاجم | src/cheese.c |
| 2 | تسريب العنوان الفيزيائي: perf_event_paranoid = -1 على هذه البنية، لذا فإن نقطة مراقبة عتادية على صفحة نملكها تُرجع PERF_SAMPLE_PHYS_ADDR — العنوان الفيزيائي لتلك الصفحة. يستبدل تسريب pagemap الذي اعتمد عليه المصدر الأصلي (PFNs مُصفّرة هنا) | src/pa_leak.{c,h} |
| 3 | قراءة/كتابة فيزيائية عشوائية: بناء جدول الصفحات المزيف عند عنوان فيزيائي معروف (من المرحلة 2)، فلا يانصيب رشّ ولا تجوال عشوائي | src/cheese_pa.c |
| 4 | الجذر: حل رموز النواة دون اتصال من صورة البرامج الثابتة، اشتقاق إزاحة KASLR على الجهاز، ترقيع __do_sys_capset بدالة commit_creds(&init_cred)، استدعاء capset() | src/call_capset.c, scripts/ |