## 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 ã®æžã蟌ã¿ã ããã«å¯ŸããŠå®è¡ããªãã§ãã ããã