
CVE-2026-43499 (GhostLock) に基づく Linux カーネル権限昇格エクスプロイトの試み — Huawei Watch 4 Pro (MDS-AL00, armv7l)
本プロジェクトは、Huawei Watch 4 Pro (MDS-AL00, Snapdragon SW5100, HarmonyOS 4.3.0 AOSP 12) デバイス向けの GhostLock カーネルエクスプロイトの試みであり、ARM 32-bit (armv7l) アーキテクチャに適応させたものです。
GhostLock (CVE-2026-43499) は、Linux 2.6.39 から 7.x に影響するカーネルの futex PI UAF 脆弱性です。本プロジェクトの目標は、Huawei ウォッチ上で完全な権限昇格チェーンを完成させることです。
元リポジトリ: MobiusM/CVE-2026-43499 (arm64 版 PoC)
| パラメータ | 値 |
|---|---|
| デバイス | Huawei Watch 4 Pro (MDS-AL00) |
| カーネル | 5.4.161-perf (ARM32 armv7l) |
| システム | HarmonyOS 4.3.0 (AOSP 12) |
| CPU | Snapdragon SW5100 |
| SELinux | Enforcing (CONFIG_SECURITY_SELINUX_DEVELOP=n) |
| KASLR | 無効 |
| MMU | CONFIG_STRICT_KERNEL_RWX=y |
| スタック | NX (カーネルスタックは実行不可) |
| mmap(0) | Huawei による追加ブロック (-EINVAL、標準の -EACCES ではない) |
kernel 5.4.161 ARM32 では、FUTEX_CMP_REQUEUE_PI が EDEADLK をトリガーした後、PI チェーン走査は2 回目の rb_erase を実行しません。GhostLock 64 が依存する UAF → 2 回目の rb_erase による UAF ページへの書き込みという連鎖的エクスプロイトは、このカーネルでは完全に機能しません。
すべての 8-iov writev スプレーバリアントが失敗: sc[0] after = e3a0002a (シェルコードページが書き込まれていない)。
ghostlock64 の 8-iov writev スプレーは、カーネルスタック上の iovstack[8] 配列と rt_mutex_waiter 構造体のオーバーラップに依存しています。このカーネルでは:
clear_refs_operations.write の書き換えに成功したものは皆無sched_setattr は PI チェーン走査を正常にトリガーできますが(success=1600+ を検証済み)、rb_erase が操作するのは OWNER スレッドの pi_tree_entry(kmalloc ヒープ上の task_struct 内に位置)であり、waiter スレッドのスタックデータ(fd_set writev データ)ではありません。
したがって、pselect + sched_setattr のルートでも書き込み値を制御することはできません。
mmap(0, ..., MAP_FIXED, ...) は -EINVAL を返す。標準 Linux の -EACCES ではないCONFIG_SECURITY_SELINUX_DEVELOP=n → selinux_state.enforcing フィールドが存在しないmremap → ENOSYScommit_creds: 0xC0140390
prepare_kernel_cred: 0xC014059C
proc_clear_refs_ops: 0xC0CAF280 (.write @ +12 = 0xC0CAF28C)
mmap_min_addr: 0xC12E8568
dac_mmap_min_addr: 0xC123C734
selinux_hooks[mmap]: 0xC0F64E1C
| リポジトリ | デバイス | カーネル | アーキテクチャ |
|---|---|---|---|
| x-spy/CVE-2026-43499-popsicle |
両リポジトリとも pselect() + sched_setattr による PI チェーンのトリガーと physmap 直接書き込みを使用しており、ARM64 の direct map メカニズムに依存しています。ARM32 には direct map がなく、このカーネルの PI チェーン動作も異なります。
CVE-2026-43499-armv7/
├── config/
│ └── kernel.config # 设备内核 .config (5.4.161-perf)
├── scripts/
│ ├── ghostlock_all.sh # 批量测试脚本
│ └── ghostlock_check.sh # 检测脚本
├── src/
│ ├── ghostlock64.c # 原始 8-iov 双 erase PoC (基础框架)
│ ├── ghostlock5-33.c # 早期迭代版本 (ghostlock5 ~ ghostlock33)
│ ├── ghostlock63.c # ghostlock 6.x 3-iov 变种
│ ├── g62_*.c # 3-iov 变种 (不同目标地址)
│ ├── g62_8e.c # 8-iov 精确喷溅 (最终版)
│ ├── g62_scan.c # 多 iov 偏移扫描
│ ├── g62_self.c # waiter 自触发 EDEADLK 测试
│ ├── g62_pispray.c # EDEADLK + slab spray + sched_setattr
│ ├── g62_rand.c # 写 randomize_va_space 测试
│ ├── gsu_v19.c # 8-iov + sched_setattr 触发
│ ├── gl_pselect*.c # pselect + sched_setattr 测试
│ ├── gl_scan.c # fd_set 偏移扫描
│ ├── sc64.c # shellcode payload
│ ├── trigger*.c # 原始触发 PoC (验证漏洞存在)
│ ├── ghostlock_root.c # 早期 root 尝试
│ └── test_*.c # 编译/运行测试
├── README.md
├── ghostlock64 # 8-iov 双 erase PoC 二进制
├── ghostlock63 # ghostlock 6.x 3-iov 二进制
├── g62_* # 3-iov 变种二进制
├── gl_* # pselect 测试二进制
├── gsu # sc-page hijack 变种
├── sc64 # shellcode
├── trigger* # 原始触发 PoC 二进制
└── test_* # 测试二进制
このカーネルバージョン (5.4.161 ARM32) の PI チェーン実装は、GhostLock の二重 rb_erase 任意書き込み技術をサポートしていません。 既知の CVE-2026-43499 エクスプロイトルートはすべてこのデバイスで妨げられています。続行するには、新しい write-0 プリミティブまたは他の脆弱性の発見が必要です。
Huawei め、よくも嵌めてくれたな。deepseek V4 Pro のトークン 30RMB 分を燃やされた。
| ステージ | ステータス | 説明 |
|---|
| GhostLock FUTEX PI トリガー | ✅ 検証成功 | FUTEX_CMP_REQUEUE_PI が EDEADLK (-35) を返す |
| PI チェーン走査トリガー | ✅ 検証成功 | sched_setattr が PI chain walk をトリガー |
| 2 回目の rb_erase | ❌ 主要ボトルネック | このカーネルの PI チェーン実装は 2 回目の rb_erase に進まない |
| iovstack アライメント | ❌ ブロック中 | 8-iov writev スプレーが rt_mutex_waiter と重ならない |
| mmap(0) バイパス | ❌ ブロック中 | Huawei カーネルの追加チェック (-EINVAL) |
| fops ハイジャック | ❌ ブロック中 | 制御可能な任意書き込みプリミティブなし |
| cred 上書き | ❌ ブロック中 | 上記のボトルネックに制約される |
| 権限昇格完了 | ❌ | 未実装 |
| ルート | 結果 | 原因 |
|---|
| ghostlock64 8-iov writev → FLPI | ❌ | 2 回目の rb_erase がトリガーされない |
| ghostlock64 + sched_setattr | ❌ | 同上。PI チェーンが UAF ページに到達しない |
| g62 3-iov | ❌ | 書き込みは可能だが、値がスタックアドレスのためスタック NX で実行不可 |
| pselect + sched_setattr | ❌ | rb_erase が owner のヒープデータを操作する |
| waiter による 2 回目の FLPI 自己トリガー | ❌ | EDEADLK の高速パスであり、スタックを読み取らない |
| iov オフセットスキャン (22 レイアウト) | ❌ | すべて重ならない |
| mm(0) / mremap バイパス | ❌ | -EINVAL / ENOSYS |
| selinux hook のゼロ化 | ❌ | enforcing フィールドが存在しない |
| Xiaomi 17 Pro Max |
| 6.12.23 |
| ARM64 |
| pubglite55/oppo-ghostlock | OPPO Find N2 | 5.10.236 | ARM64 |