
ghostlock + tcp-zerocopy ハイブリッド CVE-2026-43499 の Samsung カーネル向け適応
こちらをお読みください -> https://github.com/BuSung-dev/Root-My-Galaxy-Payloads/issues/160#issuecomment-5227077583
[!WARNING] 現在のペイロードテストに依存しないでください。 エクスプロイトコードをより注意深く確認した結果、TCP zerocopy パスに関連する CVE を誤って特定していたことに気づきました。私が実行した単体のペイロードテストは不正確でした。 完全なエクスプロイトチェーンを伴わない単体のペイロードテストは何も証明しません。完全な移植版がテストでき次第、この issue を更新します。
[!IMPORTANT] このベクターが SM-S918B でまだ機能するかどうかを判断する唯一の信頼できる方法は、Pixel 9 の完全なエクスプロイト(GhostLock のダングリングウェイター設定、CFI ステージ、configfs の R/W プリミティブを含む)を移植し、それがメインの tcp ルートで done=1 に到達するかを観察することです。この移植作業は継続しますが、ETA はありません。
🚧 作業中 (
v0.1):
移植戦略を構築するためにフローを調査中です。
CyberMeowfia/exploit/src/ は参照専用です!Samsung デバイスの設定はここでのテスト用に追加されたものであり、特に意味はありません。実際の移植版は src/ に置かれます。
| プロパティ | 値 |
|---|---|
| デバイス | Samsung Galaxy S23 Ultra、dm3q / SM-S918B |
| ビルド | S918BXXSAFZF5 |
| Android バージョン | 16 |
| カーネル | 5.15.189-android13-8-33413713-abS918BXXSAFZF5 |
| フィンガープリント | samsung/dm3qxxx/dm3q:16/BP4A.251205.006/S918BXXSAFZF5:user/release-keys |
| アーキテクチャ | ARM64 |
| カーネルテキストベース | 0xffffffc008000000 |
| 物理ベース | 0x80000000 |
| 物理カーネルロードアドレス | 0x80080000 |
テストペイロードは payloads/ に保存されています。
有効な定数は target.h に保存されています。
S23 ファミリーの端末が脆弱かどうかは、test_tcp_zc.c をコンパイルして実行することで確認できます。
コンパイル
export NDK=~/Android/Sdk/ndk/android-ndk-r29 #path_to_ndk
$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang -static -O2 test_tcp_zc.c -o test_tcp_z
ペネトレーションテストの実行
adb push test_tcp_zc /data/local/tmp/
adb shell chmod +x /data/local/tmp/test_tcp_zc
adb shell /data/local/tmp/test_tcp_zc
何が起こるべきか
If kernel panics then is vulnerable to this exploit!
| ステップ | ステージ | システムコール / プリミティブ | 何が起こるか | データ / ターゲット |
|---|---|---|---|---|
| 1 | セットアップ | — | page_base、fake_lock、fake_fops を検証 | いずれかがゼロなら中止 |
| 2 | セットアップ | socket() ×2 | main_tcp_make_pair() が接続済み TCP ペアを作成 | 127.0.0.1 上の client_fd + server_fd |
| 3 | セットアップ | memfd_create() | punch 用の匿名 memfd を作成 | punch_fd |
| 4 | セットアップ | fallocate() | memfd 上に 16 MiB を事前確保 | MAIN_TCP_PUNCH_SHMEM_LEN |
| 5 | セットアップ | mmap() | memfd をユーザー空間に R/W でマップ | map ポインタ |
| 6 | セットアップ | pthread_create() | main_tcp_punch_thread を開始 | ループ: 確保 → PUNCH_HOLE → ページ解放 |
| 7 | レース | send() | 64 バイトの sendbuf をサーバーソケットへ送信 | MSG_DONTWAIT、MSG_ZEROCOPY なし |
| 8 | レース | — | main_tcp_punch_phase == 0 になるまでスピン | punch スレッドと同期 |
| 9 | レース | — | getsockopt 用に zc[0x40] バッファを構築 | zc[0x18]=map+ps、zc[0x20]=64、zc[0x28]=waiter_task、zc[0x30]=fake_lock |
| 10 | レース | getsockopt() | クライアントソケットで TCP_ZEROCOPY_RECEIVE | カーネルが zc 構造体を読み書き |
| 11 | レース | — | i >= arm_seq(デフォルト 16)の場合: コンシューマーをアーム | punch_consume_go = i → GhostLock コンシューマーをトリガー |
| 12 | レース | — | wait_for_consumer_idle() + スピン | コンシューマーがダングリング waiter を処理するのを待機 |
| 13 | トリガー | — | consumer_calls / consumer_success を確認 | カウンターが増加していれば → レース成功 |
| 14 | CFI | — | run_cfi_stage_on_worker() → try_cfi_stage() | 任意 R/W ステージへ移行 |
| 15 | CFI | open() | open_ashmem_device() → /dev/ashmem を開く | ハイジャックされた fops 用の fd |
| 16 | CFI | configfs_write_once() | 任意書き込みテストペイロードを binwrite_target へ | "CFI_FRIENDLY_CONFIGFS_BIN_WRITE_OK" |
| 17 | CFI | configfs_write_once() | MAIN_TCP_PAYLOAD の場合: fake_fops + FOPS_READ_OFF をゼロ化 | 読み取りスロットを無効化 |
| 18 | CFI | configfs_read_once() | binwrite_target からペイロードを読み戻す | 任意読み取りが機能することを検証 |
| 19 | CFI | configfs_read_once() | misc_fops(ashmem fops ポインタ)を読み取る | fake_fops と等しいことを検証する |
| 20 | CFI | configfs_write_once() | restore_slide_boot_id() — boot ID を上書きする | SLIDE_RANDOM_BOOT_ID_DATA → SLIDE_SYSCTL_BOOTID |
| 21 | CFI | configfs_read_once() ×4 | leak_kernel_base() — ashmem fops スロットを読み取る | open/ioctl/mmap/release/show_fdinfo |
| 22 | CFI | — | リークしたポインタから kaslr_base / kaslr_slide を計算する | 期待されるオフセットと照合して検証する |
| 23 | Privesc | pipe() + configfs_write_once() | install_pipe_physrw() — 安定したパイプベースの R/W | anon_pipe_buf_ops の操作 |
| 24 | Privesc | — | cleanup_main_waiter_pi_state() | ダングリング waiter の PI 状態を修正する |
| 25 | Privesc | — | install_android_root() | current->cred を init_cred で上書きする |
| 26 | Restore | configfs_write_once() | 元の ashmem_fops ポインタを復元する | canon_addr(ASHMEM_FOPS) |
| 27 | Restore | configfs_write_once() | fake_fops の owner フィールドをゼロクリアする | UAF の再利用を防ぐ |
| 28 | Cleanup | close() | ashmem fd をクローズする | 成功 / 失敗を返す |
CyberMeowfia をビルドする
export ANDROID_NDK_HOME=/root/Android/Sdk/ndk/android-ndk-r29 #path_to_ndk
make clean
make PROJECT=tokay-CP2A.260605.012 API=36