
واجهة أمامية لنظام Android خاصة بـ CVE-2026-98260: صدفة الجذر + التحميل المتأخر لـ KernelSU عبر Shizuku
واجهة أمامية لنظام أندرويد لـ CVE-2026-98260 (استخدام-بعد-التحرير في مؤقت CPU الخاص بـ POSIX)، وهي
نفس فئة الخلل الموجودة في CVE-2026-64560. نقرة واحدة تمنحك صدفة جذر (root shell) ثم
تُحمّل متأخرًا KernelSU (u:r:ksu:s0).
الاستغلال نفسه غير مضمّن هنا. هذا المستودع هو غلاف التطبيق حوله: واجهة المستخدم، واكتشاف الحالة، وبنية Shizuku اللازمة لتشغيل استغلال في نطاق الصدفة (shell domain) من تطبيق عادي.
يعمل التطبيق بصلاحية untrusted_app ولا يمكنه قراءة /sys/kernel/tracing، وهو ما
يحتاجه الاستغلال للتسريب والتحفيز. لذلك يشغّل TimerRoot خدمة مستخدم Shizuku،
والتي يشغّلها Shizuku بصلاحية مستخدم الصدفة (uid 2000،
u:r:shell:s0). يُنفَّذ ملف الاستغلال الثنائي داخل تلك العملية، فيحصل
على نفس البيئة التي كان سيحصل عليها من adb shell.
MainActivity (untrusted_app)
└─ Shizuku user service (uid 2000, u:r:shell:s0)
├─ extracts assets/timer to /data/local/tmp/timer
└─ runs it; on success keeps /system/bin/sh alive
minSdk 30)، arm64Load KernelSU6.12.69-android16-6-g242e1a07f878-ab15865446-4k؛ انظر أدناه.يتوقع TimerRoot وجود الاستغلال المُجمَّع في app/src/main/assets/timer:
git clone https://github.com/YuKongA/CVE-2026-98260
cp CVE-2026-98260/timer/timer app/src/main/assets/timer
أو
scripts/fetch-timer.ps1
الملف الثنائي مرخّص بموجب MIT من قبل مؤلفيه؛ لا تستخدمه إلا على أجهزة تملكها، وفقط عندما يتطابق نواة نظامك مع البنية التي نُقل إليها.
افتح المشروع وقم بالبناء، أو:
./gradlew assembleDebug
يحتاج المشروع إلى Android SDK مع platform 36 وbuild-tools 36. تُجلب واجهة Shizuku API من Maven (dev.rikka.shizuku:api).
يبني scripts/build.ps1 ويوقّع ملف APK باستخدام SDK وjavac وd8 وaapt2 وapksigner فقط. لا يضمّن أي شيء: فهو يترجم التطبيق مع مصادر Shizuku API، لذا استنسخ تلك المصادر أولًا:
git clone https://github.com/RikkaApps/Shizuku-API
scripts/build.ps1 -Sdk "C:\Users\<you>\AppData\Local\Android\Sdk"
يجب أن يكون Shizuku قيد التشغيل قبل أن يتمكن TimerRoot من فعل أي شيء: فهو العملية التي توفر مستخدم shell الذي يحتاجه الاستغلال. يتوقف Shizuku عند كل إعادة تشغيل، لذا فهذه هي الخطوة الأولى في كل مرة.
التصحيح اللاسلكي (بدون حاسوب بعد الاقتران الأول)
عبر USB
مع توصيل الهاتف وتفويض تصحيح USB:
adb shell sh /sdcard/Android/data/moe.shizuku.privileged.api/start.sh
قد لا تتضمن إصدارات Shizuku الأحدث ذلك السكربت بعد الآن؛ إذا كان مفقودًا، فاستخدم مسار تصحيح الأخطاء اللاسلكي أعلاه.
تحقق من أن الخادم يعمل:
adb shell ps -A | grep shizuku_server
# shell 12345 1 ... shizuku_server
ps الذي يُظهر فقط moe.shizuku.privileged.api يعني أن تطبيق المدير مفتوح لكن الخادم غير قيد التشغيل؛ لا يمكن أن يبدأ الاستغلال حتى يتم تشغيله.
Not connected، اضغط على Shizuku في صف الأدوات لطلب الإذن مرة أخرى.يقوم Prepare باستخراج assets/timer إلى /data/local/tmp/timer:
installed 307192 bytes
نقرة واحدة. يقوم التطبيق بالتصعيد، ويحتفظ بصدفة uid=0 داخل الخدمة، ثم
يبدأ التحميل المتأخر لـ KernelSU تلقائيًا:
[child] woke uid=0
root shell ready - loading KernelSU...
Loading KernelSU... 12s
KSU_LOADED
تتحول البطاقة إلى Root shell -> Jailbreak mode (u:r:ksu:s0). إذا خسرت
مرحلة KernelSU سباقها، تتحول البطاقة إلى اللون الأحمر مع KernelSU failed، وينبغي
عليك إعادة التشغيل قبل إعادة المحاولة.
استخدم زر Reboot. فهو يمر عبر الخدمة (svc power reboot)، لذا يعمل
حتى عندما لا تكون هناك صدفة جذر مفتوحة بعد. كما أن إعادة التشغيل هي الطريقة النظيفة الوحيدة
لإزالة العمليات المعلّقة وإلغاء تحميل KernelSU.
بعد إعادة التشغيل، ابدأ من جديد من الخطوة 1: فـ Shizuku متوقف وKernelSU قد اختفى.
تعكس بطاقة الحالة ما هو نشط فعليًا، ويُكتشف ذلك عبر تشغيل
su -c id والتحقق من وجود u:r:ksu:s0:
| البطاقة | المعنى |
|---|---|
| Not connected | Shizuku لا يعمل / غير مرتبط |
| Ready | Shizuku متصل، لا يوجد جذر بعد |
| Root shell | uid=0، u:r:shell:s0 |
| Jailbreak mode | KernelSU محمّل، su يعمل في u:r:ksu:s0 |
KernelSU failed وbase calibration failed في السجلتحتاج مرحلة بيانات الاعتماد المزيفة إلى قاعدة الخريطة الخطية للنواة (kernel linear-map base)، والتي يستخلصها الاستغلال من أحداث تتبع تخصيص الصفحات (page-alloc trace events). وهو يفترض صفحات بحجم 4 KB:
[base] made=512 best=0 count=0
[-] base calibration failed
تحقق من حجم صفحة الجهاز:
adb shell getconf PAGE_SIZE
4096: يختلف التخطيط لسبب آخر؛ اجمع uname -r والطراز والسجل الكامل وأبلغ عنه في المستودع الأصلي.16384: لا يمكن للاستغلال أن يعمل على هذا الجهاز كما هو مُشحون. يجب إعادة بنائه لصفحات بحجم 16 كيلوبايت (إزاحات الصفحات والأقنعة وأحجام الرتب)، وهي مهمة نقل (porting) وليست إعدادًا في التطبيق.لا يزال بإمكان صدفة الجذر النجاح على جهاز كهذا، لأن ذلك المسار يحتاج فقط إلى عنوان الاعتماد المسرَّب، وليس إلى قاعدة الخريطة الخطية.
Not connectedShizuku لا يعمل. شغّله مرة أخرى (يتوقف عند كل إعادة تشغيل) وراجع الخطوة 1.
Prepare عن شيءقد يكون مربع حوار نظام يغطي التطبيق (اقتران Shizuku، فحص مثبّت OPPO). أغلقه واضغط Prepare مرة أخرى.
هذا استغلال للنواة. اقرأ هذا قبل الضغط على أي شيء.
app/src/main/java/com/kpgc/timerroot/MainActivity.java UI and state
app/src/main/java/com/kpgc/timerroot/UserService.java runs as the shell user
app/src/main/aidl/com/kpgc/timerroot/IUserService.aidl service interface
app/src/main/assets/timer exploit binary (not in git)
scripts/build.ps1 Gradle-free build
MIT لكود التطبيق في هذا المستودع. يحتفظ كل من ملف الاستغلال الثنائي وواجهة Shizuku API بتراخيصهما الخاصة.