
Эксплойт для повышения привилегий в ядре Linux ARM32 для CVE-2026-43499 (GhostLock futex UAF), нацеленный на Huawei Watch 4 Pro, с множеством вариантов эксплуатации и подробным анализом обхода защиты.
Попытка эксплуатации уязвимости повышения привилегий ядра Linux на основе CVE-2026-43499 (GhostLock) — Huawei Watch 4 Pro (MDS-AL00, armv7l)
Данный проект представляет собой попытку эксплуатации уязвимости ядра GhostLock на устройстве Huawei Watch 4 Pro (MDS-AL00, Snapdragon SW5100, HarmonyOS 4.3.0 AOSP 12) с адаптацией под архитектуру ARM 32-bit (armv7l).
GhostLock (CVE-2026-43499) — это уязвимость futex PI UAF ядра Linux, затрагивающая версии с 2.6.39 по 7.x. Цель данного проекта — реализовать полную цепочку повышения привилегий на часах Huawei.
Исходный репозиторий: MobiusM/CVE-2026-43499 (PoC для arm64)
На ядре 5.4.161 ARM32 после того, как FUTEX_CMP_REQUEUE_PI вызывает EDEADLK, обход цепочки PI не выполняет второй rb_erase. Цепочка эксплуатации GhostLock 64, основанная на UAF → запись в страницу UAF через второй rb_erase, полностью не работает на этом ядре.
Все варианты разброса 8-iov writev не удались: sc[0] after = e3a0002a (страница шелл-кода не была записана).
Разброс 8-iov writev в ghostlock64 полагается на перекрытие массива iovstack[8] в стеке ядра со структурой rt_mutex_waiter. На этом ядре:
clear_refs_operations.writesched_setattr может успешно инициировать обход цепочки PI (проверено success=1600+), но rb_erase оперирует pi_tree_entry потока-владельца (находящегося в task_struct в куче kmalloc), а не данными стека потока-ожидающего (данные fd_set writev).
Следовательно, путь pselect + sched_setattr также не может быть использован для управления записываемым значением.
mmap(0, ..., MAP_FIXED, ...) возвращает -EINVAL, а не стандартный -EACCESCONFIG_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, полагаясь на механизм direct map в ARM64. В 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 # Исходный PoC двойного erase 8-iov (базовый каркас)
│ ├── 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 # Тест самозапуска 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 # Шелл-код
│ ├── trigger*.c # Исходный триггер PoC (проверка наличия уязвимости)
│ ├── ghostlock_root.c # Ранняя попытка получения root
│ └── test_*.c # Тесты компиляции/запуска
├── README.md
├── ghostlock64 # Бинарник PoC двойного erase 8-iov
├── ghostlock63 # Бинарник ghostlock 6.x 3-iov
├── g62_* # Бинарники вариантов 3-iov
├── gl_* # Бинарники тестов pselect
├── gsu # Вариант с перехватом sc-page
├── sc64 # Шелл-код
├── trigger* # Бинарники исходного триггера PoC
└── test_* # Тестовые бинарники
Реализация цепочки PI в этой версии ядра (5.4.161 ARM32) не поддерживает технику двойного rb_erase для произвольной записи GhostLock. Все известные пути эксплуатации CVE-2026-43499 заблокированы на данном устройстве. Требуется обнаружение нового примитива записи нуля или другой уязвимости для продолжения.
Huawei, ты меня подставил, сжёг мои 30 юаней токенов DeepSeek V4 Pro.
| Параметр | Значение |
|---|
| Устройство | 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) |
| Этап | Статус | Описание |
|---|
| Триггер GhostLock FUTEX PI | ✅ Проверено успешно | FUTEX_CMP_REQUEUE_PI возвращает EDEADLK (-35) |
| Обход цепочки PI | ✅ Проверено успешно | sched_setattr инициирует обход цепочки PI |
| Второй rb_erase | ❌ Основное препятствие | Реализация цепочки PI в этом ядре не выполняет второй rb_erase |
| Выравнивание iovstack | ❌ Заблокировано | Разброс 8-iov writev не перекрывается с rt_mutex_waiter |
| Обход mmap(0) | ❌ Заблокировано | Дополнительная проверка ядра Huawei (-EINVAL) |
| Перехват fops | ❌ Заблокировано | Нет контролируемого примитива произвольной записи |
| Перезапись cred | ❌ Заблокировано | Ограничено указанными выше препятствиями |
| Повышение привилегий выполнено | ❌ | Не реализовано |
| Путь | Результат | Причина |
|---|
| ghostlock64 8-iov writev → FLPI | ❌ | Второй rb_erase не срабатывает |
| ghostlock64 + sched_setattr | ❌ | То же самое, цепочка PI не доходит до страницы UAF |
| g62 3-iov | ❌ | Запись возможна, но значение — адрес стека, стек NX не исполняем |
| pselect + sched_setattr | ❌ | rb_erase оперирует данными кучи владельца |
| Повторный FLPI от ожидающего | ❌ | Быстрый путь EDEADLK, не читает стек |
| Сканирование смещений iov (22 варианта) | ❌ | Ни один не перекрывается |
| Обход mm(0) / mremap | ❌ | -EINVAL / ENOSYS |
| Обнуление хуков selinux | ❌ | Поле enforcing отсутствует |
| Xiaomi 17 Pro Max |
| 6.12.23 |
| ARM64 |
| pubglite55/oppo-ghostlock | OPPO Find N2 | 5.10.236 | ARM64 |