
Эксплойт ядра для CVE-2026-43499 на Samsung Galaxy A17, обеспечивающий получение root-доступа через обход KDP, восстановление KASLR и выполнение поддельной workqueue с постоянным shell.
Полная цепочка эксплуатации от пользователя до root для CVE-2026-43499 («GhostLock») на Samsung Galaxy A17 SM-A175F, работающем под управлением Android 16 / GKI 6.12.
Цепочка начинается с публичных примитивов GhostLock и заканчивается выполнением usermode helper с правами:
uid=0(root) gid=0(root) groups=0(root)
context=u:r:kernel:s0
Он также запускает постоянную root-оболочку на каждую загрузку через g4d / g4sh и завершается без паники ядра.
📖 Полное техническое описание:
https://www.mobilehackinglab.com/blog/cve-2026-43499-ghostlock-a17-root-shell
Примечание к исследованию
Мы не обнаружили CVE-2026-43499. Заслуга за оригинальную уязвимость и исследование IonStack принадлежит Nebula Security.
Этот репозиторий документирует наш независимый порт на Samsung Galaxy A17, изменения, необходимые для защиты ядра Samsung, и новую финальную стадию эксплуатации.
Только для авторизованных исследований в области безопасности и образовательных целей.
| CVE | CVE-2026-43499 — "ghostlock" |
| Устройство | Samsung Galaxy A17 (SM-A175F, mt6789) |
| GPU | Mali-G57 |
| Ядро | 6.12.23-android16-5-abA175FXXS3BZA5-4k |
| Результат | uid=0(root) / u:r:kernel:s0 |
| Root-оболочка | демон g4d + клиент g4sh |
| Постоянство | На каждую загрузку |
| Завершение эксплойта | Чистое, без паники ядра |
| Встреченные защиты | Samsung KDP, DEFEX, SELinux, PANIC_ON_OOPS, arm64 KASLR |
| Поддерживаемая прошивка | A175FXXS3BZA5 (ядро 6.12.23) и A175FXXS6CZG1 (ядро 6.12.38, SPL 2026-07-05) — обе проверены на устройстве, одна и та же цепочка |
Оригинальное исследование ghostlock предоставляет примитивы входа:
pselect reclaim
↓
fake rt_mutex_waiter
↓
constrained rb-tree pointer write
Однако на Galaxy A17 стандартный финальный этап с подменой учётных данных не работает.
KDP защищает связанные с учётными данными данные ядра на уровне EL2.
В этой сборке попытки изменить учётные данные задачи молча отбрасывались, даже когда целевые адреса были верными.
Поэтому вместо записи root-учётных данных этот порт заставляет ядро выполняться с уже существующими привилегированными учётными данными.
Заключительный этап:
constrained kernel write
↓
physical read/write channel
↓
KASLR slide recovery
↓
discover system_wq / cpu_pwq
↓
forge work_struct
↓
call_usermodehelper_exec_work
↓
/system/bin/sh
↓
uid=0(root), u:r:kernel:s0
Сфабрикованный рабочий элемент помещается в привязанный пул system_wq и запускается штормом выделения/освобождения ptmx.
В результате usermode helper выполняется с учётными данными init.
Перезапись учётных данных задачи не требуется.
userspace shell (uid 2000)
│
▼
pselect / PI-futex primitive
│
▼
constrained aligned kernel pointer write
│
▼
forged pipe_buffer channel
│
▼
arbitrary physical read/write
│
├── recover KASLR slide
│
├── locate system_wq / cpu_pwq
│
└── prepare forged work_struct
│
▼
queue usermode-helper work
│
▼
ptmx storm wakes worker
│
▼
/system/bin/sh runs with init creds
│
▼
uid=0(root)
│
▼
g4d → @ghostlockd → g4sh
По сравнению с публичным портом для OnePlus, большинство этапов после исходного примитива записи были переработаны.
Финальная стадия с патчингом учётных данных была заменена на поддельный элемент workqueue, нацеленный на путь выполнения usermode-helper.
Это полностью исключает запись в защищённые структуры cred.
Предыдущий подход с привязкой к perf-событиям был ненадёжен на этом устройстве.
Вместо этого эксплойт использует три сдвинутых указателя из записи ctl_table для boot_id:
procname
data
proc_handler
Все три проходят перекрёстную проверку перед принятием слайда.
cpu_pwq обнаруживается путём обхода:
system_wq → pwqs
а не полагаться на фиксированное смещение, зависящее от устройства.
Исходный канал оставляет побочные изменения состояния struct page, которые могут вызвать PANIC_ON_OOPS при завершении работы.
Текущая цепочка избегает краха при завершении работы и была продемонстрирована с чистым выходом после получения root.
Помощник в пользовательском режиме запускает:
g4d
который прослушивает абстрактный Unix-сокет:
@ghostlockd
g4sh подключается к нему и предоставляет либо интерактивную root-оболочку, либо однократное выполнение команды.
/data/local/tmp/a/g4sh
/data/local/tmp/a/g4sh -c "id"
Эта цель сочетает несколько защит, которые ломают распространённые техники эксплуатации ядра Android:
Это вынудило применить иную стратегию эксплуатации по сравнению с обычной:
arbitrary RW → patch cred → disable SELinux
Вместо этого:
arbitrary RW → recover runtime state → forge kernel work → execute usermode helper
Требуется актуальный Android NDK.
make # BZA5 firmware (kernel 6.12.23)
make czg1 # CZG1 firmware (kernel 6.12.38): per-target slide anchors,
# offsets are uname-keyed at runtime
Создаёт:
ghostlock # exploit (ghostlock-czg1 for the CZG1 build)
g4d # static root-shell daemon
g4sh # root-shell client
Загрузите бинарные файлы:
adb push ghostlock /data/local/tmp/a/g4
adb push g4d /data/local/tmp/a/g4d
adb push g4sh /data/local/tmp/a/g4sh
adb shell 'chmod 755 /data/local/tmp/a/g4 /data/local/tmp/a/g4d /data/local/tmp/a/g4sh'
Запустите цикл эксплуатации с учётом перезагрузки:
./scripts/rr_loop4.sh
После ROOTED:
adb shell /data/local/tmp/a/g4sh
Или выполните одну команду:
adb shell '/data/local/tmp/a/g4sh -c "id"'
Ожидаемый результат:
uid=0(root) gid=0(root) groups=0(root) context=u:r:kernel:s0
Эксплойт является вероятностным и сильно зависит от условий загрузки.
Для успешной эксплуатации может потребоваться несколько попыток. Входящий в комплект скрипт rr_loop4.sh автоматически обрабатывает повторные попытки и циклы перезагрузки.
Это исследовательский эксплойт, а не инструмент для мгновенного получения root-доступа.
qemu-e2e/ содержит стенд для сквозной валидации с использованием извлечённого ядра Samsung.
Стенд использовался для проверки:
g4d / g4shСам образ ядра Samsung не включён.
См.:
qemu-e2e/
для инструкций по установке.
Makefile
src/ exploit source and device profiles
src/daemon/ g4d root daemon + g4sh client
docs/OFFSETS.md validated device offsets
docs/PORTING.md porting notes
examples/ proof-of-root artifacts
scripts/rr_loop4.sh reboot-aware exploit loop
qemu-e2e/ end-to-end QEMU validation