
استغلال ثغرة CVE-2025-8045، وهي ثغرة استخدام بعد التحرير (UAF) في برنامج تشغيل نواة معالج رسوميات Arm Mali GPU. يحوّل مخزن GPU المؤقت المُحرَّر إلى جدول صفحات متسخ، مما يتيح القراءة/الكتابة العشوائية على مستوى النواة وفتح صدفة بصلاحيات الجذر على أندرويد.
استغلال لرفع الامتيازات محليًا يستهدف CVE-2025-8045، وهي ثغرة استخدام بعد التحرير (use-after-free) في
برنامج تشغيل نواة وحدة معالجة الرسوم Arm Mali GPU (kbase). تتنافس عملية محلية غير ممتازة مع مسار تفريغ
قائمة انتظار KCPU الخاصة بـ CSF لتحرير واستعادة cpu_queue.buffer، وتحوّل التخصيص المعلّق إلى
جدول صفحات تملكه العملية ("جدول صفحات قذر" أو dirty pagetable)، وتستخدم هذه الأولية للحصول على
قراءة/كتابة فيزيائية عشوائية على مستوى النواة — وتنتهي بجذر (root) مع ضبط SELinux على الوضع المتساهل (permissive).
تم الاستغلال على Pixel 7 Pro (الإصدار
BP3A.250905.014). الإزاحات المثبّتة فيexploit.cمعايرة لهذا الهدف؛ الأجهزة/الإصدارات الأخرى تحتاج إلى إعادة اشتقاق الإزاحات (انظر الضبط وقابلية النقل).
CVE-2025-8045 هي ثغرة استخدام بعد التحرير في برامج تشغيل نواة Arm Valhall وبنية الجيل الخامس لوحدات
معالجة الرسوم (r53p0–). يمكن لعملية محلية غير ممتازة قيادة عمليات معالجة GPU بطريقة تجعل
برنامج التشغيل يعمل على ذاكرة تم تحريرها بالفعل، مما يفتح الباب أمام كشف ذاكرة النواة، وإفسادها، وتنفيذ كود.
r54p1يصل هذا الاستغلال إلى الثغرة عبر واجهة قائمة انتظار KCPU الخاصة بـ CSF والمكشوفة من خلال /dev/mali0:
CQS_WAIT غير قابل للتحقيق يليه
FENCE_SIGNAL. يؤدي الانتظار إلى توقف القائمة مؤقتًا بحيث يعمل مؤقّت السياج (fence timer) لاحقًا، عند
حد دلو عجلة مؤقّت (timer-wheel bucket) يمكن التنبؤ به.KBASE_IOCTL_CS_CPU_QUEUE_DUMP تنفيذ kbase_csf_cpu_queue_dump_buffer().
مزامنة انتقال حالة القائمة (ISSUED ← COMPLETE/PENDING) مع مسار التفريغ
تحرّر cpu_queue.buffer بينما لا يزال مُشارًا إليه — هذه هي UAF.الاستغلال هو استغلال توقيت: يقوم أولاً بمعايرة المهلة الزمنية (deadline)، ثم يتنبأ بها في كل جولة ويُطلق "موجة" من استدعاءات التفريغ غير المؤذية لتوسيع نافذة السباق حول لحظة التحرير.
| المرحلة | ما يحدث |
|---|---|
| معايرة | الجولة الأولى تقيس حافة الانتقال ISSUED←COMPLETE لمعرفة طور دلو عجلة المؤقّت. |
| تنبؤ + مسح | الجولات اللاحقة تتنبأ بالموعد النهائي وتمسح إزاحة القراءة بمقدار ±مللي ثانية لتصيب لحظة التحرير بدقة. |
| موجة | 64 سلسلة تنفيذ تكدّس استدعاءات CS_CPU_QUEUE_DUMP على csf.lock لتطويق الموعد النهائي وتوسيع النافذة. |
| استعادة | تفريغ مسبق لقوائم التحرير غير القابلة للنقل (UNMOVABLE)، ثم رشّ صفحات GPU مختومة بحيث تعود الكتلة المحررة تحت سيطرتنا. |
| جدول صفحات قذر | تحرير مرة أخرى ورشّ جداول صفحات CPU فوريًا في نفس الصفحة؛ تخصيص GPU الآن يتطابق مع جدول مستوى أخير حي. |
| قراءة/كتابة عشوائية | يتم توجيه إدخال نافذة (PTE) لا يُعاد استخدامه أبدًا إلى صفحات فيزيائية للنواة؛ ويتم إجبار مسح TLB عبر رحلة ذهاب وإياب PROT_NONE على تعيين مؤقت كبير (scratch mapping). |
| جذر | مسح selinux_state.enforcing، وتصحيح sel_read_enforce باستخدام commit_creds(init_cred)، ثم تحرير عملية فرعية متوقفة تنفّذ قشرة بصلاحيات جذر. |
نظرًا لأن صفحة واحدة تصبح في الوقت نفسه تخصيص Mali وجدول صفحات CPU حي، تبقى العملية متوقفة إلى الأبد بدلًا من الخروج — تحريرها سيكون تحريرًا مزدوجًا وسيُحدث ذعرًا في النواة.
# Android / arm64 (NDK)
aarch64-linux-android31-clang -O2 -o exploit exploit.c
./exploit
عند النجاح تحصل على قشرة بصلاحيات جذر (uid=0) مع SELinux متساهل. تدفق نموذجي:
[*] pid=... cpus=8 wave=64 harvest cpu=7 rounds=256
[*] round 1 calibrate deadline t0+... ms phase ... ms
[*] round N read +... us
[+] UAF page: spray region R page P @ ..., 1 live descriptor
[+] entry 0 = ... -- a CPU page table, writable through the GPU
[+] alias: dirty pagetable
[+] selinux_state.enforcing = 0 @ phys ...
[+] sel_read_enforce patched @ phys ...
[+] root shell: uid=0 euid=0
إذا أكمل جميع الجولات دون نجاح، فإن cpu_queue.c:71 في dmesg يشير إلى أن
السباق يصل إلى هدفه لكن الاستعادة فشلت — اضبط معاملات الاستعادة/الموجة.
القيم في exploit.c معايرة لجهاز Pixel 7 Pro، الإصدار
BP3A.250905.014. الإزاحات والثوابت خاصة بالجهاز/النواة ويجب
إعادة اشتقاقها لأي هدف آخر:
KERNEL_PA_BASE، SEL_READ_ENFORCE، INIT_CRED، COMMIT_CREDS،
SELINUX_STATE — إزاحات رموز/فيزيائية للنواة.ARM64_PTE_FLAGS — قالب واصف المستوى الأخير لإعداد MMU الخاص بالهدف.WAVE_*، SWEEP_*، BUCKET_NS، WAIT_NS، أحجام الرش — مقابض توقيت السباق
وتهيئة كومة الذاكرة.قم بالتحديث إلى إصدار برنامج التشغيل المُصلَح من Arm للمعالجة.
يُنشر هذا الكود strictly لأغراض البحث الأمني الدفاعي، وهندسة الكشف، والتعليم. لا تشغّله ضد أنظمة لا تملكها أو لا تملك إذنًا كتابيًا صريحًا لاختبارها. لا يتحمل المؤلف أي مسؤولية عن إساءة الاستخدام أو عن أي ضرر ناتج. استخدامه ضد أنظمة دون إذن غير قانوني.