
Honor YLP-W00 カーネル 6.12.38 における CVE-2026-43499 futex UAF のエクスプロイト試行を記録した研究リポジトリ。PoC ソース、カーネルオフセット、失敗した権限昇格チェーンの分析を含む。
研究状況:脆弱性は確認済みでトリガー可能、PI walk は成功しクラッシュしないが、完全な権限昇格チェーンは未実装。上流の更新を待機中。
本リポジトリは、Honor YLP-W00 タブレット(カーネル 6.12.38、+pgo+bolt+lto+mlgo)上で CVE-2026-43499 を利用した一時的な権限昇格の完全な研究過程を記録したものである。
脆弱性トリガー成功(EDEADLK)、PI chain walk 成功(sched_setattr=0、クラッシュなし)。しかし PGO コンパイルにより do_futex がインライン化され、スタック再利用キャリアはすべて失敗。CyberMeowfiaNS の late_refs 書き込みプリミティブも slab ジオメトリの不一致によりヒットしない。
| 項目 | 値 |
|---|---|
| 機種 | Honor YLP-W00(タブレット) |
| システム | HONORYLP-W00/10DLDLD170SP3C00E144 |
| システムバージョン | 10.0.0.170 (MagicOS 10.0) |
| カーネル | 6.12.38-android16-5-gfde7767f6ef6-abogki481467632-4k |
| コンパイル | +pgo,+bolt,+lto,+mlgo (clang 19.0.1) |
| Kernel SHA-256 | 48b622a20a700cdde0b8f2f6e83959df00a7efedf52f347377cf542f7b58948e |
| Bootloader | ロック済み |
| SELinux | Enforcing |
| kstack ランダム化 | 無効 |
| ashmem | Rust 書き換え |
| MTE | ハードウェアサポートありだが KASAN 未使用 |
CyberMeowfiaNS の監査により VULNERABLE_PATTERN_PRESENT を確認。同一 kernel SHA-256 上に 2 件の成功事例(honor-mt6993, honor8e5)があるが、それらは late_refs 書き込みプリミティブを使用しており、本デバイスでは再現できない(詳細は後述)。
Honor 6.12.38 カーネルは +pgo+bolt+lto+mlgo でコンパイルされており、__arm64_sys_futex が直接 futex_wait_requeue_pi を呼び出し、do_futex 中間層をスキップする。futex 呼び出しチェーンは標準の 3 層から 2 層に変化する:
標準 GKI: __arm64_sys_futex -> do_futex -> futex_wait_requeue_pi
本デバイス: __arm64_sys_futex -> futex_wait_requeue_pi (do_futex がインライン化)
これにより waiter はより浅いスタック位置(深さ 0x130、標準の 0x1b0+ ではない)に置かれ、すべての標準スタック再利用キャリアのカバレッジジオメトリが一致しなくなる。
| フィールド | オフセット | サイズ |
|---|---|---|
| tree_entry (rb_node) | +0x00 | 24B |
| pi_tree_entry (rb_node) | +0x18 | 24B |
| lock | +0x38 | 8B |
| prio | +0x44 | 4B |
| deadline | +0x48 | 8B |
| task | +0x50 | 8B |
| ww_ctx | +0x58 | 8B |
| 合計サイズ | 0x70 | 112B |
| シンボル | オフセット |
|---|---|
| init_task | 0x023ecf00 |
| init_cred | 0x02402cb0 |
| root_task_group | 0x0261a740 |
| selinux_state.enforcing | 0x026663c8 |
| rb_erase | 0x00bce274 |
| rt_mutex_adjust_prio_chain | 0x115060c |
| commit_creds | 0x00b89c10 |
| worker_thread | 0x00adfef8 |
| remove_waiter | 0x0112b20 |
safe mode で UAF トリガーと PI walk 成功を確認:
[futex] CMP_REQUEUE_PI ret=-1 errno=35 (EDEADLK) ← UAF トリガー成功
[futex] consumer sched_setattr ret=0 errno=0 ← PI walk 成功, クラッシュなし
デバイスはオンラインを維持し、boot_id は変化せず、SELinux は依然 Enforcing。rb_erase は有効だが無意味なアドレスに書き込んだ。
試行したスタック再利用キャリア:
| キャリア | 原理 | 結果 |
|---|---|---|
| pselect | fd_set スタックコピー | shift=26(PGO インライン化)、fd_set 容量不足 |
| MCAST_JOIN_SOURCE_GROUP | 0x108 バイトスタックコピー | WAITER_OFF=0x308 >> 0x108、重複なし |
| adjtimex | timex 構造体スタックコピー | buf depth 0x118 < waiter 0x130、重複なし |
| io_submit | struct iocb スタック上書き | waiter[0x28..0x67] を上書き、lock@0x58 は範囲外 |
| PR_SET_MM_MAP | prctl スタック書き込み | EPERM |
| シグナル配送 (do_signal) | pt_regs スタック保存 | フレームが waiter[0x00..0x28] を上書き、task@0x50 と lock@0x58 が他のフレームで無効値に上書きされクラッシュ |
| rt_sigreturn | fpsimd vregs 512B | 6.12.38 では ldtr で per-cpu 領域にロードされ、カーネルスタックを経由しない |
核心的な障害:waiter は深さ 0x130 にあり、tree_entry(+0x00) と pi_tree_entry(+0x18) は一部のキャリアで上書き可能だが、task(+0x50) と lock(+0x58) はより深くにあり、既知のキャリアでは到達できない。tree_entry を上書きしても rb_erase を空パス(NULL 書き込み)にしか導けず、目標アドレスに誘導できない。
CyberMeowfiaNS はまったく異なる手法でスタック再利用問題を回避する:
前段チェーンはすべて成功:
--info 通過:カーネル識別検証成功--check 通過:carrier DSO (libdumpstateaidl.so) プリチェック確認
late_refs 競合失敗:
reclaim_hits=0失敗の根本原因:slab ジオメトリの不一致。
ep_get_upwards_depth_proc 関数は 6.12.38 に存在しない(6.12.58 参考カーネル特有)。ただし ep_loop_check_proc は確かに eventpoll.gen (+0xa8) に書き込むため、これが直接の原因ではない。
eventpoll 構造体のサイズは 0xdc0 (3520 バイト) で、kmalloc-4k から割り当てられる(order=3、32KB slab、8 オブジェクト)。コードが仮定する eventpoll_size=0xd0 (208 バイト) は誤り。
eventpoll_epi (epitem) は 128 バイト、order=0、4KB ページ、1 ページあたり 32 オブジェクト。late_refs は 1 ラウンドにつき 1-2 個の epitem しか解放せず、4KB ページ全体を空にして page allocator に回収させるには不十分。
late_refs はクロスキャッシュページ回収(cross-cache page reclaim)を必要とする:解放された epitem ページ → page allocator → SKB order-3 ページ。しかしこれには同一ページ上の 32 個すべての epitem が解放される必要があり、コードの epoll graph レイアウトではこれを保証できない。
6.12.58 参考カーネルは異なる SLUB 設定または slab レイアウトを持ち、クロスキャッシュ回収がよりトリガーしやすい可能性がある。
| ファイル | 説明 | サイズ |
|---|---|---|
firmware/boot_10.0.0.170.img | システムバージョン 10.0.0.170 の boot.img | 96 MB |
firmware/honor_kernel_6.12.38.img | boot.img から抽出したカーネル ELF(シンボルテーブル含む) | 44 MB |
firmware/libdumpstateaidl_honor.so | Carrier DSO(デバイスから取得) | 52 KB |
boot.img は llvm-nm でカーネルシンボルテーブルを抽出でき、llvm-objdump で逆アセンブルして関数レイアウトを分析できる。
| ファイル | 説明 |
|---|---|
src/test_safemode.c | safe mode futex トリガー + PI walk 検証(stamp なし) |
src/test_trigger.c | futex UAF トリガーテスト |
src/futex_trigger.c | futex トリガーコアコード |
src/exploit_rtsig.c | rt_sigreturn シグナルフレーム stamp テスト |
src/exploit_rtsig2.c | rt_sigreturn シグナルフレーム stamp(改良版) |
src/exploit_regstamp.c | do_signal レジスタ stamp テスト |
src/exploit_adjtimex.c | adjtimex primer テスト |
src/exploit_iosubmit.c | io_submit AIO primer テスト |
src/exploit_v3.c | KASLR + futex + adjtimex の組み合わせ |
src/kaslr_tracefs.c | tracefs バイナリ ring buffer KASLR リーク |
src/kaslr_tracefs_v2.c | tracefs KASLR リーク(改良版) |
src/dump_sigframe.c | シグナルフレーム読み取り専用診断 |
src/cmwns_*.c/h | CyberMeowfiaNS ソースコード(適配版) |
src/cve_2026_43499_audit.py | CyberMeowfiaNS CVE-2026-43499 監査スクリプト |
| ファイル | 説明 |
|---|---|
config/offsets.json | カーネルシンボルオフセット(BTF 検証済み) |
config/target.h | Honor YLP-W00 ターゲット設定(ghostlock ルート) |
config/target_honor_ylp_w00.h | Honor YLP-W00 ターゲット設定(CyberMeowfiaNS ルート) |
| ファイル | 説明 |
|---|---|
docs/ANALYSIS.md | スタックフレーム分析とシンボルオフセット |
docs/ALL_POC_ANALYSIS.md | 130+ PoC プロジェクト分析まとめ |
docs/ADJTIMEX_BREAKTHROUGH.md | adjtimex キャリア発見(後に重複なしと確認) |
docs/CRITICAL_FIX.md | adjtimex 重複計算の修正 |
docs/FINAL_STATUS.md | 最終状況と全手法 |
docs/MULTI_PLAN.md | 複数手法の比較 |
docs/PLAN.md | 全体アーキテクチャ計画 |
docs/STATUS.md | 段階的状況 |
| 属性 | 値 |
|---|---|
| パス | /system/lib64/libdumpstateaidl.so |
| サイズ | 52200 バイト (0xcbe8) |
| SHA-256 | d5765759437291dc406ffe8775b3b2830c89ca5891956a3b58fcca7227815ff9 |
| .init_array 位置 | ファイルオフセット 0xb950 |
| .init_array[0] | 0x72ec (BnDumpstateListener::onTransact thunk) |
| .init_array[1] | 0x8db0 (BnDumpstate::onTransact thunk) |
| コンストラクタ preimage | fd 7b bd a9 f5 0b 00 f9 f4 4f 02 a9 fd 03 00 91 |
service dumpstatez /system/bin/dumpstate -S
socket dumpstate stream 0660 shell log
class main
disabled
oneshot
user root
service bugreportd /system/bin/dumpstate -w
class main
disabled
oneshot
user root
ep_loop_check_proc:
paciasp
stp x29, x30, [sp, #-0x40]!
...
ldr x0, [x19, #0x80] ; fllink (子 epitem リスト) を読み取り
ldr x8, [x22, #0xf88] ; グローバル generation counter を読み取り
str x8, [x19, #0xa8] ; eventpoll.gen (+0xa8) に書き込み
...
ldr x8, [x8, #0x20] ; 子 epitem の ep ポインタを読み取り
ldr x9, [x8, #0xa8] ; 子 eventpoll.gen を読み取り (環検出)
...
bl ep_loop_check_proc ; 再帰走査