
CVE-2025-21479 دليل المفهوم، أعتقد
اختراق جذر لـ Quest 3/3S لتحديث 7 أغسطس 2025 والإصدارات الأقدم، استنادًا إلى CVE-2025-21479.
screenshot of Magisk, Cheese, and Termux with a root shell
التجذير خطير. إذا تسببت في تلف Quest 3/3S، فلا توجد طريقة لإصلاحه.
هذا يعطل كل الأمان عند التجذير المؤقت.
لا تقم بتشغيل تطبيقات أو تصفح مواقع لا تثق بها.
لا تكتب على قسم الإقلاع أو النظام. سوف يتلف الجهاز.
لا تستخدم ميزة "تثبيت" في Magisk.
قد ترغب في عمل نسخة احتياطية من deviceKey و Meta Access Token و Oculus Access Token بعد التجذير.
يمكنك تنزيل APK من قسم الإصدارات.
راجع دليل FreeXR لتجذير Quest 3/3S.
انضم إلى FreeXR على Discord لمزيد من المعلومات.
لا يتم دعم الإصدارات الأحدث. (يمكن دعم الإصدارات الأقدم بمزيد من العمل.)
قامت Meta بتصحيح CVE-2025-21479 في هذه الإصدارات وأي إصدارات أحدث. لن يتم دعمها أبدًا.
يحتوي هذا المستودع على الكود المصدري للأمر التنفيذي cheese.
يحتوي مستودع cheese-app على الكود المصدري للتطبيق.
يعتمد هذا على كتابات باحثين آخرين عن معالج Adreno GPU: يستخدم هذا كودًا من:
معلومات إضافية عن برنامج Adreno GPU الثابت، بما في ذلك كيفية مقارنة البرنامج الثابت وكيفية عمله، مأخوذة من توثيق afuc لمشروع Freedreno بواسطة Rob Clark و Connor Abbott ومساهمين آخرين في Freedreno/Turnip.
شكر للمطورين في XRBreak و FreeXR على كل مساعداتهم ومساهماتهم.
====
إثبات المفهوم لـ CVE-2025-21479، يوضح أنه يؤثر فقط على أجهزة Adreno A7xx (Snapdragon 8 Gen 1 / XR2 Gen 2 والإصدارات الأحدث).
هذا يختبر فقط ما إذا كان الجهاز معرضًا للخطر - لتحقيق أي شيء مثير للاهتمام، سيتطلب الأمر مزيدًا من الجهد.
على أجهزة Adreno A7xx غير المصححة، يجب أن يطبع هذا:
0 0
وإذا قمت بتشغيل adb bugreport، في نواة dmesg، سترى:
<2>[146532.566695][ T933] kgsl kgsl-3d0: GPU PAGE FAULT: addr = 4000031004 pid= 0 name=(null) drawctxt=1111638594 context pid = 0
<2>[146532.566756][ T933] kgsl kgsl-3d0: context=gfx3d_user TTBR0=0x1234567841414141 (write unknown fault)
<2>[146532.566783][ T933] kgsl kgsl-3d0: FAULTING BLOCK: CP
على أجهزة Adreno A6xx، يطبع هذا:
41414141 42424242
https://notnow.dev/notice/AvIZRBttG7DsDhx9hw
يجب أن يطبع أجهزة Adreno A7xx المصححة (مثل أجهزة Samsung بعد تحديث أمان مايو 2025) هذا أيضًا، لكنني لم أختبره.
# تعديل المسار ليشير إلى Android NDK الخاص بك
bash build.sh
adb push cheese /data/local/tmp
adb shell /data/local/tmp/cheese
https://notnow.dev/notice/Av4sfoQjyrxogkZ6Ya
يقوم هذا بتشغيل مخزن أوامر على معالج Adreno GPU (باستخدام نسخة معدلة من كود Adrenaline لمشروع Project Zero)
قم بتشغيل CP_SET_MODE - هذا يتيح تشغيل حالات الرسم فورًا.
قم بتشغيل CP_SET_DRAW_STATE - هذا يضبط IB_LEVEL إلى 0x4، ثم يستدعي مخزن تعليمات.
داخل CP_SET_DRAW_STATE، قم بتشغيل CP_SMMU_TABLE_UPDATE.
إليك معالجة البرنامج الثابت لـ CP_SMMU_TABLE_UPDATE:
CP_SMMU_TABLE_UPDATE:
// احصل على مستوى IB
and $02, $12, 0x3
// إذا لم يكن 0 (مخزن الحلقة kernel)، اذهب إلى CP_NOP
brne $02, 0x0, #l1873
<كود تعديل SMMU الفعلي >
إذن، مع IB_LEVEL=4، إخفاء 4 بـ 3 يعطيك 0، مما يجتاز الفحص الخاص بمخزن الحلقة kernel.
لذا يمكنك تغيير جداول الصفحات ويؤدي ذلك إلى فشل GPU.
قارنت عدة برامج ثابتة لـ Samsung Galaxy باستخدام مفكك afuc لمشروع Freedreno.
كان البرنامج الثابت لـ Galaxy S24 الأكثر فائدة، حيث أن برنامج GPU الثابت الخاص به يختلف بإصدار واحد فقط - وهو التصحيح الأمني:
https://notnow.dev/notice/AuueszvUVUQnWqMQeO
https://notnow.dev/notice/Av0kDfOUPKhqHyjyxE
البرنامج الثابت لـ Galaxy S24: gen70900_sqe.fw
https://notnow.dev/notice/Av0a7wUouVSa3EKkE4
مقارنة برنامج Adreno الثابت لـ Galaxy S24 بين v675 و v676 تظهر نوعًا واحدًا من الاختلاف:
0163: b80300a4 CP_ME_INIT:
0163: b80300a4 fxn355:
0163: b80300a4 cread $03, [$00 + 0x0a4]
- 0164: 2a440003 and $04, $12, 0x3
+ 0164: 2a440007 and $04, $12, 0x7
0165: 98641813 ushr $03, $03, $04
0166: c860004a brne $03, b0, #l432
0167: 01000000 nop
كل وصول إلى $12 الآن يستخدم 0x7 بدلاً من 0x3. لا توجد تغييرات أخرى.
https://gist.github.com/zhuowei/46a68b9ee53589cdeaa40c11d15d895f
يبدو أن المسجل $12 هو مستوى IB: https://gitlab.freedesktop.org/mesa/mesa/-/blob/c0f56fc64cad946d5c4fda509ef3056994c183d9/src/freedreno/afuc/README.rst#id23 https://gitlab.freedesktop.org/mesa/mesa/-/blob/c0f56fc64cad946d5c4fda509ef3056994c183d9/src/freedreno/afuc/README.rst#id29
الذي يحدد أي قائمة من أوامر الرسم سيتم قراءتها. https://gitlab.freedesktop.org/mesa/mesa/-/blob/c0f56fc64cad946d5c4fda509ef3056994c183d9/src/freedreno/afuc/README.rst#id31
يدعم جهاز Adreno 7xx 5 قوائم (RB (مخزن الحلقة kernel، متميز)، IB1، IB2، IB3، أو SDS): https://cs.android.com/android/platform/superproject/main/+/main:external/mesa3d/src/freedreno/registers/adreno/adreno_control_regs.xml;l=327;drc=c0867f48117dc2c18b1ae689235cb1f60b237600
https://notnow.dev/notice/Av0kDfOUPKhqHyjyxE
أعتقد أن هذا الاختلاف هو CVE-2025-21479. يبدو أنه يؤثر فقط على أجهزة Adreno A7xx (Snapdragon 8 Gen 1 وما فوق). ربما يكون نشرة Qualcomm خاطئة؟
أعتقد، على جهاز Adreno A7xx:
CP_SET_DRAW_STATECP_SMMU_TABLE_UPDATEوفقًا لمدونة Project Zero، فإن تعليمة CP_INDIRECT_BUFFER تستدعي مخزنًا غير مباشر من تعليمات معالج التحكم،
عندما يريد تطبيق استخدام GPU، سيحتوي RB (مخزن الحلقة kernel) على أمر CP_INDIRECT_BUFFER يستدعي مخزنًا غير مباشر يوفره المستخدم - IB1.
يمكن لهذا المخزن المستخدم استدعاء مخازنه غير المباشرة الخاصة: IB2.
على A7xx، يوجد أيضًا IB3.
بالإضافة إلى ذلك، على كل من A6xx و A7xx، يوجد SDS، الذي لا يتم الدخول إليه بواسطة المخزن غير المباشر، بل بواسطة CP_SET_DRAW_STATE.
https://cs.android.com/android/platform/superproject/+/android15-qpr2-release:external/mesa3d/src/freedreno/decode/cffdec.c;l=3030;drc=0dc791ed57dacf9fe3df694d7f285a8d9f942fa7 https://cs.android.com/android/platform/superproject/+/android15-qpr2-release:external/mesa3d/src/freedreno/decode/cffdec.c;l=2283;drc=0dc791ed57dacf9fe3df694d7f285a8d9f942fa7
يمتلك A6xx RB، IB1، IB2، SDS.
يقوم CP_SET_DRAW_STATE بتعيين مستوى IB إلى 0x3: في a650_sqe.fw.v114 من برنامج Galaxy Fold 3 الثابت:
mov $03, 0x3
or $12, $12, 0x20
call #fxn1132 // يوجد فتحة تفرع، لذا هذا لا ينفذ بعد...
cwrite $03, [$00 + @IB_LEVEL]
لكن A7xx الآن يمتلك RB، IB1، IB2، IB3، أو SDS.
يقوم CP_SET_DRAW_STATE الآن بتعيين مستوى IB إلى 0x4:
mov $03, 0x4
cwrite $03, [$00 + @IB_LEVEL]
0x4 & 0x3 = 0x0.
لذا، سيعتقد الكود الذي يفحص مستوى IB الحالي أن SDS (تعيين حالة الرسم) هو RB (مخزن الحلقة kernel)، وسيسمح بأوامر مثل CP_SMMU_TABLE_UPDATE بالتنفيذ.