
UNFINISHED/WIP - CVE-2026-43499 (IonStack/GhostLock) の Samsung SM-T878U / gts7l 向け研究用POC。トリガーとジオメトリは検証済みだが、root取得はまだ未成功。
[!CAUTION] このプロジェクトは未完成です — まだ動作しません。 2026-10-06 時点で、どのデバイスでも動作する root は存在しません。以下の クイックスタートが成功することを期待しないでください。ビルドや実行の前に 現在のステータスをお読みください。
[!WARNING] ステータス: 作業中 — ring 1 は未到達
- 未達成: SM-T878U における永続的な、あるいは単発の
rootすらも。- 最後に確認された失敗: スタック再利用ペイロードがカーネルの書き込み パスに到達しない。約470回の計測実行を通じて、偽造ロックが
rtmutex.c:585で取得されることは一度も観測されず、したがって ストア*(ASHMEM_MISC_FOPS) = fake_fopsは決して実行されない。- 以前のブロッカー、現在は解決済み: クラッシュフォレンジックは以前、
uid 2000 shellから利用できなかった(/proc/kmsg、/proc/last_kmsg、/sys/fs/pstore、dmesg→ すべてEACCES)。永続的なwrite()+fsync()ログミラー(IONSTACK_LOG_MIRROR)がCONFIG_PANIC_ON_OOPS=yを生き延びる ようになり、パニックした実行でも完全な記録が残る。- 完全な証拠の記録については
docs/RTMUTEX_WEAPONIZATION.md§15.16–§15.18 を参照。
Samsung Galaxy Tab S7 (SM-T878U / gts7l) を対象とした、CVE-2026-43499 (IonStack / GhostLock)に対する純粋な C によるホスト支援型再 root の概念実証。
ランタイムチェーンはネイティブの C/ELF コンポーネントのみを使用する。Android
ターゲット上で Python、Java、DEX、app_process、JVM を必要としない。ADB は
デプロイと検証に使用する。
root は取得されていない。 このセクションは、チェーンがどこまで進んでいるか
についての権威ある最新の記録である(最終改訂 2026-10-06)。以下のすべては
理論ではなく、実機(SM-T878U、T878USQS8DXE1、カーネル
4.19.113-27114284)で測定されたものである。
| ステージ | ステータス | 証拠 |
|---|---|---|
| ターゲット識別 + KASLR リーク | 動作 | [reroot] LEAK_OK kaslr_base=… task=…(perf サイドチャネル) |
CVE トリガー: FUTEX_CMP_REQUEUE_PI → -EDEADLK | 動作 | [*] requeue ret=-1 errno=35 — Linux では EDEADLK == 35 |
バグのあるロールバックが宙に浮いた pi_blocked_on を残す | 上流の修正と一致 | 上流の 3bfdc63936dd は current->pi_blocked_on → waiter->task->pi_blocked_on に変更 |
struct rt_mutex_waiter のレイアウト(4.19) | ソースから検証済み | tree_entry@0x00 pi_tree_entry@0x18 task@0x30 lock@0x38 prio@0x40 deadline@0x48 |
スタックジオメトリ paint == rt_waiter + 0x28 | 4回検証済み(objdump を含む) | rt_waiter = do_futex_sp+0xC0; address = ___sys_sendmsg_sp+0xB8 |
| 永続的なクラッシュフォレンジック | 動作 | IONSTACK_LOG_MIRROR の write()+fsync() 記録がパニック再起動を生き延びる |
| メッセージごとの frag ページ識別タグ | 動作 | reclaim-scan tag=1 sent=8201 range=1..8201 ok=8192 bad=0 dup=0 undecoded=0 absent=9 |
| キュー走査: カーネルはキューに入った 8192 個の frag ページに 0 バイトも書き込まなかった | 検証済み | 256 MB をペイロードとバイト単位で比較、hits=0 |
rt_mutex_adjust_prio_chain が書き込みパスに到達する | 逆アセンブリから検証済み | top_waiter == NULL ⇒ requeue は true のまま ⇒ 664/682/685/716-725 に構造的に到達可能 |
page-dump と45件の ring1-page の観測はすべて
first_diff=8000 (pristine)、owner_cpu=00000000、case1_gate=0、そして
lock_root/lock_leftmost がペイロード値と完全に一致することを報告している。このウォークが
rtmutex.c:585 で fake_lock->wait_lock を取得する様子は
一度も 観測されておらず、したがって
*(ASHMEM_MISC_FOPS) に書き込む唯一の分岐である 664/682/685/716-725 は一度も実行されていない。
_raw_spin_trylock()/_raw_spin_unlock() はアウトオブラインのヘルパーを経由し、このベンダーツリーには
arm64 の queued_spin_unlock オーバーライドが存在しない ため、
wait_lock.val == 1 が信頼できる 585 の証拠であり、
owner_cpu != 0 は二次的な証拠にすぎないことに注意されたい。prctl(PR_SET_MM, PR_SET_MM_MAP, …) でフレームを再利用する。
このカーネルは # CONFIG_CHECKPOINT_RESTORE is not set でビルドされているため、そのシステムコールは
コンパイルから除外されている。また、そのエクスプロイトは sendmsg — 我々の攻撃手法 — を一切使用しておらず、
これが(1)の根本原因である可能性が非常に高い。ring1-read は一度も実行されていない。 リング1の唯一のユーザー空間からの読み戻し
(configfs_read_once(fd, data_addr(ASHMEM_MISC_FOPS), …)) は、キュー走査ゲートの背後にあり、
さらにハーネスの MARKER デフォルトの背後にあるため、8秒早い ring1-page で停止してしまう。
ゲートに到達したすべての実行は、page-dump tag=pre-arm と page-dump tag=post-arm の間で
停止した。664/682/685 が 我々自身のページ内で 完了しうる唯一の構成 —
IONSTACK_FOPS_WAIT_LOCK_WORD=0 かつ
IONSTACK_PAINT_WAITER_TASK_MODE=fake-task — を再実行し、
page-dump tag=post-arm / ring1-lock585 で wait_lock=00000001 を確認する。ring1-read を実行させる: IONSTACK_RECLAIM_SCAN_QUEUE を未設定にし、
MARKER='ring1-read|…' を指定して、ハーネスが ring1-page で停止しないようにする。IONSTACK_RECLAIM_TAG=1 で実行し、
page-dump 内の pipe_tag と msg_tag を比較する。すべてのフラグページはペイロードの
バイト単位で同一のコピーであるため、first_diff だけでは区別できない。IONSTACK_FOPS_WAIT_LOCK_WORD の問いを、適切に設定した条件で再検証する —
IONSTACK_RECLAIM_TAG を一定に保ったまま wlw=0 と wlw=1 を比較する。
以前の相関は、2つの変数が同時に変化していたために交絡していた。res_in/res_out の pselect6 ペイント面を移植する。fops.c:3157 reason=selinux_write ret=-1 errno=22 EINVAL — 依然として未解決。
| ドキュメント | 内容 |
|---|---|
docs/RTMUTEX_WEAPONIZATION.md | rtmutex チェーンの完全な証拠記録 (最大のドキュメント) |
docs/ROOT_CHAIN_THEORY.md | リング0→4のエンドツーエンド root チェーン設計 |
docs/PAINT_ORACLE_ANALYSIS.md | スタックペイントオラクルがそのような読み取り結果になる理由 |
docs/PSELECT_GEOMETRY_FINDINGS.md | 代替ペイント手法としての pselect6 |
docs/RING1_RECLAIM_IDENTITY_2026-10-06.md | メッセージごとのフラグページ識別タグ; キュー走査による検証 |
docs/RING1_585_NEVER_SUCCEEDED_2026-10-06.md | rtmutex.c:585 が一度も成功しなかったことの証明 |
docs/RING1_ORACLE_FIX_2026-10-05.md | オラクルの修正 |
docs/RING1_ORACLE_WRONG_FRAGMENT_2026-10-06.md | 保持されていたフラグメントが誤って特定された理由 |
target-artifacts/ には、デバイス なしで このターゲットを分析するために
必要なすべてのものが含まれている:
/proc/config.gz(生データ + 展開済み)、src/exploit/offset.h 内のすべてのアドレス様定数に対する、ELF 自身のシンボルテーブルとの機械的検証、主要な結果: ELF に埋め込まれた linux_banner はデバイスとバイト単位で一致し(したがって T878USQS8DXE1 / 4.19.113-27114284 が確認済み)、ELF は未ストリップであり、アドレス様の offset.h 定数 27 個中 24 個がシンボルと完全一致し、解決不能は 0 件でした。完全なレポートは target-artifacts/README.md を参照してください。これには 1 つの命名の罠も含まれます: CONFIGFS_READ_FILE_OFF は実際には configfs_read_file ではなく configfs_read_bin_file を指しています。
この POC は、すべてのプロファイルチェックが一致しない限り、意図的にフェイルクローズします:
device: gts7l
Android: 13 / SDK 33
fingerprint: samsung/gts7lsqwnc/gts7l:13/TP1A.220624.014/T878USQS8DXE1:user/release-keys
kernel: 4.19.113
build: T878USQS8DXE1
サポートされていない、または失敗した実行は、デバイスのパニックや再起動を引き起こす可能性があります。リカバリ手段を常に確保しておいてください。
このリポジトリは上記のファームウェアプロファイルに限定された範囲です。汎用的なルート化ツールではなく、オフセットや前提条件を独立した検証なしに他のデバイスで再利用してはなりません。
adb devices -l
次に:
./build/smt878u-ionstack-reroot -s SERIAL --preflight-only
./build/smt878u-ionstack-reroot -s SERIAL --validate-only
./build/smt878u-ionstack-reroot -s SERIAL
ホストが成功を報告したら、root を確認してシェルを開きます:
adb -s SERIAL shell /data/local/tmp/su -c id
adb -s SERIAL shell /data/local/tmp/su
-s SERIAL は、ADB デバイスが 1 台だけ接続されている場合は省略可能です。
要件: