Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
GhostLock-GOT-W29 — HUAWEI MatePad Pro 11 GOT-W29 における CVE-2026-43499 (GhostLock) の研究 | Kitploit
ツール/GitHubGitHub/zzzxxxxxxxxxx/ghostlock-got-w29
特権昇格脆弱性分析エクスプロイトリバースエンジニアリングモバイルセキュリティバイナリエクスプロイト
GitHubzzzxxxxxxxxxx/ghostlock-got-w29

GhostLock-GOT-W29

HUAWEI MatePad Pro 11 GOT-W29 における CVE-2026-43499 (GhostLock) の研究

リポジトリを見る
18日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-43499 (GhostLock) — HUAWEI MatePad Pro 11 GOT-W29 調査

HUAWEI MatePad Pro 11 GOT-W29(Qualcomm kona / Snapdragon 870、HarmonyOS 4.x、kernel 4.19.157-perf+)上の CVE-2026-43499(Linux rtmutex/futex-PI UAF、"GhostLock") に関する権限昇格の研究記録。

デバイス

項目値
モデルHUAWEI MatePad Pro 11 GOT-W29 (tablet)
SoCQualcomm kona (SM8250, Snapdragon 870)
OSHarmonyOS 4.2 (104.2.0.237C00)、出荷時 4.0 (104.0.0.136)
カーネル4.19.157-perf+ (2025-10-13 build)
VA39ビット、4Kページ、KASLR 有効

脆弱性

CVE-2026-43499: kernel/locking/rtmutex.c の remove_waiter() は、 rt_mutex_start_proxy_lock() のロールバックパスで waiter->task ではなく current を使ってクリーンアップするため、ダングリング pi_blocked_on(スタック UAF)が発生する。 影響範囲は 2.6.39 ~ 7.1(本カーネルは範囲内)。 アップストリーム修正: commit 3bfdc63936dd。

本デバイスで確認済み:ソースコード rtmutex.c:1110-1112、逆コンパイル boot.elf、実機でのトリガーすべてを検証。

検証済みの成果(デバイス実測)

1. KASLR リーク — perf_event_open 経由 ✅

shell (uid 2000) で perf_event_paranoid=-1、perf_event_open(PERF_SAMPLE_IP, exclude_user=1) でカーネルテキストアドレスクラスタをサンプリングし、既知シンボルオフセットにアラインして slide を得る。

root@kitploit:~
samples=27651 kernel_ips=1685 lo=0xffffff948728176c hi=0xffffff9488ebfc7c
KASLR slide=0x147f200000    (40/40 IP 映射进内核文本区验证)
runtime _stext=0xffffff9487280800

ツール: tools/perf_kaslr.c。実行前提:shell(Shizuku rish)、seccomp によるインターセプトなし。

2. EDEADLK トリガー ✅

PI サイクルを作り FUTEX_CMP_REQUEUE_PI に -EDEADLK を返させ、ロールバックで remove_waiter のバグを発火させる。

重要な配置:requeue 先の futex がrequeue される waiter によって保持されている(futex2 = waiter_tid)→ task_blocks_on_rt_mutex 内で owner == task → -EDEADLK。

root@kitploit:~
[M] CMP_REQUEUE_PI ret=-1 errno=35 (EDEADLK!)
[W] WAIT_REQUEUE_PI ret=-1 errno=110 (ETIMEDOUT)  ← waiter 返回
[M] waiter_returned=1                              ← 留下悬空 pi_blocked_on

ツール: tools/edeadlk_probe.c(variant 8+2+1 = 11、または 27)。

3. 書き込みプリミティブの仕組み(理解済み)

rt_mutex_adjust_prio_chain step[7] が fake waiter に対して rb_erase(単一左子パス)を行う: *(tree_left) = tree_pc(value→target)+ __rb_change_child によるインクリメンタル書き込み。target.h 内の 全オフセットは boot.elf の逆アセンブルによる実測値。

4. 完全なオフセット(target/)

target/got_w29_target.h を参照。要点:

  • task_struct: cred=0x988, prio=0x184, pi_blocked_on=0xa90, usage=0x68, mm=0x728
  • rt_mutex_waiter (HW_FUTEX_PI): tree@0x0, pi_tree@0x18, task@0x30, lock@0x38, major@0x40, prio@0x48, deadline@0x50
  • PAGE_OFFSET=0xffffffc000000000, PHYS_OFFSET=0x80000000 (kona), KIMAGE_TEXT_BASE=0xffffff8008080000

ブロッカーと修正(2026-08-10 更新)

真の根本原因:EDEADLK トリガーが誤ったサブパスを通る(overlay より先)

boot.elf の逆アセンブル task_blocks_on_rt_mutex で確定:本デバイスのカーネルは 0x3808-0x3868 に 事前の owner==task チェック(cmp owner,task; b.eq -> -EDEADLK)があり、これは task->pi_blocked_on の書き込み(0x38d4 str x21,[x20,#0xa90])より前にリターンする。 GOT-W29 の旧トリガーは waiter に futex2=waiter_tid(self-own)を保持させていた → ちょうどこの事前チェックに該当 → pi_blocked_on が設定されない → ダングリングポインタなし。デバイスの観測(クラッシュなし + boot_id 不変)は 「ダングリングなし」と完全に一致する——overlay の配置は誤診だった。

正しいトリガー(smt878u 参照、実装済み):PI サイクル——owner が FUTEX_LOCK_PI(target) で requeue 先を保持; waiter が chain futex を保持;owner がさらに chain でブロック(サイクル:waiter→target→ owner→chain→waiter)。requeue 時にチェーンが rt_mutex_owner(chain)==top_task (rtmutex step[6])を検出 → -EDEADLK → ロールバックの remove_waiter が requeuer の current で誤ったタスクをクリーンアップ → waiter の pi_blocked_on がダングリング。owner は優先度を下げ(nice=10)、boost 後の prio が owner_waiter->prio と異なるようにする必要がある。そうしないと rt_mutex_waiter_equal が早期リターンする。

Overlay 修正(実装済み)

shift=12 では fake waiter の words 6-7(task/lock)が res_in[3..4](カーネルゼロクリア領域)に落ちる。 do_select のセマンティクスを利用:res_in[i] = in[i] & POLLIN-ready。SLIDE_INIT_TASK / fake_lock を in[3]/in[4] に書き込み、対応する fd をすべて「データのある pipe 読み取り端」(常に EPOLLIN-ready)に dup2 する → res_in[3]=init_task、res_in[4]=fake_lock が正確にエンコードされる。words 3-5 (pi_tree) と 8-10 はゼロでよい(ownerless-lock パスは pi_tree を使わない;prio/deadline はカーネルが step[7] で上書きする)。pselect は ready fd があるため即座にリターンする → waiter は consumer のトリガーが完了するまで ユーザー空間でビジーウェイトする(シグナル禁止、syscall ゼロ、カーネルスタック再利用による fake waiter の消去を防ぐ)。 11-word HW_FUTEX_PI テーブル、デュアル fd クラス、親プロセスの待機タイムアウトはすべて実装済み(git diff)。

残存する副次的な問題(設計エージェントによる注記、overlay をブロックしない)

  • boot_id リーク値は定数 direct-map エイリアスである(*(boot_id)=DM(loggers[0][1]))、 stext=leaked-p0_alias_image_offset(NFULNL_LOGGER) は DM(_stext) に対して off-by がある; root 段階で一貫して physmap(DM 空間)を使うなら自己整合的だが、そうでなければ perf_event_open によるランタイム slide に切り替える必要がある(rish で使用可能)。
  • 書き込み形状:smt878u は pi_tree(dequeue_pi)を通るが、GOT-W29 の ownerless パスは tree のみを使う (rt_mutex_dequeue)——今回の修正は tree 形状を使用(tree_pc=LOGGERS, tree_left=BOOT_ID)。

実機検証(rish が必要)

  1. tools/cycle_probe(コンパイル済み):低コストで cycle EDEADLK トリガーを検証;EDEADLK 後に waiter へ sched_setattr し、consumer oops が発生すれば = ダングリング存在 + overlay 着地。
  2. 完全な exploit:build_tools/deploy_test.sh でデプロイし、slide-kaslr-ok または consumer oops を確認。
  3. 副次的なブロッカー:リーク演算を perf slide で校正する。

ディレクトリ構成

root@kitploit:~
tools/      验证工具(perf KASLR, EDEADLK 探针, overlay 测试, kaslr.json)
target/     全部实测偏移
exploit/    移植的 slide.c(含 EDEADLK 触发改动)

謝辞

  • アップストリーム PoC: x-spy/CVE-2026-43499-popsicle, soralis0912/CVE-2026-43499-aristotle, JoinChang/ghostlock-oneplus, Wtrwx/smt878u-ionstack-poc (GPL-3.0)
  • CVE: NVD, Red Hat RHSB-2026-010
ツールをダウンロード