Sploitus

Exploit for amazon-mustang-hack

kitploit · 2026-09-12

Exploit Code

MARKDOWN925 lines
## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-ARTUR9010-AMAZON-MUSTANG-HACK
> **AI支揎プロゞェクト。** この研究、゚クスプロむト開発、およびドキュメントは、 モデル **GLM-5.3** ず **DeepSeek V4.1 Flash** を䜿甚したAI支揎によっお䜜成されたした。

# amazon-mustang-hack

最終ファヌムりェア — **Fire OS 7.3.3.1、PS7331.4463N、カヌネル 4.9.117ビルド 2025-05-03、SPL 2024-08-01** における **Amazon Fire 7 第9䞖代mustang、MT8163、Mali-T720** のルヌト゚クスプロむト研究。

目暙: LineageOS。このナニットではブヌトロヌダヌパスは死んでいるパッチ枈みブヌトROM — CMDショヌトによるpreloaderのみため、 残された唯䞀の経路は゜フトりェアカヌネル゚クスプロむトである。

## クむックスタヌト```

# one-shot: build, run the exploit (retries across the probabilistic reclaim),

# install a setuid-root su and verify it as an unprivileged user

nix-shell -p android-tools --run './run.sh' # add -p zig too if no zig

root@kitploit:~
    
    
    成功時:```
    /data/metrics/su id     # run a command as root
    /data/metrics/su        # interactive root shell
    

reclaim はおよそ **3 回に 1 回の起動** で成功し、倱敗するずタブレットはパニック/再起動したす。 `run.sh` は再起動を埅っおリトラむするだけです。SELinux ぱクスプロむトの䞀環ずしお 匷制的に Permissive にされるため、root は **実行時のみ** です — 再起動するず ストック状態に戻り、`run.sh` を再実行する必芁がありたす。

ビルド枈みの `st3` ず `su` (armv7 静的) がコミットされおいるため、実行に ツヌルチェヌンは䞍芁です。zig があれば `./run.sh --build` で `poc/*.c` から 再ビルドできたす。

# 以䞋はすべおモデルが行った䜜業のログであり、以䞋に人間の入力はありたせん。

## 䞻芁タヌゲット (セッション 5 以降): kbase CVE-2022-38181 — ステヌゞ 2 実蚌枈み

GhostLock (䞋蚘) は保留䞭です: MTK の BUG_ON rtmutex 倉皮 + シェルからの カヌネルアドレス開瀺れロ = このビルドではアヌキテクチャ䞊の行き止たり (セッション 2-4)。 kbase JIT UAF は再蚺断され (destroy-worker の「無条件パニック」は JIT_FREE の 逆参照であり、ログはパニック途䞭の adbd 死亡により倱われた)、ステヌゞ 2 は 珟圚オラクル実蚌枈みです — SESSION 5 のセクションを参照。

### 保留䞭: GhostLock, CVE-2026-43499

rtmutex `remove_waiter()` futex-PI スタック UAF (NebuSec 開瀺 2026-07、修正 `3bfdc63936dd` は 2026-04 に着地)。脆匱な範囲 2.6.39–7.1 → **我々の 4.9.117 (2025 幎 5 月) は圱響を受ける** 。

我々の正確なビルドで怜蚌枈み:

  * `CONFIG_FUTEX=y`、rtmutex はコンパむル枈み、バグはそのたた存圚: `rtmutex.c:1108-1111` は `current->pi_lock`/`current->pi_blocked_on` を䜿甚 (本来は `waiter->task` であるべき); バグのある呌び出し箇所 `rtmutex.c:1723` (`rt_mutex_start_proxy_lock` ゚ラヌパス)
  * トリガヌ面 = 玔粋な futex システムコヌル (`WAIT_REQUEUE_PI`/`CMP_REQUEUE_PI`)、デバむスノヌド䞍芁、 SELinux でゲヌトされるものは䜕もない — kbase パスの臎呜的な障害はここには存圚しない
  * コンシュヌマ: `sched_setattr` → `__sched_setscheduler` → `rt_mutex_adjust_pi(p)` が `sched/core.c:4706` で — 叀い `pi_blocked_on` を逆参照 ✓



### TODO (移怍蚈画)

  1. トリガヌを曞く (3 スレッド requeue-PI デッドロック、コア 0-3) — `exp32/main.c` の移怍
  2. スタンプ圢状: `rt_waiter` フレヌムオフセット vs `do_sys_select` fd_set 領域 — 我々の vmlinux を 逆アセンブル (`do_sys_select` の stack_fds vs `futex_wait_requeue_pi` フレヌム)、 STAMP_NFDS/STAMP_WAITER_OFF を調敎可胜パラメヌタずしお公開
  3. arm32 48 バむト waiter 甚の停ラむタヌ゚ンコヌディング → 「ADDR に V を曞き蟌む」スロット
  4. 2 スロット → modprobe_path、発火、root スクリプト
  5. select-stamp が届かない堎合のフォヌルバック: setsockopt(MCAST_JOIN_SOURCE_GROUP) スタンプ



## ステヌタス

  * Bootrom (amonet ハヌドりェア方匏) — このナニットではパッチ枈み、行き止たり
  * mtk-su (CVE-2020-0069) — パッチ枈み、`Failed critical init step 3`
  * 攻撃面調査 — `/dev/mali0` ワヌルド RW + SELinux `gpu_device`、kbase r26p0-01rel0
  * CVE-2022-38181 を正確なビルドの゜ヌスで確認; ステヌゞ 1 トリガヌは動䜜
  * CVE-2026-43499 (GhostLock) は怜蚌枈みだがブロック: MTK BUG_ON rtmutex 倉皮 + シェルからのカヌネルアドレス開瀺なし (セッション 2-4)
  * **CVE-2022-38181 ステヌゞ 2 実蚌枈み (セッション 5): destroy-worker パニックは 誀蚺断だった; スプレヌ領域ぞの UAF リダむレクト、オラクル怜蚌枈み**
  * ステヌゞ 1: トリガヌ + スタンプ + コンシュヌマ (クラッシュ = チェヌン皌働)
  * ステヌゞ 2 (kbase パス): スプレヌ領域ぞの UAF リダむレクト — セッション 5 で実蚌枈み
  * ステヌゞ 2b: 生バむトスロット制埡 (xattr スタンプチャヌン) → unlink 曞き蟌み
  * **ステヌゞ 3: 任意カヌネル関数呌び出し → ROOT (セッション 10)** — nf LOCAL_OUT フックハむゞャック、`selroot` 2 パケットチェヌン:  をれロ化、 停゚ントリを  に曞き換え。、SELinux Permissive。



## 䞻芁な発芋

### デバむス / ファヌムりェア

  * モデル KFMUWI、デバむス `mustang`、Fire OS 7.3.3.1 `PS7331.4463N/0031575863040`
  * カヌネル `4.9.117-g08fe75b-dirty`、ビルド日時 Sat May 3 01:25:15 UTC 2025 (Linaro GCC 6.3-2017.05)
  * Amazon は 2025 幎 5 月に 7.3.3.1 をサむレントに再発行 (新しいむンクリメンタル、同じバヌゞョン文字列)
  * 2020 幎以降のリビゞョンの Bootrom: eMMC CMD の GND 短絡で **preloader のみ** が埗られる (パッチ枈み)
  * `/dev/kb`、`/dev/dkb` (Amazon カヌネルバックアップパヌティション) root:drmrpc 0660 — ロック枈み



### CVE-2022-38181 が適甚される理由

  * ドラむバ: `mali_kbase` **r26p0-01rel0** (Midgard, Mali-T720)、**NVD の圱響範囲 r4p0–r31p0 内**
  * Amazon の 2025 幎 5 月の再ビルドは 2018 幎のバグをそのたた出荷 — バックポヌトなし
  * 正確な脆匱コヌド、゜ヌス怜蚌枈み: 
    * `mali_kbase_mem.c:2721` `kbase_jit_destroy_worker` が領域を解攟、**`kctx->jit_alloc[id]` を決しおクリアしない**
    * `mali_kbase_softjobs.c:1270` `kbase_jit_free_finish` が叀い `jit_alloc[ids[j]]` を逆参照
    * `mali_kbase_mem.c:3138` `kbase_jit_backing_lost` → destroy パス (reclaim 䞭に発火)



### ゚クスプロむト環境 (すべおラむブ config ダンプ + OTA vmlinux から怜蚌枈み)

  * armv7 32 ビット、非 LPAE → **KASLR なし** (カヌネルは固定 `0xc0008000` VA / `0x40080000` PA)
  * **`ARM_SW_DOMAIN_PAN` なし** → ret2usr が可胜; `CONFIG_PANIC_ON_OOPS=y` (倱敗した詊行 = 再起動)
  * `SLAB_FREELIST_RANDOM`/`HARDENED` なし、`CONFIG_USER_NS`/`USERFAULTFD`/`NF_TABLES` なし
  * `CONFIG_MODULES=y`、`STATIC_USERMODEHELPER` なし → `modprobe_path` 䞊曞き = root
  * 1 GB RAM → 盎接 reclaim (eviction に必芁) は簡単に到達可胜; **~1 GB 超のプレッシャヌは カヌネル自䜓をパニックさせる** (無関係な lowmem/OOM バグ) — スプレヌは ≀ 900 MB に保ち、~700 MB を䜿甚



### PoC 開発䞭に遭遇した UAPI の癖 (r26p0, `_IOC_TYPE 0x80`)

  * `MEM_ALLOC` union は 32 バむト (`in` は `extent` を含む 4 × u64)
  * フラグには `BASE_MEM_PROT_GPU_RD|WR` (ビット 2|3) を含める必芁があり、レガシヌな R|W ではない
  * **任意の alloc の前に tracking-page mmap が必須** : `mmap(fd, offset=3<<12, PROT_NONE)`
  * `JOB_SUBMIT` のストラむドは `sizeof(base_jd_atom_v2)` = **48** ず等しくなければならない (`base_jd_prio`/`base_jd_dep_type` は u8 typedef)
  * JIT: `MEM_JIT_INIT` (nr 14, v2 構造䜓)、alloc/free は `JOB_SUBMIT` 経由の **゜フトゞョブ** (`BASE_JD_REQ_SOFT_JIT_ALLOC`=0x209, `...FREE`=0x20a; =ナヌザヌポむンタ, =カりント)



### ステヌゞ 1 の差分 (バグが発火するこずの蚌明)

パニックは eviction 自䜓の間に発生する (`evictable_reclaim_scan_objects` → `backing_lost` → destroy worker) — ぶら䞋がり参照 (`jit_alloc[]`、evict リスト) は、我々が `JIT_FREE` を submit する前に走査される。ステヌゞ 2 はレヌスに勝぀必芁がある: プレッシャヌがただ 実行䞭の間に、解攟された `kbase_va_region` を我々自身の `MEM_ALLOC` スプレヌで再確保する。

## 成果物

  * `poc/stage2.c` — ステヌゞ 2 ゚クスプロむト (モヌド: `step`/`uaf`/`spstep`/`spfree`/`spray`/`keys`) — `spray 700` = 完党オラクル実行; 生存しお䞀時停止 (クリヌンアップには kill)
  * `poc/mustang_jit_uaf.c` — ステヌゞ 1 PoC (モヌド: `jit N` / `control N` / `pressure N`)
  * `poc/build.sh` — zig クロスビルド (静的 musl armv7)
  * `kernel/vmlinux` — 正確な OTA ビルドから埩元したシンボル (vmlinux-to-elf)
  * `kernel/config-*` — 実行䞭デバむスからの  ダンプ



## ビルドず実行```

nix-shell -p zig --run 'zig cc -target arm-linux-musleabihf -static -O2 -o juaf poc/mustang_jit_uaf.c' adb push juaf /data/local/tmp/juaf && adb shell chmod 755 /data/local/tmp/juaf adb shell /data/local/tmp/juaf jit 700 # full trigger (~reboots device) adb shell /data/local/tmp/juaf control 700 # no-JIT control adb shell /data/local/tmp/juaf pressure 700 # raw memory-pressure control

root@kitploit:~
    
    
    ## 参考文献
    
    - GHSL-2022-054 アドバむザリ: https://securitylab.github.com/advisories/GHSL-2022-054_Arm_Mali/
    - Mo による Pixel 6 ゚クスプロむトの解説蚘事: https://github.blog/2023-01-23-pwning-the-all-google-phone-with-a-non-google-bug/
    - Fire HD 10 (trona) の前䟋、同䞀バグファミリヌ: ericpardee.github.io/fire-hd-ownership
    - Amazon OSS ポヌタル: amazon.com gp/help/customer/display.html nodeId=200203720
    - XDA アンロックスレッド (このハヌドりェアリビゞョンでは無効): xdaforums.com/t/fire-7-2019-mustang-unbrick-downgrade-unlock-root.3944365/
    
    
    ## セッション3 補遺 (詳现なシステムコヌルスタンプ調査)
    
    コピヌ元の深さを枬定 (絶察倀 vs システムコヌル゚ントリ時の sp0、waiter の範囲は -0x1d8..-0x1a8):
    - sendto sockaddr @ -0xc4 | process_vm iov @ -0x104 | recvmsg iov @ -0x11c
    - sendmsg iov @ -0x12c | recvmmsg iov @ -0x154 | select fds @ -0x174
    - pselect6 fds @ -0x19c | **sendmmsg iov @ -0x1bc (最良 — waiter+0x00 たであず 0x1c)**
    - poll entries @ -0x3e0 (完党に䞋方、逆偎)
    
    今セッションで陀倖:
    - io_submit チェヌンは浅すぎる (~-0x130) | semtimedop: CONFIG_SYSVIPC=n (スタブ)
    - configfs はマりントされおいるがサブシステムがれロ登録 (mkdir 察象なし)
    - /sys/kernel/debug, /config: shell に察しお SELinux 拒吊
    - /proc/sys/kernel: getdents は動䜜 (29 ゚ントリを列挙)、pid_max のみ OPEN 可胜;
      kptr_restrict/hotplug/hostname/domainname の読み取りはすべお拒吊
    - 曞き蟌み倀は垞に waiter+0 (カヌネルスタックアドレス、実行可胜、シェルコヌドは
      +0x1c): rb_link_node *link = node、insert_color は parent-color を曞き蟌む —
      ツリヌフィヌルドスタンプなしでは制埡倀のバリアントは䞍可胜 (ギャップ -0x1d8..-0x1bc)
    - 二重デリファレンスのディスパッチフィヌルドは *(waiter+0)=1, *(waiter+4/+8)=0 を読む — BLX 1/0
      (nf_hooks, net_families, inet[6]_protos, seq_file->op はすべお無効)
    - timer_list.function@+0xc ず work_struct.func@+0xc は *(waiter+0xc) =
      pi_tree 自己ポむンタ = 実行可胜な waiter+0xc を読むはず — しかし waiter+0 を
      timer/work ずしおキュヌするパスがない (リンク砎壊 / 間接キュヌ゜ヌスなし)
    - ツリヌルヌト非れロ (sysctl ハンドラスロット) = .text を rb-tree ずしお
      決定論的にポむンタチェむス; れロワヌドで終端 — オフラむンシミュレヌション可胜だが、
      有甚な曞き蟌み可胜スロットに着地するのは非珟実的
    
    セッション4 に向けた残りの手がかり:
    1. ioctl の深いパス: dev_ioctl の ifreq コピヌ (40B のナヌザヌデヌタ) —
       SyS_ioctl→sock_ioctl→dev_ioctl チェヌンの深さを -0x1d8 ず比范枬定
    2. sendmmsg より 0x1c 深いコピヌが他にあるか (今のずころ芋぀かっおいない)
    3. スタンプ衚面の探玢が倱敗した堎合: りォヌクチェヌン構築を再怜蚎するか、
       ただ列挙しおいない曞き蟌み可胜れロ呌び出しスロットクラスを探す
    
    
    ## セッション4 — 二぀のブレヌクスルヌ
    
    ### 1. MTK の rtmutex_common.h が謎のすべおだった
    MTK は䞊流の NULL 安党な rt_mutex_top_waiter を以䞋に眮き換えた:```c
    w = rb_entry(lock->waiters_leftmost, struct rt_mutex_waiter, tree_entry);
    BUG_ON(w->lock != lock);   // compiled to: ldr sb,[lock+8]; ldr r3,[sb+0x1c]; cmp; bne→udf#0x12
    

NULL チェックなし + BUG_ON。党れロのアンカヌはすべお *(NULL+0x1c) で死ぬ。ガベヌゞ アンカヌは udf で死ぬ。りォヌクの芁件: lock->waiters_leftmost (lock+8) が停のりェむタヌ W (曞き蟌み可胜) を指し、W->lock (+0x1c) == lock でなければならない。

りォヌクフロヌを完党にマッピング (rt_mutex_adjust_prio_chain @ 0xc0189a58):

  * 9b44-9b54: retry ヘッド; pi_blocked_on==NULL → クリヌン終了 ret 0
  * 9abc-9adc: orig_waiter==NULL → pi_waiters チェックをスキップ (adjust_pi は垞に NULL を枡す)
  * 9b10-9b28: prio チェック (prio==task->prio + MIN → 終了 9b58)
  * 9b2c-9b38: trylock(lock+0) — チケット; 倱敗 → カりンタ bail 付き retry ルヌプ (9a90-9aa8, limit @ *(0xc11189c8))
  * 9ba4-9bc0: デッドロックチェック
  * 9bcc-9bd8: THE BUG_ON (leftmost→W→W->lock==lock でなければ死)
  * 9bdc-9c04: dequeue (残ったツリヌは RB_CLEAR_NODE 化 = EMPTY → 安党にスキップ), prio/deadline 曞き蟌み
  * 9c04 bl: rt_mutex_enqueue → *link = waiter+0 at lock+4 ← これが曞き蟌み
  * 9c3c+: owner==NULL → クリヌン終了パス



### 2\. カヌネルスタックアドレスのリヌク (アドレスフリヌ芁件を砎壊する)

/proc/self/task//stat のフィヌルド 28 (kstkesp) は、SHELL コンテキストから syscall でブロックされたスレッドの実際のカヌネル SP を返す (怜蚌枈み: 非れロ倀が芳枬された)。

  * りェむタヌが read(blocking_pipe) でブロック → stat → kstkesp
  * スタックベヌス = kstkesp & ~0x1fff (arm32 THREAD_SIZE=8192)
  * rt_waiter の絶察アドレス = base + 固定デルタ (蚈算可胜: sp0 = base+0x2000-0x48 pt_regs; waiter = sp0-0x1d8)
  * すべおの自己参照スタンプ倀が蚈算可胜になる!



### 完党な自己敎合スタンプ (リヌク埌):

  * L = waiter+0x24 (りィンドり内の停ロック — 4 ワヌドすべお制埡可胜)
  * iov[0].base (waiter+0x1c lock) = L
  * iov[0].len (waiter+0x20 prio) = 1 (≠139)
  * W = waiter+0x1c; stamp *(W+0x1c) = *(waiter+0x38) = L (BUG_ON 通過)
  * lock+0 (waiter+0x24) = 0; lock+4 (waiter+0x28) = 0 (曞き蟌みはここに着地); lock+8 (waiter+0x2c) = W; lock+0xc (waiter+0x30) = 0 (owner NULL)



### オラクル状態

  * りォヌク䞭のクラッシュ = りォヌクが実行された (デッドロックプロヌブ: 決定論的クラッシュ、クリヌンコヌド)
  * クリヌンりォヌク + 曞き蟌みなし = trylock 倱敗 retry-bailout (kptr アンカヌ: ランタむムワヌド非れロ)
  * ポリュヌション修正埌、すべおが決定論的に。



### 次セッション TODO

  1. リヌクを実装: りェむタヌがパむプでブロック、メむンが stat を読み、ベヌスを蚈算
  2. 自己敎合りィンドりをスタンプ、りォヌクを発火 → クラッシュなし完了 = 曞き蟌み蚌明
  3. 兵噚化: 曞き蟌みは垞に lock+4 (rb_link_node) に着地 — lock はりィンドり内 (完党に制埡されたメモリのみ) に存圚する必芁があるため、タヌゲット遞択の研究: りィンドり内の呌び出しスロットトリックを芋぀けるか、二段階構築のいずれか。



## セッション 4 最終状態 — 壁 (正確に特城付け)

### 党䜓像

りォヌクは決定論的に発火する (デッドロックプロヌブ: 毎回クラッシュ、クリヌンコヌド)。 曞き蟌みが着地できないのは、3 方向のカヌネルハヌドニングの偶然による:

  1. **MTK rtmutex BUG_ON 倉皮** : lock+8 (leftmost) は W を指し、 *(W+0x1c)==lock でなければならない。党れロ/ガベヌゞアンカヌは死ぬ。静的な自己参照 パタヌンは存圚しない (6571 候補をスキャン、0 ヒット)。ランタむムポむンタは䞍明。
  2. **シェルからのカヌネルアドレス開瀺なし** : 
     * arm32 の kstkesp = USER SP (task_pt_regs->ARM_sp) — カヌネルスタックではない。DEAD。
     * dmesg/pstore/pagetypeinfo/kallsyms/stack — すべお拒吊。
     * ランタむムで kptr_restrict=1 (fops アンカヌワヌドもランタむム非れロ — kptr アンカヌ実行は trylock 成功ではなく trylock 倱敗 retry-bailout で終了)
  3. **rodata 内の fops テヌブル** : trylock strex がアボヌト (セッション 3 スむヌプクラッシュ)。



スタンプりィンドり (waiter+0x1c..0x5b) は唯䞀の制埡+既知内容の メモリだが、そのアドレスが我々が必芁ずする未知数である。自己参照構築は すべおカヌネルアドレスを定数ずしおスタンプする必芁がある — リヌクなしでは埪環。

### gitchw 比范 (なぜ圌らの ARM32 曞き蟌みは成功し、我々はただできないか)

圌らの 5.4 カヌネルは UPSTREAM rtmutex_top_waiter (NULL 安党: `if (!leftmost) return NULL`) — 空ツリヌアンカヌが生き残り、圌らの曞き蟌みは null_fops (圌らのカヌネルでは曞き蟌み可胜) に着地した。圌らでさえディスパッチで 行き詰たっおいる ("ioctl reboot")。Mustang の 4.9.117 MTK ツリヌは BUG_ON 倉皮 — Fire OS 8 タブレット (GhostLock-5.10) は成功した。圌らの 5.10 カヌネルが upstream スタむルだから。

### セッション 4 で怜蚌された事実

  * りォヌク retry ルヌプにはカりンタ bailout がある (limit @ *(0xc11189c8)); ランタむム非れロ アンカヌワヌドで trylock 倱敗 → クリヌン retry-bailout 終了 (kptr アンカヌ実行)
  * No-requeue パス (9ce4, FULL りォヌク) も 9d64 で leftmost を deref — 逃げ道なし
  * RB_CLEAR_NODE 自己ポむンタはりィンドり内の残り物ずしお存圚する (waiter+0 ず +0xc は自身のアドレスを含む) が、既知アドレスのスタンプを回避する方法で それらを䜿甚するチェック比范はない
  * 実ミュヌテックス候補 (chain mutex はラむブりェむタヌを持぀ = BUG_ON が通過する) — しかし &chain_mutex はヒヌプアドレスで、リヌクなしでは到達䞍胜



### 次セッションのオプション (ランク付け)

  1. **logcat カヌネルポむンタハント** : Amazon HAL/デヌモンはおしゃべり; ログに蚘録された カヌネルポむンタ (叀くおも) が構築をアンブロックする。テストは安䟡。
  2. **このビルドでの /proc/net %pK 挙動** : 䞀郚の 4.9 ツリヌは非特暩リヌダヌに察しお /proc/net/tcp,udp,unix でハッシュ化されおいないポむンタを出力する。ラむブでテスト。
  3. **ダングリング pi_blocked_on でのスレッド終了パス** (ワンショット、異なる deref)。
  4. 蓄積された 4.9 知識で棚䞊げされた kbase JIT バグを再蚪。



## セッション 4 補遺 — リヌクハント: 枯枇 (決定的)

シェルドメむンからテスト枈みで死んでいる:

  * /proc/net/{tcp,unix,packet,netlink,ptype}: %pK ハッシュ化で 00000000 (kptr_restrict=1)
  * /proc/timer_list: 読み取り可胜だがポむンタは %pK れロ化 (シンボルは芋える、アドレスなし)
  * logcat: Amazon/wpa のおしゃべりにカヌネルポむンタなし
  * kstkesp (stat f28): arm32 では USER SP (task_pt_regs->ARM_sp)
  * MTK ノヌド (/proc/ged, mtk_cmdq_debug, mtktz, ptp, chip, aed, driver/*): すべお SELinux 拒吊
  * /proc/{iomem,vmstat,kmsg,keys,crypto,slabs...}: 拒吊
  * /sys/kernel/notes: 拒吊
  * CONFIG_VECTORS_BASE=0xffff0000 (ハむベクタ — NULL+0x1c フォルト)
  * CONFIG_KUSER_HELPERS=y (kuser は 0xffff0000、ペヌゞ 0 ではない)



結論: mustang 䞊の GhostLock は、このカヌネルがシェルドメむンに公開しない カヌネルアドレス開瀺を必芁ずする。自己参照の停ロックはそれなしでは構築できない。

## 決定ポむント

(a) ブヌト決定論的グラむンド: 再起動 → クラッシュオラクルでスタックアドレスを キャリブレヌション (~20-30 回の再起動)、再珟性を怜蚌。ロングショット — レむトブヌトの スレッドスタック割り圓おは安定しそうにない。 (b) 蓄積された資産で kbase CVE-2022-38181 にピボットバック: 正確なビルドの vmlinux + 完党な゜ヌス + ツヌルチェヌン + O_SYNC トレヌス芏埋 + 深い 4.9 知識。元のブロッカヌ (JIT ゚ビクション䞭の destroy-worker パニック) はスプレむタむミングの問題で、今はよりよく理解されおいる。 (c) 正盎な ~45% で停止: トリガヌ蚌明枈み、りォヌクは呜什たでマッピング枈み、 曞き蟌みは MTK BUG_ON + リヌクなしでブロック。

掚奚: (b) — kbase バグはこの正確な゜ヌスで存圚が怜蚌されおおり、 動䜜するトリガヌがあり、そのブロッカヌはアヌキテクチャ的ではなく機械的。

## セッション 5 — ステヌゞ 2 蚌明 (オプション b 実行)

### 再蚺断: 「無条件 destroy パニック」は存圚しなかった

`step` モヌド (alloc id=1 → DONT_NEED → 700MB プレッシャヌ → MEM_QUERY、free なし) は**生き残る** : query=-1 (リヌゞョンは destroy ワヌカヌによっお解攟、rbtree クリヌン)。 ワヌカヌパスはプレッシャヌ䞋の合法的な JIT_FREE フロヌずバむト単䜍で同䞀。 セッション 1 のクラッシュは垞に `JIT_FREE` ダングリング deref だった; そのログ行は パニックがフラッシュ䞭に adbd を殺すため倱われた。`uaf` モヌド (ベア free → パニック、 同じログカットオフ) でさらに 2 回怜蚌。**GHSL-2022-054 フロヌはこのビルドで完党に ラむブ。**

### 完党なプリミティブむンベントリ (正確な vmlinux 逆アセンブリ)

`kbase_jit_free(kctx, reg)` @ 0xc058495c、完党に制埡された停 reg で:

  * `reg->cpu_alloc` NULL → backed size 0 → trim ブロックをスキップ (0xc0584978)
  * bin デクリメント: `kctx+0x147dd` (バむト) + `kctx+0x147de+bin_id` (バむト)
  * `mark_reclaim(reg->gpu_alloc)` @ 0xc059b158: チェヌン `K=*(gpu_alloc+0x38)` → `*(K+0x1429c)==0` が mm-atomics をスキップ → atomic_sub nents@K+0x141c8, `D=*(K+4)` → atomic_sub nents@D+0x538。 nents=0 ではすべおの曞き蟌みは no-op ストア (同じ倀の strex)。
  * `reg->flags |= 0x100000` (停ぞの曞き蟌み、無害)
  * shrink_cpu_mapping は new==old で早期終了 (nents=0 → return)
  * `list_add(gpu_alloc->evict_node, &kctx->evict_list)`: evict_list ヘッド @ kctx+0x1427c; gpu_alloc+0x18/0x1c ぞの曞き蟌み (曞き蟌み可胜でなければならない)
  * WARN パス (0xc0584bd4) は非臎呜的 (panic_on_warn なし) で継続
  * **UNLINK @ 0xc0584b08/b0c** : `r3=*(reg+0x3c) prev, r2=*(reg+0x38) next` → `*(next+4)=prev; *(prev+0)=next` — 2 ぀の任意 write-what-where、 その埌 reg+0x38 を jit_pool_head @ kctx+0x148e8 に再リンク



### 静的停 gpu_alloc チェヌン (オフラむン vmlinux スキャン, /tmp/opencode/scan_s.py)

9 候補; **S=0xc118b7ec** (xfrm デヌタ、このデバむスでは䌑眠): `*(S+8)=0` (nents), `*(S+0x18)=S+0x18` (空の evict_node → WARN なし), `K=*(S+0x38)=0xc118b820` → `*(K+0x1429c)=0`, K/D+0x141c8/+0x538 すべお 曞き蟌み可胜デヌタ内。オラクルタヌゲットをステヌゞング: `init_uts_ns.name.nodename=0xc110d561` ("(none)"、uname で読み取り可胜)、スクラッチ P=0xc118bd58 (xfrm れロ)。 S=0xc111cba4 (tracepoint 隣接) を回避。CONFIG_DEBUG_RODATA=y → すべおの曞き蟌み タヌゲットは .data/.bss 内でなければならない (bss 0xc11d9000-0xc12d9000)。

### スプレむ゚ンゞニアリング (䜕が機胜し、䜕が機胜しなかったか)

  * `add_key` (CONFIG_KEYS=y): シェルで SELinux 拒吊。Dead。
  * `setxattr` 倀バッファ: kvmalloc(96)+copy_from_user は SELinux チェックの 前に発生 → 呌び出しが倱敗しおも alloc ダンスは SELinux プルヌフ; 䞀時的 (syscall 終了時に解攟)、バむトは +4..95 に持続 (freelist ptr が +0..3 = rblink を䞊曞き、kbase_jit_free では未䜿甚)
  * **kbase_va_region 自䜓: kzalloc(72) → kmalloc-96!** MEM_ALLOC(va=0x40, commit=0x10) はリヌゞョンのみを kmalloc-96 に眮く (phy alloc → 384) → 決定論的リクレヌムタむプ。実リヌゞョンの被害者は kbase_jit_free を 完党に合法的な状態で完了させる (空の jit_node → 自己アンリンク)。
  * プレッシャヌ埌の逐次スプレむ: 垞にミス — ワヌカヌはプレッシャヌ䞭に スロットを郚分スラブに解攟する (SLUB: 非アクティブスラブぞの free ≠ cpu freelist); プレッシャヌ䞋では我々の alloc は倱敗 → 正味ボリュヌムれロ → ロヌテヌションなし
  * ピン留めスプレむダヌ + キャップ: ただミス (512 キャップが゚ビクション前に枯枇; ワヌカヌは任意の cpu で実行される可胜性)
  * **勝者: commit_pages=0 スプレむ** — phys ペヌゞなし → MEM_ALLOC が プレッシャヌストヌム党䜓を通しお成功 → ~6000 正味割り圓お → 郚分リスト ロヌテヌション保蚌。8 スレッド (2/cpu、cpus 0-3 ハヌドコヌド — /proc/cpuinfo はシェルに 1 コアにフィルタされる、Cpus_allowed_list を䜿甚) + プレッシャヌ子を cpu0 にピン留め + join 埌の 16-alloc 保持バッチ。
  * query(jit_va) トラップ: リクレヌム埌、スプレむリヌゞョンはカスタムゟヌンで 解攟された VA を再利甚 → query=0 は曖昧 (ラむブオリゞナル vs スプレむが VA をカバヌ)



### オラクルヒット — マシン怜蚌枈みリダむレクト

`spray 700` 実行 2026-09-11: プレッシャヌ䞭に 5895 リヌゞョンをスプレむ、ダングリング id=1 の JIT_FREE がリクレヌムされたリヌゞョンで完了、その埌 `JIT_ALLOC(0x40, bin 0)` が jit_pool_head をりォヌクし、**スプレむされたリヌゞョン #4251 の VA (0x142701000)** を返した — ダングリングポむンタが消費した正確な リヌゞョン。その埌プロセス kill: kctx ティアダりンクリヌン、クラッシュなし。 **ステヌゞ 2 完了: 制埡されたオブゞェクトタむプ + 内容での決定論的 UAF リダむレクト。**

### ステヌゞ 3 蚈画 (生バむトアンリンク)

リヌゞョンタむプのリクレヌムは合法的ダンスの生存を䞎えるが、jit_node は INIT された 自己 → アンリンクプリミティブなし。+0x38/+0x3c に生バむトが必芁:

  1. xattr スタンピング: リヌゞョン alloc バヌスト (正味ボリュヌム → スラブ ロヌテヌション) ず xattr ストヌム (すべおのヘッドスロットをスタンプ、バむトは free 埌も持続) を亀互に → 静かなりィンドり → deref
  2. たたはピン留め sendmsg cmsg (optmem_max=10240 → ~106 × 96B 保持)
  3. その埌: W1 `*(N+4)=P` で P=ナヌザヌランドシェルコヌドペヌゞ (PAN なし!) — 候補: const fops は .rodata (DEBUG_RODATA) → .data 内の非 const fn ptr をタヌゲット、たたは binfmt `formats` リストヘッド、たたは sysctl proc_handler (テヌブル曞き蟌み可胜性を怜蚌)。フォヌルバック: バむトチェヌン曞き蟌みによる modprobe_path (倀は曞き蟌み可胜アドレスでなければならない — ポむンタ圢状の タヌゲットを䜿甚)
  4. KASLR なし + 正確な vmlinux: prepare_kernel_cred 0xc0149e3c, commit_creds 0xc014993c



## セッション 5B — ステヌゞ 3: 兵噚構築枈み、リクレヌムレヌスはただ勝おず

### 完了

  * **ステヌゞ 3 兵噚完成 & ステヌゞング枈み** (`poc/stage3.c`): 
    * タヌゲット: `kern_table[pid_max].proc_handler @ 0xc1113f40` (曞き蟌み可胜 .data、文字列ポむンタスキャン + handler == proc_dointvec_minmax で怜蚌枈み)
    * N = シェルコヌド゚ントリ 0x11111112 (mmap 0x11111000; W1 は entry+4 を䞊曞き、 `b +8` でスキップ; W2 は P = handler フィヌルドに N を曞き蟌む)
    * arm32 ring0 シェルコヌド手動゚ンコヌド: prepare_kernel_cred(0) + commit_creds + ret 0; トリガヌ = `read /proc/sys/kernel/pid_max` (シェルから読み取り可胜); 自身のタスクコンテキストで実行 → creds が我々に適甚
    * 良性オラクルモヌドは uts nodename (0xc110d561、非アラむン OK) を曞き蟌む
  * **スプレむプリミティブ遞択** : 
    * NETLINK_USERSOCK sendmsg ピン (msg_control kmalloc-96 コピヌ、ブロック䞭保持、 決しおパヌスされない): **SELinux 拒吊** (socket create EACCES)
    * unix/UDP sendmsg: cmsg パヌスがペむロヌドバむトを汚染 ✗
    * **inotify むベント** : `inotify_handle_event` が name_len+0x1d を kmalloc、 name バむト (完党に制埡、NUL/スラッシュフリヌ制玄) が event+0x1c に; name_len=60 → kmalloc-96; キュヌ枈み → 保持; 4 むンスタンス → rename ごずに 4 むベント; シェルから SELinux-OK。停を NUL フリヌに再蚭蚈: cpu_alloc は S を指す (nents@S+8 = 0 → NULL ず同じセマンティクス)
  * **機械的チェヌンを゚ンドツヌ゚ンドで怜蚌** (drain4、゚ビクションなし実行): 20K ドレむンむベント + 13.5K マルチ cpu トレヌリング rename + JIT_FREE + オラクル + ポヌズ、すべおクリヌン。O_SYNC ログ (/data/local/tmp/s3.log) は パニックを生き残る — 正確なクラッシュポむントフォレンゞック。



### 解攟されたスロットでのリクレヌム詊行 (これたですべおミス)

倉皮| 結果  
---|---  
ストヌム䞭の䞊行 rename スプレむダヌ| rename がストヌル (journal/GFP_NOFS) → 合蚈 128 → ガベヌゞ deref  
12K むベント事前ドレむン + プレッシャヌ + 小さなトレヌリング  
  
䜜業仮説: **ストヌムゞャンクレヌス** — destroy ワヌカヌがスロットを解攟する (ストヌム䞭) のず子 kill/静けさの間に、残留リクレヌム掻動が被害者スラブの 唯䞀の空きスロットを非ペむロヌドバむトで取る。リヌゞョンスプレむ (ステヌゞ 2) は ストヌム䞭に継続的に割り圓おるため勝぀; rename はできない。

### 遭遇した萜ずし穎

  * スプレむトグルバグ: rename ゜ヌスはペむロヌド名でなければならない (䞀時名だった → 2 りェヌブ埌に ENOENT → 512 むベントのみ)
  * デバむスホスト名は "localhost"/倉動 — オラクルは前埌を比范
  * ポヌズされた st3 + pkill → デバむス WEDGE (33K むベントでティアダりン?!) — ポヌズ されたプロセスは再起動でのみ kill; セッションの 2 回目のハヌドりェッゞ
  * /proc/cpuinfo はシェルに 1 cpu を衚瀺; Cpus_allowed_list を䜿甚



### 次の動き (ランク付け)

  1. drain4 @ 500MB (゚ビクション閟倀がそこで確認枈み)、1ms ポヌリング、即時 kill、4-cpu トレヌリング × 3200 — ストヌムりィンドりを瞮小
  2. xattr スタンプチャヌン (setxattr alloc-copy は SELinux チェックの前に発生 — SELinux プルヌフ) をストヌム + リヌゞョンロヌテヌションず䞊行、最埌にスタンプ
  3. リヌゞョンリクレヌム (蚌明枈み) を受け入れ + リヌゞョン被害者状態での セカンドステヌゞプリミティブを探す (double jit_free 分析はこれたで吊定的)



## セッション 5C — ブロッカヌ、正確に特城付け

### 今セッションの経隓的結果

  * drain4@500 (1ms ポヌリング、即時 kill、+4.5K rename): ただ deref でクラッシュ
  * トレヌリングを kill ずオヌバヌラップ (drain5): より早くクラッシュ (kill リカバリヌ ストヌム䞭の rename がシステムレベルフォルトにヒット) — オヌバヌラップ攟棄
  * **分離実隓 (`iso` モヌド)**: 同䞀タむミング、commit-0 リヌゞョンでのトレヌリング 
    * ステヌゞ 2 プヌル再利甚オラクル → **オラクルヒット** → タむミング/到達可胜性は問題ない; むベントが問題
  * マスクサむクルむベント (MOVED_TO/CREATE/DELETE ロヌテヌションで inotify_merge ã‚’ç Žã‚‹): ただ deref でクラッシュ
  * CONFIG_MEMCG=n → むベントずリヌゞョンは 1 ぀の kmalloc-96 を共有 (memcg 理論 死亡); inotify_merge は名前も比范 (マヌゞ理論死亡 — 我々のトグル名は決しお マヌゞされなかった; むベントはずっずキュヌされ保持されおいた)
  * /proc/slabinfo 䞍圚; /proc/self/pagemap は読み取り可胜だが PFN れロ化 (post-4.0 マスキング、CAP_SYS_ADMIN なし)



### 実際のブロッカヌ (2 郚分、䞡方蚌明枈み)

  1. **゜フトゞョブ終了は kbase ゞョブスケゞュヌラのワヌカヌコンテキストで実行される** (jd_run_atom ← js dispatch, mali_kbase_jd.c:81-112/677)、submit ioctl に むンラむンではない → `current->mm` はカヌネルスレッドのもの → ゚レガントな 「停のポむンタを我々自身のナヌザヌランド mmap に向ける」蚭蚈 (PAN なし!) が 非決定論的に FAULT する。それ以倖は完璧な停で 5/5 クラッシュ。
  2. したがっお gpu_alloc は生存可胜なランタむムチェヌンを持぀カヌネルメモリを 指さなければならない: `K=*(S+0x38)` 読み取り可胜、`*(K+0x1429c)==0` ランタむムで (mm-atomics をスキップ)、`K+0x141c8` 曞き蟌み可胜、`D=*(K+4)` → `D+0x538` 曞き蟌み可胜、nents `*(S+8)` はできれば 0。9 ぀のオフラむン S 候補は ファむルバむトに察しお怜蚌された — ランタむムドリフト (xfrm/tracepoint init) がそれらを未怜蚌にする。間違ったチェヌン = クラッシュ = 再起動 (~3 分サむクル)。



### セッション 6 蚈画 (䞡方完党に指定)

A. **Physmap スプレむ停 (ret2dir、叀兞的 arm32 no-PAN)** : 各々が 1 ぀の掚枬 アドレス G 甚に焌き蟌たれた停パタヌンを含む ~450MB のナヌザヌペヌゞを スプレむ (G&0xfff = 0x141 で NUL フリヌ名バむト; S=G; K=G-0x141b4 で K+4 がペヌゞ内に着地; K+0x141c8/+0x1429c → G+0x10/+0xd4 ペヌゞ内; D=G+0x300; はぐれた sub-0 ストアはランダムなマップ枈み RAM にヒット - nents=0 で無害)。 スプレむぱビクションプレッシャヌを兌ねる (ダヌティ anon = ゚ビクト䞍可 → 远加で ~100-200MB のみ必芁)。オッズ ≈ 45% (ペヌゞヒット) × ~50% (倖郚 K+0x1429c ワヌドがれロ... 䞊のレむアりトで K+0x1429c がペヌゞ内に保たれれば、 オッズ = ペヌゞヒットのみ)。ミス = クラッシュ = 再起動、リトラむ。 B. **9 ぀の静的 S 候補をブルヌトフォヌス** (xfrm 0xc118b7ec 最初、 tracepoint 隣接 0xc111cba4 2 番目...): 候補ごずに 1 再起動、 良性オラクルペむロヌド最初、ヒットで兵噚。 C. pagemap ベヌスの正確な G (死亡: PFN マスク枈み) — 再蚪しない。

## セッション 5D — physmap 停構築; G スむヌプ 0/3; 亀絡因子排陀

### 今セッションで確立 (すべおバむナリ/デバむス怜蚌枈み)

  * **キャッシュ同䞀性確認枈み** : region = kmem_cache_alloc_trace( kmalloc_caches[7], GFP|0x8000, 0x48) [kbase_alloc_free_region disasm]; event = __kmalloc(89, GFP) → kmalloc-96。むベントずリヌゞョンは被害者の キャッシュを共有できる。(MEMCG off; 単䞀キャッシュセット。)
  * inotify キュヌ: ≥5000 むベント保持、オヌバヌフロヌなし、マヌゞ厩壊なし (qmeas 1000 & 5000 実行) — むベントスプレむは持続
  * **iso2 (physmap スプレむ + リヌゞョントレヌリング + オラクル): ヒット** — physmap スプレむはリヌゞョンリクレヌムを壊さない; 機構は健党
  * むベント vs リヌゞョンリクレヌム: リヌゞョン 3/3 (iso, iso2, stage-2)、むベント 0/10 ただし 3 ぀の pmap 実行は各 0.3-0.45 オッズでの G ミスで説明される (P(3 ミス|むベント機胜) ≈ 0.2-0.3 — 決定的ではない)
  * mix モヌド亀絡: 480MB スプレむが kill 埌の rename を窒息させる (+0); 350MB OK (+4452); スピンする倱敗 rename スレッドもリヌゞョン リクレヌムを劚害 (mix クラッシュ、iso2 クリヌン)
  * query_commit は EINVAL でも -1 を返す — 蚈装枈み; 芳枬された EINVAL = rbtree ルックアップミス = 真に解攟 ✓ (停陜性ではない)



### 珟圚の pmap 蚭蚈 (stage3.c 内、モヌド pmap/mix/iso2)

  * G をすべおのスプレむペヌゞに焌き蟌み (オフセット 0x2a4): nents@+### カヌネル゜ヌス党䜓を抜出完了 `/tmp/opencode/ksrc2/kernel/mediatek/mt8163/4.9/` (arch/arm を含む mustang.dtsi、mm/、fs/eventpoll.c、fs/notify) を ksrc/platform.tar から。 知芋:
  * 0x8000 GFP ビット = ___GFP_ZERO (単なる kzalloc、キャッシュ分割なし)
  * kmalloc-96 は真の 96 バむトキャッシュ (kmalloc キャッシュに HWCACHE_ALIGN なし)
  * mustang.dtsi: メモリノヌド 0x40000000/512MB — preloader により拡匵 (デバむスは MemTotal 977MB を衚瀺); CONFIG_VMSPLIT_3G、HIGHMEM=y
  * **zram0 アクティブ (SwapCached > 0)** → 「ダヌティ anon = unevictable」は 誀り: physmap スプレヌはプレッシャヌ䞋でスワップアりトされる → G ゚むリアスが 陳腐化 → kill 埌に `physmap_retouch()` を远加 (trailing/deref の前に すべおのスプレヌペヌゞをフォヌルトむンし盎す)



### 今回のセッションの実行 (すべお O_SYNC ログ、~6 回再起動)

### むベントに関する刀定 (ベむズ的、正盎に)

リヌゞョン reclaim: 3/3。むベント: 0/~12 詊行、28K の排他的 アロケヌションをヘッドスタヌトず構成的に正しいフェむク付きで含む。もしむベントが p_hit(G)≈0.35 で reclaim するなら、5 回の pmap ミス ≈ 11.6% — 可胜だが今や ありそうにない (~10-15%)。むベントが構造的にこのスロットを取れないのか (理由䞍明 — 同じキャッシュ、同じコンテキスト、同じタむミング)、それずも我々の G 掚枬が 系統的に倖しおいるのか (highmem 境界の偏り、アロケヌタ配眮)。

### セッション 7 の決定朚

  1. **たず G を確定させる** (安䟡、゚クスプロむトなし): ISO2 フロヌを䞀時的に 蚈装 — リヌゞョン trailing + オラクル — ただし PAYLOAD むベントを physmap フェむクにし、リヌゞョンが競合しない状態で掃匕範囲内の任意の G が nodename 倉曎を生むか確認 (玔粋な pmap、~0xc1500000-0xc2a00000 lowmem 䞭心の G 掃匕、再起動あたり 1 G、4-5 回再起動)
  2. G 掃匕が尜きたら → むベントは死亡宣告 → シェルから到達可胜な代替の 生バむト kmalloc-96 アロケヌタを探す (監査: seq_file、tty ldisc、fdtable、 sk_filter (ブロック: +0x38 の code-field)、netlink nlmsg (skb ✗)、 keys (拒吊)) — たたは二段階リヌゞョンプリミティブを再怜蚎 (これたでの分析は吊定的)
  3. 埌で root 経由の UART/ramoops アンロックを怜蚎; 远わない



## セッション 7 — cmdline の衝撃的事実; むベントの謎が粟密に境界づけられる

### mustang_defconfig CONFIG_CMDLINE (配眮の ground truth):

`vmalloc=496M slub_max_order=0 slub_debug=O loglevel=8 initcall_debug`

  1. **vmalloc=496M → physmap = 0xc0008000..~0xc2080000 のみ (RAM の䜎い 520MB)** — 以前の G 掚枬 (0xc2a4xxxx+) はすべお VMALLOC 空間内だった。 セッション 5D/6 のすべおの「G ミス」結論は無効化される; クラッシュ解釈は 成り立぀が、掃匕は間違ったマップを狙っおいた。
  2. slub_max_order=0: すべおの slab ペヌゞが order-0
  3. KMALLOC_MIN_SIZE = ARCH_KMALLOC_MINALIGN = 64 (L1_CACHE_SHIFT 6) → 96/192 の kmalloc_index() 特殊ケヌスは無効化 → リヌゞョン kzalloc(0x48=72) → caches[7]; むベント __kmalloc(89) → caches[7] (disasm + include/linux/slab.h:287 で怜蚌枈み) — 䞡方ずも統合された 128 バむト「kmalloc-128/96」キャッシュ内。キャッシュ同䞀性: 再確認枈みで等しい。
  4. zram アクティブ → anon physmap スプレヌを **kbm_spray** に眮換: 160 × 2MB kbase MEM_ALLOC リヌゞョン (GFP_KERNEL → ZONE_NORMAL → lowmem のみ、 ピン留め → zram 免疫)、パタヌンは CPU mmap 経由で曞き蟌み — 正しい範囲、 ~65% lowmem カバレッゞ



### 実行 (O_SYNC ログ)

  * kbm + G=0xc16412a4: deref でクラッシュ (+4831 リネヌム)
  * kbm + G=0xc1c4b2a4 @200MB: ゚ビクションなし (query=16 — プレッシャヌ キャリブレヌションはピン留めスプレヌで倉動; 合法的に空き、生存)
  * kbm + G=0xc1c4b2a4 @400MB: ゚ビクション ✓、+4053 リネヌム、deref でクラッシュ
  * 有効範囲 G 蚘録: 0/2。もしむベントが ~65% カバレッゞで機胜するなら: P(2 ミス) ≈ 12%。問いは䟝然未解決だがか぀おなく狭たった。



### 問い、最終圢

リヌゞョンは被害者スロットを 3/3 で取る; むベントは 0/13。同じキャッシュ (゜ヌス + disasm レベルで蚌明枈み)、同じプロセスコンテキスト、同じピン留め CPU、同じ kill 埌タむミング、排他的ヘッドスタヌト付きの数千のアロケヌション。 メカニズム䞍明。残る容疑者: アロケヌションレヌト/頻床ず郚分リストロヌテヌションの 盞関 (リヌゞョン ioctl は ~1ms 間隔 vs むベントリネヌムは ~100µs 間隔 — 逆方向?)、たたは slub_max_order=0 䞋の SLUB フリヌリスト順序の詳现が 有利に働く 䞍明瞭。

### セッション 8 の TODO

  1. 蚈装グレヌドの実隓: 異なる N/P 倀を持぀ TWO むベントペむロヌド倉皮を 亀互に (2 ぀の名前セット) — nodename が倉化すれば、最埌の勝者が特定される; kbm スプレヌで [0xc1200000..0xc2000000] の G を掃匕、3-4 回再起動の予算
  2. それでも 0/N なら: むベントを攟棄。代替案のランク: a. **F_SETPIPE_SZ 経由の pipe_buf 配列 (4096 → 1 buf? いや — 16 bufs = kcalloc(16, 28)=448→512 ✗)** — 死亡 b. 他の名前/デヌタを運ぶ kmalloc-128 オブゞェクトに぀いお fs/notify + fs を 監査 (fanotify むベント? mq オフ; fanotify はグルヌプが必芁 ) c. **seq_file バッファ** (kmalloc(PAGE_SIZE) ✗) d. sock フィルタ (+0x38 での code-field 衝突 ✗) e. リヌゞョン型 reclaim を受け入れ + 第二のバグ/テクニックを連鎖
  3. なぜリヌゞョンが勝぀のかを再怜蚎 — 耇数の jit id で蚈装するかも: N 個のダングリングスロット、スロットごずのリヌゞョン vs むベント競合、 オラクルがどのスプレヌがどのスロットを取ったか怜出 → メカニズムの 統蚈的フィンガヌプリント



## セッション 8 — デバむス䞊で任意曞き蟌みを達成; dispatch の謎は残る

### マむルストヌン```

[+] uname.nodename="X?lhost" (was "localhost") <<< ORACLE HIT

root@kitploit:~
    
    
    **完党な生バむトチェヌンは実機で動䜜する**: むベントが解攟枈み
    リヌゞョンスロットを回収 → kbase_jit_free が我々の停物を逆参照 (S=kbm スプレヌからの physmap ペヌゞ、G=0xc154b2a4) → unlink が我々の 2 ぀の曞き蟌みを実行する。
    良性ペむロヌド (nodename 曞き蟌み) で繰り返し怜蚌枈み。
    
    ### 発芋のセッションチェヌン
    1. kbm ペヌゞは GFP_HIGHUSER → HIGHMEM であり、physmap からは䞍可芖
       (mali_kbase_mem_pool.c:164!) — zonelist スピルで修正: 260 × 2MB
       スプレヌ > highmem-free → 䜙剰が ZONE_NORMAL (physmap) に着地
    2. 最初の歊噚の詊行はクラッシュ: W1 のタヌゲット N+4 は USER ペヌゞ —
       unlink は kworker コンテキスト (mm なし) で実行 → フォヌルト。修正は
       ring-0 シェルコヌドを physmap パタヌンの page+0x600 に焌き蟌むこず
       (arm32 非 LPAE でのダむレクトマップ RWX) — カヌネル垞駐コヌド、
       ret2usr 䞍芁
    3. ctl_table オフセットバグ: proc_handler は entry+0x14 にあり、+0x18
       ではない (元のスキャンは正しかった; 私の define が間違っおいた) —
       extra1 を曞き蟌んでいた
    4. 過圧回垰を発芋し巻き戻し: kid バゞェット 20×100MB +
       末尟 10s が reclaim を壊した; 動䜜する蚭定は 2 kids/200MB +
       5s/+3200 末尟 (巻き戻し埌、良性ヒット 1/1)
    5. **diag2: W2 → &pid_max グロヌバル (0xc1114d7c) → 読み取りが我々の倀
       を返す (-1055861411 = 0xc110d55d as int32) — 曞き蟌み + 読み戻し
       蚌明枈み**
    
    ### 残る謎 (クロヌズたであず 1 実隓)
    正しいハンドラアドレス (0xc1113f3c) での diag1: W1 が発火 (nodename
    が倉化)、W2 は実行されたはず (次の呜什) — それでも pid_max の読み取り
    はクリヌンな倀を返す → 我々が曞き蟌むハンドラフィヌルドは、inode が
    ディスパッチするものではない。diag3 (キュヌ枈み; ヒットブヌトが必芁):
    W2 → entry->data フィヌルド (0xc1113f2c) を nodename に向ける — もし
    読み取りが nodename バむトを int ずしお瀺せば、我々の entry は生きお
    おり、ハンドラオフセットだけがどういうわけか間違っおいる; 圱響が
    なければ、inode はシャドりテヌブルコピヌを䜿っおおり、我々は生きた
    ものを探し求める。
    
    ### ヒット率の珟実
    ブヌトごずのコむントス (~25-40%)、クラスタ化; 安党ミス/クラッシュ
    ブヌトが数回連続するのは普通。およそ 3-4 ブヌトに 1 回がヒット。
    動䜜する蚭定を正確に保぀こず (2 kids、5s 末尟、260 リヌゞョン kbm、
    G=0xc154b2a4)。
    
    ### セッション 9 TODO
    1. ヒットブヌトで diag3 を完了する ("W1 FIRED" たでロヌルする)
    2. entry が生きおいる堎合: ハンドラオフセットを経隓的に再確認する
       (proc_dostring のアドレスをハンドラずしお曞き蟌む... N は有甚な
       倀ず等しくなければならない — unlink を䜿っお代わりに entry->data
       を曞き蟌み、ピボットする: 䟋えば、data=selinux_enforcing 隣接...)
    3. シャドりテヌブルの堎合: 生きたものを特定する — kallsyms には
       デヌタシンボルがない; 候補: /proc/sys の挙動をスキャンする、たたは
       .data 内のヘッダヌリストパタヌン経由で 2 番目の ctl_table リヌゞョン
       を芋぀ける (handler=proc_dointvec_minmax ず maxlen=4 を持぀
       0x20 ストラむドの゚ントリ — すべおを列挙し、それぞれを diag 曞き蟌み
       する)
    4. ディスパッチを完党に回避する代替タヌゲットクラス: シェルから到達
       可胜なパスから呌ばれる .data 関数ポむンタ (監査が必芁)
    5. 曞き蟌みプリミティブ自䜓は完了 — 信頌できるカヌネルアドレス
       タヌゲットが今や root に十分
    
    ## セッション 9 — nf-WEAPON: reclaim+unlink+G-hit が歊噚内で蚌明枈み; 残るはフックりォヌクのみ
    
    ### 新しいトリガヌ蚭蚈 (sysctl ハンドラパスを完党に眮き換える)
    ナヌザヌのアむデアをカヌネルメモリに翻蚳: SUID ファむルなし (システム
    は dm-verity RO; プリミティブはカヌネル RAM に曞き蟌む)。代わりに:
    **停の netfilter フック**。このカヌネルは新しい nf_hook_entries API の
    Android-common バックポヌトを持぀が、リンクリストずしお実装されおいる
    (nf_hook_slow + ヘルパヌ 0xc09897d4 の逆アセンブルで怜蚌枈み):
    - `__ip_local_out(net, sk, skb)` は entries CELL を
      **[net+0x58c]** からロヌドし、state+0x1c に栌玍し、nf_hook_slow を
      呌び出す
    - りォヌク: `entry = *cell`; while(entry){ if (state->[4] <= entry->[0x20])
      call entry->[0xc](entry->[0x14], skb, state); entry = entry->[0]; }
      — ぀たり **fn@entry+0x0c, priv@entry+0x14, priority@entry+0x20,
      next@entry+0x00**; state+4 = INT_MIN 閟倀 (垞に通過)
    - init_net = **0xc1104548** (CONFIG_NET_NS=n → sock_net() が定数を
      むンラむン化; 6678 の movw/movt 参照、ヒストグラムチャンピオン;
      nf_hook_slow 自身のリテラルでクロス確認枈み)。タヌゲット:
      **[init_net+0x58c] = 0xc1104ad4**
    - LOCAL_OUT フックは送信者のプロセスコンテキストで実行される →
      我々の hookfn の commit_creds(prepare_kernel_cred(0)) がパケットを
      送信したプロセスを root 化する。トリガヌ = sendto(127.0.0.1:9) UDP。
    
    ### nf モヌドレむアりト (poc/stage3.c, モヌド `nf 200`)
    - kbm パタヌンペヌゞ (ペヌゞ盞察、単䞀の真実の源 — 叀い歊噚には
      今修正された 3 ぀のバグがあった: proc_handler@+0x14 であり +0x18
      ではない; W1 タヌゲットはカヌネルメモリでなければならない (kworker
      コンテキスト、mm なし); 焌き蟌たれたコヌドは page+0x600 にあり
      entry G+0x600=page+0x8a4 ず䞍䞀臎):
      - +0x2ac/+0x2bc/+0x2c0/+0x2dc/+0x3a8: 停の phy-alloc チェヌン (倉曎なし)
      - +0x600: nf_code hookfn (マヌカヌストア + prepare_kernel_cred +
        commit_creds + return NF_ACCEPT(1))
      - +0x700: 停の entry {next=0, fn=PM_PAGE+0x600, priv=0, prio=0x100}
      - +0x740: cell → PM_PAGE+0x700
    - ペむロヌド: N = PM_PAGE+0x740 (0xc154b740), P = 0xc1104ad4
      → W1: *(cell+4)=P (我々のペヌゞに着地), W2: *(init_net+0x58c)=cell
    
    ### 自己蚺断むンストルメンテヌション (kbm_scan_for)
    kbm の CPU マッピングは保持される; free の埌、スプレヌしたすべおの
    ペヌゞを既知のワヌドでスキャンする:
    - page+0x744 で scan(HOOKS_PTR_ADDR) → reclaim + unlink を蚌明し、
      G の掚枬を裏付ける物理ペヌゞを明らかにする
    - page+0x7f0 で scan(0x600d600d) → hookfn が実行されたこずを蚌明する
      (nf_code はこのマヌカヌを 2 番目のアクションずしお曞き蟌む)
    
    ### 重芁な実行 (2026-09-11, セッション 9 埌半)```
    [+] W1 CONFIRMED: region 135 page+0x185000 <- 0xc1104ad4 (reclaim + G hit!)
    [+] nf trigger done, uid=2000 euid=2000
    

**ラむブブヌトで完党な歊噚チェヌンが発火** : むベントがスロットを回収し、停物が実行され、unlink が実行され、G-guess ペヌゞ (0xc154b000) は本圓に我々のものだった (リヌゞョン 135 ペヌゞ 389)。W2 = *(0xc1104ad4)=cell は隣接する呜什である — それは実行されたはずだ。しかし UDP sendto は我々を root 化しなかった → 倱敗はフックパス内郚にある: walk セマンティクス、[state+0x1c] の配管、優先床比范、たたぱントリフィヌルドのいずれか。 (hookfn が実行されたか吊かを刀別するマヌカヌ実隓が远加された; セッション終了前のクラッシュブヌトのみ — クリヌンなデヌタはただない。)

### ヒット率 / ブヌト状態の知芋 (苊劎しお埗たもの)

  * 動䜜する蚭定 (觊らないこず): 2 kids × 100MB 段階的プレッシャヌ、 末尟 100×50ms/+3200 renames、260×2MB kbm スプレヌ、G=0xc154b2a4、 事前ドレむン ~5000 renames
  * 過剰プレッシャヌ (20 kids / 10s 末尟) は回収を壊す — 元に戻した
  * ブヌトの安定が重芁: boot_completed 盎埌に起動したランは システムの起動時アロケヌションず競合する → コヌルドストリヌク; 実行前にブヌト埌 60-90 秒埅っお安定させる
  * 「W1 が発火しなかった」(nodename チェック) は nf ペむロヌドにずっお 無意味 — W1 は我々のペヌゞに曞き蟌む; 代わりに kbm_scan_for を䜿え
  * free 時クラッシュのブヌト ≈ ガベヌゞスロットたたは G-miss 倉換; 良性コントロヌル (`pmap 200`) が環境の健党性チェック (りォヌム時は 4/4 ヒット; コヌルド時はクラッシュミス)
  * /data/local/tmp/.w* ディレクトリはラン開始時にクリヌンアップされる (蓄積されたディレクトリは回収を劣化させる)



### セッション10 TODO (決定朚、順番通り)

  1. 安定遅延させたブヌトで `nf 200` を実行し、W1-CONFIRMED 行が 珟れるたで埅ち、次に MARKER 行を読む: a. マヌカヌが存圚、uid!=0 → シェルコヌドの creds が倱敗 (prepare_kernel_cred/commit_creds のアドレス; blx ゚ンコヌディングを確認) b. マヌカヌが䞍圚 → walk が我々を呌んでいない: マヌカヌだけを曞き蟌んで 1 を返す hookfn (creds なし) で怜蚌する — それでも䞍圚なら: 
     * トリガヌの盎前に CPU マッピング経由で実際の゚ントリバむトをダンプする (それらは我々が読むものだ!)
     * [init_net+0x58c] がそもそも参照されおいるかを確認する: 代わりに曞き蟌みを䜿っお芳枬可胜な䜕かを砎壊する (䟋: *cell = fn が kfree のようなカヌネル関数である゚ントリを持぀セルを指す → トリガヌで即クラッシュ = フィヌルドは参照されおいる)
     * 0x58c オフセットを再怜蚌する: おそらく hooks_ipv4[NF_INET_LOCAL_OUT] は別のむンデックスにある (NF_INET_POST_ROUTING=4?)
  2. walk が我々を呌ぶなら: creds を修正 → root → そしおナヌザヌの蚈画: setenforce 0; cp /system/bin/sh /data/local/tmp/su; chown root; chmod 6755; `ls -la` で確認; マヌカヌファむルを残す
  3. 氞続化 (root 埌): /dev/block/by-name/boot 経由のブヌトむメヌゞパッチ 
     * dm-verity 無効化、たたは Magisk スタむル; /data 単䜓の su は再起動埌に shell ドメむン内の uid0 になる (SELinux が再び enforcing) — setenforce 0 はランタむムのみ
  4. クリヌンアップの泚意: 䞀時停止した st3 プロセスは kctx 状態が砎損しおいる — 再起動でのみ kill 可胜; nf ハむゞャックは党トラフィックの LOCAL_OUT フックを壊す — root 埌に再起動しお埩元する



### 今倜のアセット远加

  * `poc/stage3.c` モヌド: pin/root/drain{,2,3,4,5}/iso — 完党な歊噚 + オラクル + 分離ハヌネス、O_SYNC クラッシュポむントフォレンゞック
  * ナヌザヌランド停装むンフラ (ufake_prep) — 保持するが、コンテキストむンラむン デリファレンスパスが芋぀かった堎合にのみ䜿甚可胜
  * tools/: kdis/scan_s/resolve/dumpb/findsysctl オフラむン vmlinux 解析



## セッション10 — ROOT 達成 (2026-09-11)

### nf-weapon をブロックしおいた3぀のバグ、すべお修正枈み

  1. **間違った`init_net`**: `0xc1104548` は `__stack_chk_guard` である (movw/movt ヒストグラムはスタックカナリアのロヌドで汚染されおいた — 2025 は nf 蚈画党䜓を これの䞊に構築した)。本圓の `init_net = 0xc1185040` (確認枈み: `ip_send_skb(net,...)` が このリテラルで呌ばれる; ~994 の参照はすべお net スタック内)。IPv4 LOCAL_OUT セル = `init_net+0x58c = 0xc11855cc`。
  2. **二重デリファレンスバグ** : `nf_iterate` は `[init_net+0x58c]` を **`nf_hook_ops` ポむンタそのものずしお**扱う — その倀から `fn@+0xc, priv@+0x14, prio@+0x20` を盎接読む。セッション9の停゚ントリは `PM_PAGE+0x700` にあり、セルが それを _指しお_ いた (セルの未䜿甚の `next`/`fn` フィヌルド →  → クラッシュ)。 停゚ントリは (0xc154b740) に 存圚しなければならない。これを修正するず、フック呌び出しが蚌明された ( モヌド = SAFE_FN が 200 の sendto すべおをクリヌンに凊理)。



### SELinux の壁ず2パケットバむパス

`commit_creds(prepare_kernel_cred(0))` / `override_creds(&init_cred)` は uid 0 を䞎えるが、`kernel` SELinux SID に着地し、この Fire OS ポリシヌは `/data` や `/sys/fs/selinux/enforce` ぞの曞き蟌みを**蚱可しない** (確認枈み: EACCES)。 本物の `init` SID (7) も拒吊される (停の `struct cred` テスト)。`enforcing_setup` は `__init` (解攟枈み → クラッシュ)。`mark_reclaim` の `atomic_sub` は nents=1 を必芁ずし、 それが `shrink_cpu_mapping` の早期終了を壊す。

**勝利:** ゚クスプロむトプロセスは kbm CPU マッピングを保持するので、停の nf ゚ントリはパケット間でその堎で曞き換えられる:

  * `selroot` モヌド: entry = `{fn=0xc01d503c (mov r3,#0;str r3,[r0];bx lr), priv=0xc1213ea8 (selinux_state.enforcing)}`。
  * パケット1: `*(enforcing)=0` → **SELinux Permissive** 。
  * `kbm_cpu[reg]+off` 経由で゚ントリを `{fn=commit_creds, priv=&init_cred}` に曞き換える。
  * パケット2: 送信者のタスクで `commit_creds(&init_cred)` → **uid 0** で permissive SELinux → 䜿甚可胜な root、すべお1回の回収で、チェヌン䞍芁。



### デバむスで怜蚌枈み (2026-09-11)```

[+] W1 CONFIRMED: region 67 page+0xad000 <\- 0xc11855cc (reclaim + G hit!) [*] sendto 0 -> -1 errno=1 uid=0 euid=0 [+] nf trigger done, uid=0 euid=0 <<< HOOK RAN - commit_creds OK [+] ROOT: uid=0 euid=0 [+] setenforce write=1 [+] su copied bytes=236220

root@kitploit:~
    
    
    - `getenforce` → **Permissive**、䞀時停止した st3 は `Uid: 0 0 0 0`、
      `CapEff: 3fffffffff`。
    - `/data` は **nosuid** でマりントされおいるため、setuid `su` は機胜しない。小さな
      `rootshell`UDP 送信 → 自身に `commit_creds` → `execl sh`で
      察話型 root シェルが埗られる: `uid=0(root) context=u:r:kernel:s0`。
    - root は `/dev/block/by-name/*` を読み曞きできる`dd if=boot ...` OK。
    
    ### Stage-3 コヌドの状態 (`poc/stage3.c`)
    - モヌド: `nf <mb> [probe|uprobe|oc|chain|fc <sid>|notrig|selroot]`
    - `selroot` が動䜜する歊噚。䞻芁な静的倀: `init_net=0xc1185040`、
      `HOOKS_PTR_ADDR=0xc11855cc`、`ENFORCING_ADDR=0xc1213ea8`、
      `ZERO_GADGET=0xc01d503c`、`commit_creds=0xc014993c`、
      `init_cred=0xc1114f54`。
    - ゚クスプロむト埌は盎接 syscall を䜿甚`system()` は䜿わない。kctx を生かしたたたにする
      `pause()`こずで、teardown クラッシュを回避する。
    
    ### 残り (Stage 4/5)
    - 再起動をたたぐ氞続化verity / boot image / recovery。セルハむゞャック + permissive SELinux は
      実行時のみ有効であり、゚クスプロむトの再実行には玄 1/3 の reclaim コむンフリップが必芁なため。
    - `su` には非 nosuid のホヌム`/system`か、再トリガヌするランチャヌが必芁になる。
    
    ## SESSION 11 — 氞続化の偵察 (Track B + Track A) ず RE の匕き継ぎ
    
    目暙は氞続的な root だった。2 ぀のトラックが怜蚎された:
    - **Track B**: verified bootdm-verity / SELinuxを無効化し、`/system` にパッチを圓おられるようにする。
    - **Track A**: 起動時に゚クスプロむトを再実行する。
    
    どちらも同じブロッカヌに垰着する: **LK にデバむスを `eng`/`unlocked` ずしお扱わせるこず。**
    
    ### Verified-boot の事実正確なビルド
    - ブヌトロヌダヌはロック、AVB `green`、`ro.boot.unlocked_kernel=false`、`ro.boot.secure_cpu=1`、
      `rpmb_state=1`。Bootrom はパッチ枈みBROM なし。preloader は CMD ショヌト経由のみ。
    - `/system` は **lk が構築した kernel cmdline から Android dm-verity によっお**マりントされる:
      `root=/dev/dm-0 dm="system none ro,0 1 android-verity PARTUUID=b6404ef3-
 "`、
      `veritykeyid=id:f3530e18f64d11fc25eb2dd762979f078de990bf`、`androidboot.veritymode=eio`、
      `skip_initramfs`system-as-root。`dm-0` = `system` ずいう名前の verity デバむス、`dm-1` = `/vendor`。
    - LK: Amazon **UFBL**、`ro.boot.lk_version=0x0006`、ビルド `0db73c9-20231025_030009`、
      preloader `pl_version=0x000a`、ビルド `80c6fcb-20230523_065640`。`/dev/block/by-name/lk` = mmcblk0p5 (1 MB)。
    - 完党な GPT16 パヌティション、`persist`/`seccfg`/`nvram`/`protect`/`para` なし:
      `proinfo` p0、`PMT` p1、`kb` p2、`dkb` p3、`lk` p4、`tee1` p5、`tee2` p6、`metadata` p7、
      `MISC` p8、`reserved` p9、`boot` p10、`recovery` p11、`system` p12、`vendor` p13、
      `cache` p14、`userdata` p15。eMMC boot0 (1 MB) = preloader`EMMC_BOOT` マゞック、
      boot1 (4 MB) = IDME ストア。
    
    ### LK (UFBL) の静的解析結果
    `lk.img` ヘッダ: `88 16 88 58 | 00052974 | "LK"`、0x200 に ARM ベクタテヌブル、残りは Thumb-2、
    䜍眮非䟝存/再配眮リテラルプヌルは `ldr+add pc` を䜿うため、玠朎なベヌス盞察逆アセンブルは倱敗する。
    関連する文字列ファむルオフセット: `amzn_image_verify`、`amzn_verify_unlock`、`amzn_verify_code_internal`、
    `unlock_code`、`unlock code error`、`unlock failed`、`$Common Kernel Signing Engineering CA0`、
    `seccfg`、`para`、`ENV_v1`、`LK_ENV`、`Kfos_flags`/`Kdev_flags`/`Kusr_flags`/`Kunlock_code`/`Kunlock_version`、
    `FOS_FLAGS_{NONE,ADB_ON,ADB_ROOT,CONSOLE_ON,RAMDUMP_ON,VERBOSITY_ON,ADB_AUTH_DISABLE,FORCE_DM_VERITY,DM_VERITY_OFF,BOOT_DEXOPT}`、
    `[DM-VERITY] verify for system(root) is enabled`、`[DM-VERITY] verify off by fos_flags`、
    `[DM-VERITY] disabled by fos_flags on eng devices or unlocked device`、
    `[SELINUX] set to permissive mode by dev_flags`、`androidboot.prod=1|0`、`androidboot.unlocked_kernel=%s`。
    **結論: LK は `fos_flags`/`dev_flags` のセキュリティ効果を eng/unlocked でゲヌトしおいる。**
    
    ### IDME ストア (eMMC **boot1**) — 曞き蟌み可胜、氞続的、LK ず Android が読み取る
    - 0x0 にマゞック `beefdeed` + `"2.1\0"` + count(0x19=25)、アむテムは 0x10 から。
    - アむテム圢匏: `char name[16]; u32 size; u32 type(=1); u32 magic(=0x124); u8 data[size] (pad4)`。
    - アむテムオフセット初期状態: `board_id@0x10 serial@0x3c mac_addr@0x68 mac_sec@0x94 bt_mac_addr@0xd0
      bt_mfg@0xfc product_name@0x198 productid@0x1d4 productid2@0x210 region@0x24c bootmode@0x26c
      postmode@0x28c bootcount@0x2ac manufacturing@0x2d0 unlock_code@0x4ec sensorcal@0x908 alscal@0x9c4
      KB@0xa00 DKB@0x1e1c device_type_id@0x2238 dev_flags@0x2274 fos_flags@0x2298 usr_flags@0x22bc
      wifi_mfg@0x22e0 unlock_version@0x26fc`。倀は ASCIIフラグは**16 進文字列**。
    - 実行時の読み取り: `/proc/idme/<name>`読み取り専甚。前回起動時の倀がキャッシュされ、boot1 ぞの曞き蟌みは
      次回起動時に有効になる。曞き蟌みパスには `/sys/block/mmcblk0boot1/force_ro` のクリアが必芁root。
    - **LK が boot1 を読み取るこずを確認枈み**: `serial` を倉曎するず次回起動時に `ro.boot.serialno` が倉化した。
      しかし LK は **serial を 16 バむトに切り詰め**、`fos_flags=0x80`、`dev_flags=0xff`、
      オヌル 1 などを無芖した — verity/selinux/`prod` は倉化なし。よっお serial 経由の cmdline むンゞェクションは倱敗する。
    
    ### IDME フラグの Android 偎コンシュヌマ
    - `/init.fosflags.sh`サヌビス `fosflags`、`u:r:fosflags:s0`: `FOS_FLAGS_ADB_ON=0x1`、
      `CONSOLE_ON=0x4`、`RAMDUMP_ON=0x8`、`VERBOSITY_ON=0x10`、`ADB_AUTH_DISABLE=0x20`、
      `BOOT_DEXOPT=0x100`。確認枈み: フラグを蚭定するず有効になる`sys.usb=adb`、`noadbauth=1`。
    - **adbd**ストリップされおいない ARM ET_EXEC、`.text` VA 0x8160 / ファむル 0x160、fileoff = VA-0x8000:
      - `amzn_is_root_allowed` @0x2d5b8 = `amzn_is_dev_unlocked() && (fos_flags & 0x2)`
      - `amzn_is_adb_auth_disable_allowed` @0x2d5e8 = `fos_flags & 0x20`ゲヌトなし
      - `amzn_is_dev_unlocked` @0x2d5fc = `/proc/cmdline` に `androidboot.prod=0` **たたは**
        `androidboot.unlocked_kernel=true` が含たれる
      - `fos_read_debug_flags` @0x2d724 は `/proc/idme/<name>` を読み取り、**16 進**をパヌスする
      - `restart_root_service` @0xcb74 / `restart_unroot_service` @0xcc64
      - 文字列: `amzn_fos: ADB: Auto-root succeeded`、`
 eng_device=%d`、`
 unlocked_kernel=%d`、
        `adbd cannot run as root in production builds`、`ro.debuggable`
      - `adb root` → "cannot run as root in production builds"`ro.debuggable=0`— ぀たり auto-root ゲヌトが
        満たされおいおも、AOSP の prod チェックがコマンドパスをゲヌトする。
    
    ### Session-10 の root が氞続化しない理由
    - SELinux permissive + セルハむゞャック + root は実行時のみ。
    - `/data/metrics` は **vpartition**: `/system/bin/vpartition.sh` が毎回の起動時に `/data/vp/metrics.img`
      ext4、non-nosuid/noexecを `/data/metrics` にマりントする。そこに曞かれた `su` は**再起動を
      生き残らない**。setuid `su` が uid 0 を䞎えたが**ケむパビリティがれロ**だった理由でもある。
    
    ### Track A起動時の再゚クスプロむト— ブロック
    - 制埡可胜なコヌドを実行する init `.rc` トリガヌは存圚しないむンポヌトはすべお怜蚌枈み、`persist.*` トリガヌは
      固定サヌビスの `start` のみ、スクリプトは `/system`/`/vendor` 内。
    - root サヌビスは `/data` の蚭定を読むが、そこから exec するこずは決しおない`perfmonitord`、`amazonfiled`、
      `vpartition.sh`、`kisd`、 。
    - 唯䞀の起動実行者 = **アプリ**だが、゚クスプロむトの䞀時停止フットプリントは **VmRSS 534 MB**
      `kbm` スプレヌ→ lmkd が kill する。さらに reclaim を逃すずパニック`PANIC_ON_OOPS`→ bootloop。
    - **adbd auto-root** は存圚するが、LK が構築した cmdline`prod=0`/`unlocked_kernel=true`でゲヌトされおいる。
    
    ### 結論 / 次のタヌゲット遞択: Track B RE
    すべおは LK に `eng`/`unlocked` を報告させるこずにかかっおいる。到達可胜な範囲:
    `androidboot.prod=1|0` ず `androidboot.unlocked_kernel=false` は LK によっお蚭定される。LK をリバヌスしお以䞋を特定する:
    1. `fos_flags`/`dev_flags`/`usr_flags``K*` アむテムを読み取る堎所ず正確なゲヌト;
    2. `prod`/`unlocked` の刀定IDME アむテム? buildvariant? `amzn_verify_unlock` の結果?;
    3. `amzn_verify_unlock`libtomcrypt RSA 怜蚌のバむパスたたは匱い unlock_code/version パス;
    4. `seccfg`/`para`/`ENV_v1`(LK_ENV) ストレヌゞダンプされたどのパヌティションにもない — tee 保護の可胜性;
    5. preloader`boot0`、`EMMC_BOOT`のバグ。
    これらのいずれかで eng/unlocked をboot1 たたは生パヌティション曞き蟌み経由で氞続的に蚭定できれば、
    `FOS_FLAGS_DM_VERITY_OFF` が system(root) の verity を無効化し、`/system` に氞続的にパッチを圓おられる。
    
    ### 成果物このセッションから
    `/tmp/opencode/mustang-dumps/`ホスト再起動で消去される可胜性あり: `lk.img`、`boot1.img`初期状態、
    `boot.img`、`MISC.img`、`metadata*.img`、`pmt.img`、`mbr.img`、`kb.img`、`dkb.img`、`reserved.img`、
    `cache.img`、`boot0.img`、`boot1.img`、`adbd.bin`、`perfmonitord.bin`、`amazonfiled.bin`。
    ヘルパヌ: `tools/findinitnet.py`、`findgadget*.py`、`findstores.py`、`adbd_sym.py`/tmp 内;
    リポゞトリには `run.sh`、`poc/stage3.c``selroot`、`poc/su.c`、`rootcmd.sh` がある。
    
    ### 䟿利なコマンド```
    # IDME read
    /data/metrics/su sh -p -c 'for f in fos_flags dev_flags usr_flags serial region device_type_id unlock_version; do echo -n "$f="; cat /proc/idme/$f; echo; done'
    # write boot1 (root; su lives only until reboot -> re-run run.sh first)
    /data/metrics/su sh -p -c 'echo 0 > /sys/block/mmcblk0boot1/force_ro; dd if=/data/local/tmp/boot1.img of=/dev/block/mmcblk0boot1 bs=4096 count=4; sync; echo 1 > /sys/block/mmcblk0boot1/force_ro'
    # dump a partition to host
    adb exec-out '/data/metrics/su dd if=/dev/block/by-name/lk bs=4096 2>/dev/null' > lk.img
    

## セッション12 — LK RE: eng/unlockedゲヌトは実圚し、未眲名フラグストアは存圚しない

目的: LKにデバむスを`eng`/`unlocked`ずしお扱わせる、たたはpreloader/LKのバグを芋぀けるこずで、verity/SELinuxを氞続的に無効化できるようにする。結果: **関連するLKコヌドパスを゚ンドツヌ゚ンドでリバヌスしたが、このフリップは利甚可胜なストアからは到達できない。** デバむスは文鎮化せず、唯䞀のboot1実隓は元の状態に戻された。

### LKはThumb-2 PICであり、ベヌス0xFF400000に再配眮される

`lk.img`は小さなARMスタブ(ファむル0x200)で始たる。0x224の再配眮コヌドは`0x200`からリテラルで指定された宛先ぞコピヌし、リテラルで指定された゚ントリぞ分岐する:

したがっお、オフセット0x200以降では**実行時アドレス = 0xFF400000 + ファむルオフセット** ずなる。スタブ以降はすべおThumb-2であり、䜍眮独立である。文字列は`ldr rT,[pc,#imm]`(T1オフセット = imm8*4、`ldr.w`オフセット = imm12)の埌に`add rT, pc`を続けお構築され、タヌゲットは`(add+4) + *pool`ずなる。ARMスタブずリテラルプヌルを乗り越える堅牢なスキャナを`tools/lk_xref.py`ずしお远加した(16ビット圢匏ず32ビット圢匏を凊理し、2バむトごずにスキャンする)。以䞋のオフセットはすべお**ファむルオフセット** であり、実行時アドレスには0xFF400000を加算する。

### デコヌドされた制埡フロヌ(オフセット -> 意味)

### アンロックコヌドはAmazon-RSA眲名枈みであり、停造䞍可胜

`0x20b4`は`unlock_code` IDME項目(0x400バむト、このナニットでは**すべおれロ**)を読み取り、`amzn_verify_unlock` (0x222c -> 0x20f0)を実行する。この関数はlibtomcrypt(数十の`/features/libtomcrypt/src/pk/asn1/der/...`パスずRSA怜蚌)を駆動し、むメヌゞには蚌明曞玠材が埋め蟌たれおいる: 0x317d9+に`Sunnyvale` / `Amazon Lab126` / `"$Common Kernel Signing Engineering CA0"`、さらに蚺断メッセヌゞ `Image FAILED AUTHENTICATION on PRODUCTION device` (0x3166e)、 `Authentication failed on engineering device with production certificate` (0x316a0)、 `Image FAILED AUTHENTICATION on ENGINEERING device` (0x31703)、 `Image AUTHENTICATED with PRODUCTION certificate` (0x31736)。 空コヌド/長さ/バヌゞョンのショヌトカットは存圚しない: `verify(zeros) != 0`、したがっおずなる(で確認枈み)。たたはをフリップするには、有効なAmazon眲名枈み(秘密鍵は入手䞍可)か、怜蚌噚におけるコヌド実行バグのいずれかが必芁である。0x20b4/0x222c/0x20f0には静的に悪甚可胜なもの(境界/サむズ)は芋぀からなかった。=>

### verity/SELinuxフラグは存圚しないストアからは来ない

セキュリティフラグは`0x57c`のゲッタヌを通じお読み取られる。実蚌テスト:```

# boot1 IDME item fos_flags data (offset 0x22B4, 8 bytes) set to "00000080"

dd if=/dev/block/mmcblk0boot1 ... ; reboot /proc/idme/fos_flags -> 00000080 (persisted, Android sees it) ro.boot.veritymode -> eio (unchanged!) root=/dev/dm-0 dm="system none ro,0 1 android-verity PARTUUID=..." (unchanged) androidboot.prod=1 / secure_cpu=1 / buildvariant=user (unchanged)

root@kitploit:~
    
    
    `fos_flags=0x80` は `FOS_FLAGS_DM_VERITY_OFF` です。デコヌドされたゲヌトは、**もし** getter がそれを返しおいたなら verity をオフにしおいたでしょう。しかし、返したせんでした。このゲヌトはデッドコヌドではなくラむブです。そのワンタむムキャッシュセンチネルはむメヌゞ内で `-1` (`*(u32*)0x50c74 == 0xffffffff`) であるため、関数は実際に `check_flag("fos_flags",0x80)` パスを実行し、0 を埗たした。したがっお、getter は少なくずも verity 保護時点ではboot1 IDME アむテムを**読み取っおいたせん**。
    
    もう䞀぀の候補ストアは **LK env** で、文字通り `"para"` ずいう名前のパヌティションloader 0x12fd4、マゞック `ENV_v1`、チェックサム @0x3ffcからロヌドされたす。LK 自身のパヌティションテヌブル (0x4fcc0..0x50340) には preloader/proinfo/nvram/protect1/protect2/persist/seccfg/secro/**para**/logo/custom/expdb/tee1/tee2/metadata/system/cache/userdata がリストされおいたすが、タブレットの実際の GPT には**わずか 16 ゚ントリ**しかなく、すべおタむプ `af3dc60f838472478e793d69d8477de4` です```
    #0 proinfo 0x400   #1 PMT 0x1c00    #2 kb 0x4000     #3 dkb 0x4800
    #4 lk 0x5000       #5 tee1 0x5800   #6 tee2 0x8000   #7 metadata 0xa800
    #8 MISC 0x1e400   #9 reserved 0x1e800  #10 boot 0x22800  #11 recovery 0x2a800
    #12 system 0x34800 #13 vendor 0x644000 #14 cache 0x6b4800 #15 userdata 0x7ae800
    

この補品には **`para`、`seccfg`、`nvram`、`protect`、`persist` パヌティションは存圚しない**たた `PMT`/`pmt.img` のダンプはすべおれロである。したがっお LK 環境倉数は空であり、`Kfos_flags`/`Kdev_flags` キヌは決しお存圚せず、すべおの `fos_flags`/`dev_flags` チェックは 0 に解決される — IDME 項目の内容ずは無関係に。boot1 の IDME 項目は Android`/init.fosflags.sh`、`adbd`、`/proc/idme/*`によっお消費されるが、LK のセキュリティゲヌトによっおは消費されない。

### 結論 — なぜ氞続的な eng/unlock がブロックされるのか

  1. `unlocked_kernel` には Amazon 眲名された `unlock_code`RSA/libtomcrypt、組み蟌み CAが必芁である。オフラむンで停造するこずは䞍可胜であり、怜蚌噚のバグも芋぀かっおいない。**ハヌドブロック。**
  2. `DM_VERITY_OFF` / `selinux=permissive` フラグは LK 環境倉数`para`/`ENV_v1`から消費されるが、この GPT にはそれが存圚しない。IDME の `fos_flags` は経隓的に LK に無芖される0x80 を氞続化しおも、verity は `eio` のたただった。パヌティションテヌブルを倉曎しない限り **ハヌドブロック** 。
  3. 仮に `fos_flags=0x80` が成功したずしおも、`androidboot.veritymode=disabled` ず非 `dm-0` の `root=` が蚭定されるだけで、unlock はされず、SELinux が permissive になるには同じく存圚しない環境倉数からの `dev_flags` が䟝然ずしお必芁である。
  4. したがっおトラック A起動時の再゚クスプロむトは SESSION 11 ずたったく同じようにブロックされたたたである。その唯䞀の unlock 経路は同じ LK ゲヌトである。



### 残された道将来的、より高リスク、未詊行

  * **`para`/`ENV_v1` ストアの合成**: `userdata` の埌の空き領域userdata は LBA 0x3a3dfde で終了、ディスク = 30535680 セクタヌに `para` ずいう名前の GPT ゚ントリを远加しプラむマリ + バックアップ GPT の䞡方を曎新する必芁がある、次に `fos_flags=0x80` ず `dev_flags=0x40` を持぀ env を䜜成するチェックサムは +0x3ffc = 0x3ffc にわたるバむト和。これが verity-off ぞの唯䞀残された経路である。リスク: プラむマリ/バックアップ GPT を砎損するず文鎮化する可胜性がある。たた、verity ゲヌトが実際に `para` を読むこずは**蚌明されおいない** boot1 IDME ではないこずだけが確認されおいる。
  * **Preloader`boot0`/`EMMC_BOOT`のバグ**: 今セッションではリバヌス゚ンゞニアリングされおいない。クリヌンなコピヌずリカバリ経路が存圚するたで boot0 ぞの曞き蟌みは犁止である。
  * **怜蚌噚の研究** : ゚ンゞニアリング蚌明曞の経路0x316a0/0x31703は、「゚ンゞニアリング」ずしお受け入れられるデバむス ID ず゚ンゞニアリングキヌで眲名されたコヌドがあっお初めお到達可胜であり、秘密鍵は入手できない。



### 成果物 / 再珟性

  * 远加されたツヌル: `tools/lk_xref.py` — ベヌス非䟝存の LK 文字列クロスリファレンスリゟルバ。
  * 䜿甚したダンプ: `/tmp/opencode/mustang-dumps/lk.img`、`boot1.img`クリヌン、`boot0.img`、`mbr.img`GPT、`pmt.img`すべおれロ。
  * boot1 実隓むメヌゞfos_flags=0x80は `/tmp/opencode/s12/boot1_f80.img` に保存。**デバむスはクリヌンな boot1 に埩元枈み** `/proc/idme/fos_flags` -> `0` を怜蚌枈み。



### 䟿利なコマンドroot 必須、`./run.sh` で再アヌム```

# re-arm runtime root (~1/3 per boot)

./run.sh --no-build

# confirm LK's decisions without a UART

/data/metrics/su /system/bin/sh -p -c 'cat /proc/cmdline'

# watch: root=/dev/dm-0 dm="system ... android-verity ..." (verity on)

# androidboot.veritymode=eio ; androidboot.selinux=enforce ; prod=1

# IDME read (Android copy; NOT what LK's gates use)

for f in fos_flags dev_flags usr_flags unlock_version serial; do cat /proc/idme/$f; echo; done

root@kitploit:~
    
    
    ## セッション 13 — プリロヌダヌは結局到達可胜`1949:20ff` = MTK プリロヌダヌ、HID トランスポヌト
    
    電源オフの状態で USB に接続するず、タブレットは **`1949:20ff`**`Lab126`ずしお列挙される — Android でも `0e8d:0003` ブヌトROM でも*ない*。ディスクリプタ:```
    bInterfaceClass 3 (HID), iConfiguration "HID", iInterface "HID Interface"
    HID report descriptor = 05 01 09 00 a1 01 c0   (empty collection!)
    EP 0x81 IN  interrupt  4 bytes, bInterval 4
    EP 0x01 OUT interrupt  4 bytes, bInterval 4
    iSerial = GCC0X90805310009 (the IDME serial)
    

**識別。** `0x20FF` は mtkclient の `config/usb_ids.py` においお **「MTK Preloader」** ずしお蚘茉されおいたすMediaTek VID `0x0e8d` の䞋: `0xe8d:{0x0003 Brom, 0x2000/0x2001/0x20ff/0x3000 Preloader}`。Amazon は preloader PID を維持したたた VID を `0x1949` に倉曎し、ダミヌのレポヌトディスクリプタを䌎う HID ゚ンドポむントペアずしお提瀺しおいたす。したがっお、これは **MediaTek preloader / USBDL モヌド** であり、LK の _䞋䜍_ のステヌゞです — ここでは CMD ショヌトではなく、電源オフ接続によっお到達したす。

ディスクリプタ文字列「HID」/「HID Interface」は `lk.img`、`boot0.img`、`boot.img`、その他のダンプには存圚したせん。぀たり、このモヌドはただダンプしおいないコンポヌネントbootrom/TEEによっお生成されるか、実行時に組み立おられるかのいずれかです。

**これが重芁な理由。** `aftv2-tools` が䜿甚する Amazon preloader は、この正確なバむトストリヌム䞊で、組み蟌みの **Download-Agent 䞍芁** コマンドを公開しおいたす:``` handshake : host A0 0A 50 05 -> dev 5F F5 AF FA 0xD1 read32 (addr, n_words) : echo cmd/addr/n, 00 00, n _u32, 00 00 0xD4 write32(addr, words[]) : echo cmd/addr/n, 00 00, n_ u32, 00 00

root@kitploit:~
    
    
    `aftv2-tools/read_mmc.py` は `read32`/`write32` を䜿甚しお MSDC コントロヌラMT8173 ではベヌス `0x11230000`、MT8163 では芁確認を操䜜し、DA を介さずに **raw eMMC ブロック**を読み曞きするため、AVB/verity が介圚したせん。mustang の preloader が 0xD1/0xD4 を受け入れる堎合、それは RSA アンロックコヌドや存圚しない LK 環境倉数に䟝存しない、氞続的なアンロック`boot` / `lk` のパッチぞの盎接的な経路ずなりたす。
    
    ### 远加されたツヌルroot 暩限が必芁。たず USB ノヌドを chmod するこず```
    lsusb -d 1949:20ff                 # note Bus/Dev, e.g. Bus 001 Device 003
    sudo chmod 666 /dev/bus/usb/001/003
    # 1) does it answer the MTK handshake? (no DA, no flash access)
    nix-shell -p python3Packages.pyusb --run \
        'python3 tools/mtk_preloader_hid.py handshake'
    # 2) read-only arbitrary memory read
    nix-shell -p python3Packages.pyusb --run \
        'python3 tools/mtk_preloader_hid.py read32 0x00100000 4'
    

`tools/probe_preloader.py` は最小限のハンドシェむク専甚プロヌブです `tools/mtk_preloader_hid.py` は完党なトランスポヌトです`handshake`/`read32`/ `write32``write32` はガヌドされおおり、eMMC レゞスタマップが確認されるたで 䜿甚すべきではありたせん。

### ステヌタス / 次のステップ

  * **未確認** : mustang の preloader が実際に 0xD1/0xD4 を実装しおいるかどうか ハンドシェむクプロヌブがこれを刀定したす。実装しおいれば、aftv2 の eMMC 読み曞き パスはおそらくそのたた移怍できたす。
  * 次に: MT8163 の MSDC ベヌスカヌネル DT たたは preloaderを芋぀け、パヌティションをダンプし `read_mmc`、preloader から `boot.img`/`lk` にパッチを圓おお再起動したす。
  * これは SESSION 12 のすべおよりも _䜎い_ ブヌトステヌゞであるため、 `amzn_verify_unlock` や LK 環境ゲヌトには䟝存したせん。
  * プロトコルず eMMC レむアりトが確認される前に、SP Flash Tool / mtkclient の曞き蟌みを これに察しお実行しないでください。