Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
mt6985-CVE-2026-43499 — محوّل استغلال CVE-2026-43499 لمعالج MT6985 MediaTek Dimensity 9300 (vivo PD2241) | Kitploit
أدوات/GitHubGitHub/233laoliu/mt6985-cve-2026-43499
أطر الاستغلالتحليل الثغرات الأمنيةالاستغلالالهندسة العكسيةالتحقيق الجنائي الرقميأمن الجوالتحليل البرامج الثابتةاستغلال الملفات الثنائية
GitHub233laoliu/mt6985-cve-2026-43499

mt6985-CVE-2026-43499

محوّل استغلال CVE-2026-43499 لمعالج MT6985 MediaTek Dimensity 9300 (vivo PD2241)

عرض المستودع
114منذ شهر واحدلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

سجل فشل CVE-2026-43499: محاولة تكييف MT6985

الخلاصة: استهلكت 68M توكن، ولم أحصل على صلاحيات root.
السبب: هجوم التوقيت KernelSnitch غير موثوق على Dimensity 9200 من MTK، وCONFIG_PANIC_ON_OOPS=y لا يترك مجالاً للتجربة والخطأ.
هذه المقالة توثق رحلة الأخطاء الكاملة، كمرجع لمن يأتي بعدنا لتجنب هذه المزالق.


الخلفية

المشروعالقيمة
الجهازvivo PD2241 (Dimensity 9200 / MT6985), Android 15
البرنامج الثابتPD2241_A_15.2.10.2.W10.V000L1
النواة5.15.178-android13-8-gfb31f5bdd612-dirty
مُحمّل الإقلاعمقفل (ro.boot.flash.locked=1)
SELinuxEnforcing
panic_on_oopsمُفعّل → أي OOPS في النواة = إعادة تشغيل فورية
الاستغلالCyberMeowfia — CVE-2026-43499 (IonStack)
شجرة المصدرandroid_15.0_kernel_MT6985 (5.15.178) — غير مطابقة لإصدار الجهاز (المصدر هو android15 GKI، والجهاز يعمل بنظام android13 GKI)

ما تم إنجازه

1. تحليل المصدر ← استخراج إزاحات البنى

تم الاستخراج من arch/arm64/include/asm/memory.h + include/linux/fs.h + android/abi_gki_aarch64.xml:

  • تخطيط الذاكرة: KIMAGE_TEXT_BASE = 0xffffffc008000000, VA_BITS=39, DIRECT_MAP=256GB
  • task_struct: 36864 بت، محلل بالكامل (ABI XML layout-offset-in-bits)
  • file_operations: لا يوجد iopoll (android13 GKI), IOCTL=0x48, open=0x68
  • cred: atomic_t usage = 4 بايت, uid=0x04
  • struct page: 64 بايت, slab_cache=0x18

الاكتشاف الرئيسي: المصدر هو android15 GKI، والجهاز هو android13 GKI — إزاحات task_struct تختلف بمقدار 0x40~0x88 بايت، ولا يمكن نسخها حرفياً من المصدر.

2. فك حزم البرنامج الثابت ← استخراج الرموز

root@kitploit:~
OTA zip (8.3GB)
  → payload.bin (8.2GB)
    → payload_dumper → boot.img (96MB, v4 header)
      → فك ضغط LZ4 → Image (50MB ARM64)
        → kallsyms-finder → 187810 رمزاً

تم استخراج الرموز من إصدارين من البرنامج الثابت (15.2.7.6 / 15.2.10.2) — نفس الرمز يختلف بين الإصدارين بمقدار 10KB~200KB، يجب استخدام الإصدار الصحيح.

3. التحقق من التفكيك ← تأكيد الإزاحات الحرجة عبر capstone

root@kitploit:~
# داخل rt_mutex_adjust_pi:
LDR x21, [x19, #0x8b0]  → pi_blocked_on = 0x8b0 (قيمة android15، وليست frankel)

هذا يؤكد أن تخطيط task_struct هو فرع android15، وليس android13 الخاص بـ frankel.

4. الترجمة ← نجحت

NDK r29, make PROJECT=android_15.0_kernel_MT6985 → preload.so (150KB).

5. التشغيل ← انهيارات متكررة

root@kitploit:~
[+] preload starting pid=25414
[+] p0 profile ... تم تحميل جميع الرموز بشكل صحيح
[-] KernelSnitch mm_struct leak failed     ← أحياناً لا تظهر هذه الرسالة (نجاح عرضي)
[+] slide child context route=pselect      ← بدء العملية الفرعية لتسريب KASLR slide
[انفجار النواة]                                ← rt_mutex_adjust_prio_chain+0x1b0

تعليمة الانهيار (capstone):

root@kitploit:~
ldar w8, [x27]    ; x27 = waiter->lock (محملة من [x28, #0x38])
                  ; قيمة x27 غير صالحة → لا يوجد تعيين لصفحة الذاكرة → translation fault
                  ; → die() → panic → إعادة تشغيل

لماذا فشل

السبب الجذري 1: KernelSnitch غير موثوق على MTK

KernelSnitch هو مدخل الاستغلال بالكامل — فهو يسرب عنوان mm_struct عبر فروق التوقيت في جدول تجزئة futex:

  1. كشف التصادم نجح — تم العثور على 5 تصادمات تحت العتبة المنخفضة
  2. مطابقة bruteforce تفشل دائماً تقريباً — المشكلة الأساسية في:
root@kitploit:~
MT6985 يحتوي على CONFIG_KASAN_HW_TAGS=y → النواة تستخدم وسوم MTE لتمييز تخصيصات slab
مؤشر mm_struct يحمل وسم KASAN → futex_hash يُحسب بناءً على المؤشر الموسوم

لكن مسح bruteforce يغطي الـ direct map (عناوين غير موسومة) → التجزئة المحسوبة غير متطابقة
حتى مع إضافة تكرار وسوم MTE (0-14 أي 15 نوعاً)، على نظام VA_BITS=39
بتات الوسم (bit56-59) تتداخل مع بتات توسيع الإشارة → بعض تركيبات الوسوم تولد عناوين غير صالحة → تفويت

أجهزة Pixel لا تحتوي على KASAN_HW_TAGS، وهذه الآلية تعمل هناك. MTK لا تعمل.

السبب الجذري 2: CONFIG_PANIC_ON_OOPS هو القاتل

root@kitploit:~
Pixel:  OOPS في النواة → dump_stack → متابعة التشغيل → يمكن إعادة محاولة الاستغلال
MT6985: OOPS في النواة → die() → panic() → إعادة تشغيل فورية → لا مجال للتجربة والخطأ
أي انحراف بسيط في سلسلة π يؤدي لانهيار كامل، بينما في Pixel الانحراف يعني فقط "لم تنجح هذه المرة، جرب مجموعة عناوين أخرى".

كما أن مُحمّل الإقلاع مقفل (flash.locked=1) → لا يمكن وميض نواة مخصصة لإزالة هذا الخيار.

السبب الجذري 3: انحراف إصدار النواة

root@kitploit:~
شجرة المصدر: 5.15.178 android15 GKI
الجهاز:      5.15.178-android13 (بائع vivo)

رغم أن رقم الإصدار الرئيسي هو 5.15.178 في كليهما، إلا أن فرع GKI مختلف (android13 مقابل android15)، وتخطيطات البنى الحرجة مثل task_struct/cred غير متطابقة. تم التنقل مراراً بين مجموعتي إزاحات frankel/android15، وفي النهاية تم التثبيت عبر التفكيك فقط.


التعديلات التي تمت تجربتها (كلها بلا فائدة)

التعديلالهدفالنتيجة
THRESHOLD_MULT 10→5→3خفض عتبة كشف التصادم<5 إيجابيات كاذبة كثيرة جداً
APPENDED_FUTEXES 4096→8192زيادة فرق سلسلة التجزئةبلا تأثير
REPEAT_MEASUREMENT/AVERAGEزيادة دقة أخذ العيناتبلا تأثير
MTE=1جعل bruteforce يتكرر عبر الوسومأبطأ، بل قلل الانهيارات
MM_STRUCT_SZ 0x500→0x400تصحيح خطوة mm_structضروري، ABI الفعلي 992 بايت
IDENTITY_END 64GB→256GBتوسيع نطاق المسحبطيء جداً (تكرار MTE)، وما زال غير متطابق
إزاحات TASK: android15↔frankelتثبيت الإزاحة الصحيحةالتفكيك يؤكد android15
إزاحات FOPS: android15↔frankelandroid13 لا يحتوي iopollاستخدام frankel

الوضع الحالي لـ target.h

في exploit/targets/android_15.0_kernel_MT6985/target.h:

الفئةدرجة الثقةطريقة التحقق
تخطيط الذاكرةصحيححساب memory.h + التحقق عبر kallsyms _text
إزاحات الرموز (22 رمزاً)صحيحةمستخرجة من boot.img الخاص بـ 15.2.10.2
إزاحات task_structصحيحةABI XML + تفكيك capstone (pi_blocked_on=0x8b0)
إزاحات FOPSخاطئة (تم تصحيحها في 2026-07-31)القيمة الأصلية منسوخة من frankel (android13 بلا iopoll)؛ ABI شجرة المصدر الفعلي يحتوي iopoll@0x30، ioctl=0x50، open=0x70 — انظر VERIFICATION.md
إزاحات CREDصحيحة (تم التحقق منها)ABI XML: uid=0x04، securebits=0x24، caps=0x28، security=0x78

التجميع ينجح، والتشغيل يعمل، والخسارة كانت في الميل الأخير.


إذا كنت تريد المتابعة

الشروط الضرورية (لا غنى عن أي منها)

  1. إزالة CONFIG_PANIC_ON_OOPS — إما بوميض نواة مخصصة (يتطلب فك قفل مُحمّل الإقلاع)، أو إيجاد جهاز MT6985 آخر يكون هذا الخيار معطلاً افتراضياً
  2. حل مشكلة KernelSnitch — يتطلب معايرة توقيت ذاكرة التخزين المؤقت لـ Dimensity 9200 من MTK، أو استبدال KernelSnitch بالكامل في الاستغلال بطريقة أخرى لتسريب mm_struct

أفكار بديلة محتملة

  • /proc/self/pagemap — مقيد على هذا الجهاز (يعيد أصفاراً)
  • واجهات تصحيح أخطاء خاصة بـ MTK (/proc/mtk_*) — موجودة لكنها تحتاج مزيداً من التحليل
  • ثغرات ioctl في مشغلات الكاميرا/GPU من MTK — مسار تصعيد أسهل
  • انتظار تكييف مجتمعي لنسخة MTK

القيمة المتبقية في هذا المستودع

  • symbols/kallsyms_PD2241_15.2.10.2.txt — جدول رموز كامل لإصدار 15.2.10.2، يمكن لمن يأتي بعدنا استخدامه مباشرة
  • device_config.txt — إعدادات النواة الفعلية للجهاز، يمكن رؤية ما غيّره البائع
  • exploit/targets/android_15.0_kernel_MT6985/target.h — إزاحات البنى تم التحقق منها
  • scripts/server_compile.py — ترجمة آلية، إعادة الترجمة سريعة بعد تغيير المعاملات

قائمة المزالق (لمن يأتي بعدنا)

  1. فك ضغط الملفات على Windows: tar -xf قد يفشل مع ملفات zip الكبيرة، استخدم Python zipfile أو فك الضغط يدوياً أولاً
  2. تعارض إصدار protobuf في payload_dumper: ملف update_metadata_pb2.py المُولّد يتطلب protobuf 5.x، يجب حذف سطر استيراد runtime_version يدوياً
  3. تشغيل ./preload.so مباشرة يسبب segfault: يجب استخدام /system/bin/linker64 /data/local/tmp/preload.so
  4. ABI XML أدق من المصدر: layout-offset-in-bits محسوب بواسطة المترجم، أدق 100 مرة من العد اليدوي لـ 5000 بايت
  5. فرع GKI يؤثر على التخطيط: task_struct يختلف بين android13/14/15، لا يمكن نسخ الإزاحات عبر الفروع
  6. اختلاف إصدار البرنامج الثابت يعني اختلاف إزاحات الرموز: 15.2.7.6 و 15.2.10.2 يختلفان بمقدار 10KB~200KB
  7. بائع vivo أضاف حقول OEM كثيرة: CONFIG_ANDROID_VENDOR_OEM_DATA=y, CONFIG_SCHED_INFO=y, CONFIG_RSC_* → انحراف عن GKI القياسي
  8. سلسلة أدوات استخراج الرموز: boot.img → kernel.bin → فك ضغط LZ4 → Image → kallsyms-finder → جدول الرموز

الخط الزمني

root@kitploit:~
07/28  تنزيل مستودع CyberMeowfia + مصدر MT6985
07/29  تحليل المصدر (memory.h, fs.h, ABI XML, بنى مختلفة)
       فك حزم البرنامج الثابت (payload.bin → boot.img → Image)
       استخراج الرموز (kallsyms-finder → 187810 رمزاً)
       جولات ترجمة متعددة + انهيارات متعددة + تحقق بالتفكيك
       5 محاولات إعادة تلقائية → كلها فشلت
       كتابة هذا التقرير
-------------------------------------------
الإجمالي: ~68M توكن، 0 قشرة root

2026-07-29، عشت لأروي القصة


2026-07-31 تكملة: التحقق والتصحيح بعد توفر المصدر

بعد الحصول على android_15.0_kernel_MT6985.tar.gz (شجرة مصدر 5.15.178 + ABI XML) تم إجراء تحقق متقاطع شامل، التفاصيل في VERIFICATION.md. الملخص:

  1. MT6985 = Dimensity 9200 (MT6989 هو 9300)، تم التصحيح أعلاه.
  2. إزاحات الرموز 23/23 صحيحة (تحقق kallsyms)، إزاحات task_struct / cred / waiter / page / pipe / configfs كلها متطابقة مع ABI شجرة المصدر.
  3. إزاحات FOPS كانت خاطئة: القيمة الأصلية منسوخة من frankel (android13 GKI، بلا iopoll، ioctl=0x48)؛ لكن تخطيط task_struct للجهاز (pi_blocked_on=0x8b0، مؤكد بالتفكيك أثناء التشغيل) متطابق مع شجرة المصدر هذه، ونفس النواة يجب أن تحتوي file_operations مع iopoll@0x30، ioctl=0x50، open=0x70 — تم تصحيح target.h، مع الاستفادة من leak_kernel_base() المدمج في الاستغلال للتحقق الذاتي على الجهاز الحقيقي كشبكة أمان.
  4. تصحيح توافق KernelSnitch مع MTK (patches/kernelsnitch_mtk_fixes.patch):
    • حجم جدول تجزئة futex في وضع المستخدم أصبح مطابقاً للنواة (possible CPU + 2 مقرباً لقوة 2)، لتجنب فشل bruteforce الحتمي عندما possible≠online؛
    • تكرار وسوم MTE أضاف 0xf (غير موسوم)، وجعل KSNITCH_MTE_ENABLED=1 فعالاً فعلاً (كان util.c الأصلي يثبت mte=0)؛
    • لا يؤثر على الأهداف غير MTK.
  5. نقطة الانهيار rt_mutex_adjust_prio_chain+0x1b0 تقع في مرحلة سلسلة pselect/pi، قبل التحقق الذاتي من FOPS؛ بعد التصحيحات أعلاه يستحق إعادة الاختبار على الجهاز.

2026-07-31 اختبار حقيقي على الجهاز: KernelSnitch يعمل الآن، مرحلة slide ما زالت عائقاً

الجهاز (PD2241, compiler251203103903) — أكثر من 8 جولات اختبار على الجهاز الفعلي:

  • KernelSnitch تم إصلاحه والتحقق منه: MM_STRUCT_SZ=0x400 (القيمة 0x500 الأصلية كانت تسبب انحراف شبكة المسح وإيجابيات كاذبة فقط) + تكرار وسوم MTE 0..15 (وسم مؤشر mm للجهاز يتغير) + إزالة الوسم من العناوين المزيفة. الآن يمكن العثور على mm_struct الحقيقي بشكل مستقر.
  • كل جولة ما زالت تنهار عند rt_mutex_adjust_prio_chain+0x1b0: سباق توقيت سلسلة pselect/pi (الـ waiter المزيف لا يصل إلى الإزاحة الصحيحة في مكدس النواة). جدولة RSC من vivo عدّلت مسار futex/pi، وقد تدمر هذا السباق جذرياً. محاذاة مكدس slide أصبحت معلمة عبر متغير البيئة SLIDE_SHIFT، ولم يكتمل المسح.
  • مراحل FOPS/pipe/cred لم تُختبر بعد، التحقق على الجهاز الفعلي مستمر.

القرار النهائي: النزول إلى فك قفل مُحمّل الإقلاع المدفوع (عدم الاعتماد على هذا المسار بعد الآن).

تنزيل الأداة