
(CVE-2026-43499)内核漏洞利用程序,适用于未解锁 Bootloader 的一加15T.
Эксплойт ядра для устройств OnePlus 15T с заблокированным загрузчиком. Использует CVE-2026-43499 для получения рут-доступа без разблокировки загрузчика или модификации boot.img.
Только для авторизованных исследований безопасности и образовательных целей.
Модифицировано из оригинального репозитория GhostLock-for-OnePlus, адаптировано для OnePlus 15T (PLZ110 / SM8850 / Snapdragon 8 Elite) с учётом физической памяти и таймингов CPU.
Системный вызов pselect6 копирует fd_set в стек ядра. При совместном использовании с механизмом ожидания futex PI освобождённый стековый фрейм может быть переиспользован как структура rt_mutex_waiter. При обходе цепочки PI перебалансировка rb-дерева записывает контролируемые данные в произвольные адреса ядра.
futex PI UAF (CVE-2026-43499)
├─ Подделка объекта rt_mutex_waiter
├─ Управление стеком ядра через разметку fd_set в pselect/select
├─ Запуск операции rt_mutex PI для произвольной записи
├─ Запись 1: selinux_state.enforcing = 0
└─ Запись 2: cred → init_cred (uid=0, полные возможности)
| Устройство | Кодовое имя | SoC | Ядро | Прошивка | Статус |
|---|---|---|---|---|---|
| OnePlus 15T | PLZ110 | SM8850 (Snapdragon 8 Elite) | 6.12.38-android16-5-g844001fb8721-ab14552068-4k | ColorOS 16.0.9.400 | ✅ Подтверждено |
Для Ace 6T и OnePlus 15 смотрите оригинальный репозиторий.
GhostLock обрабатывает повышение привилегий. Установка KernelSU требует ksud (входит в состав KMI-специфичного kernelsu.ko):
| Источник | Примечания |
|---|---|
| ReSukiSU APK (рекомендуется) | Установите ReSukiSU; APK включает |
Без ksud эксплойт всё равно получит оболочку root с uid=0, но KernelSU не будет установлен, и
suне сохранится.
ANDROID_NDK_HOME или ANDROID_NDK_ROOT# По умолчанию (API 35)
make
# Указать уровень API
make API=34
# Указать путь к NDK
NDK=/path/to/android-ndk make
ghostlock — статически слинкованный ARM64 ELF-исполняемый файл.
# 1. Включить ADB в TCP-режиме
adb tcpip 5555
# 2. Отправить ADB-ключ (требуется для режима bootstrap)
adb push ~/.android/adbkey /data/local/tmp/a/adbkey
# 3. Отправить эксплойт
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 */
};
Когда указатели ядра ограничены (kptr_restrict), утечка базового адреса через boot_id, перезаписанного адресом ядра:
Чтение /proc/sys/kernel/random/boot_id
└─ UUID содержит адрес nfulnl_logger
└─ Сдвиг KASLR = утёкший адрес - смещение образа
└─ kaslr_base
Если устройство ashmem доступно, используйте примитивы чтения/записи configfs для чтения указателей функций из таблицы fops ashmem и вычисления смещения KASLR.
Подделка объектов ядра на страницах order-3 (32 КБ):
file_operations — перехват указателя fops miscdevice ashmemrt_mutex_waiter — имитация узла ожидания в цепочке PItask_struct — ссылка на задачу при обходе PIrt_mutex (блокировка) — корректная информация о waiter/ownerРеализовано через SKB (сокетный буфер) + KernelSnitch:
mm_structsendmsg для заполнения кучи ядраПосле получения базы KASLR используйте буферы канала для доступа к памяти на физическом уровне:
1. Найти буфер канала в physmap
2. Подделать таблицу операций pipe_buffer, указывающую на известные pipe_buf_ops
3. Перехватить pipe_buffer.page для указания на целевой физический адрес
4. Произвольное физическое чтение/запись через обычные операции с каналом
Поддерживается: pipe_read64, pipe_write64, pipe_phys_read_data, pipe_phys_write_data
Цель: selinux_state.enforcing (смещение 0x00)
Метод: запись PI дочернего узла → подделка __rb_parent_color waiter,
указывающего на selinux_enforcing - 8
перебалансировка rb-дерева записывает 0x00
Цель: указатель cred дочернего процесса
Метод: 1. fork дочернего процесса → perf_find_task() найти task_struct
2. вычислить смещение поля cred
3. запись PI дочернего узла → cred = init_cred (uid=0, полные возможности)
4. очистить seccomp (TIF_SECCOMP + обнуление структуры seccomp)
После перезаписи cred выполняется проверка возможностей чтением.
src/core/miniadb.c — лёгкий клиент протокола ADB для режима bootstrap:
1. TCP подключение к 127.0.0.1:5555
2. A_CNXN → запрос соединения
3. A_AUTH → вызов с RSA токеном
4. dlopen("libcrypto.so") → PEM_read_bio_RSAPrivateKey → RSA_sign
5. A_AUTH (AUTH_SIGNATURE) → подписанный ответ
6. A_CNXN → соединение установлено
7. A_OPEN "shell:/data/local/tmp/a/e" → полный эксплойт
Поддерживаются алгоритмы подписи SHA-1 и SHA-256.
ghostlock-oneplus/
├── Makefile # Конфигурация сборки (кросс-компиляция NDK)
├── README.md # Документация
├── src/
│ ├── core/ # Основной код эксплойта
│ │ ├── main.c # Точка входа: двухэтапная запись + root shell
│ │ ├── fops.c # Режим FOPS/CFI: маршрут pselect, запись PI, утечка KASLR
│ │ ├── util.c # Утилиты: распыление кучи, KASLR, примитивы R/W ядра
│ │ ├── slide.c # Режим SLIDE: утечка KASLR через boot_id + маршрут pselect
│ │ ├── pipe.c # Физическое R/W через буфер канала (physrw)
│ │ ├── root.c # Перезапись cred, очистка seccomp, управление дочерним root
│ │ ├── miniadb.c # Встроенный ADB клиент (TCP + RSA аутентификация)
│ │ ├── common.h # Глобальные макросы, структуры, объявления, константы
│ │ ├── target.h # Расположение памяти / смещения структур / параметры KASLR
│ │ ├── offset.h # Мост конфигурации цели времени компиляции (#include TARGET_CONFIG_H)
│ │ └── kernelsnitch/ # KernelSnitch — утечка адреса mm_struct
│ │ ├── kernelsnitch.h # Основной алгоритм: коллизия хеша futex + перебор
│ │ ├── futex_hash.h # Функция хеша futex
│ │ ├── timeutils.h # Измерение времени CPU (RDTSC)
│ │ └── utils.h # Вспомогательные макросы (pr_info / SYSCHK / ASSERT и т.д.)
│ └── devices/ # Таблицы смещений для устройств
│ ├── offsets.h # Агрегирует все смещения устройств (таблица поиска + sentinel)
│ ├── ace6t/offsets.h # Смещения OnePlus Ace 6T (2 версии ядра)
│ └── op15/offsets.h # Смещения OnePlus 15 (1 версия ядра)
└── tools/ # Инструменты извлечения смещений
├── extract_target.py # Извлечение смещений глобальных символов kallsyms (28 элементов)
└── extract_btf.py # Извлечение смещений полей структур BTF (57 элементов)
Этот репозиторий был модифицирован; детали смотрите в оригинальном репозитории.
Убедитесь, что вы запускаете в ADB shell. Контекст приложения требует --bootstrap.
Ваша версия ядра пока не поддерживается. Следуйте инструкциям Добавление новых устройств для извлечения смещений и пересборки.
CORE)PSELECT_ENTER_DELAY_USECperf_event_open (используйте --bootstrap в контексте приложения)kaslr_base валиден)ksud существует и исполняемload_policy)Только для авторизованных исследований безопасности и образовательных целей.
| Пункт | Детали |
|---|
| CVE | CVE-2026-43499 |
| Тип | Use-After-Free в Futex PI (Priority Inheritance) |
| Область действия | Ядро Linux 2.6.39 ~ 7.1 |
| Исправлено в | Mainline 7.1 (коммит 3bfdc63936dd) |
| Статус Android | GKI 6.12.x всё ещё уязвим |
libksud.so| CI Релиз | Скачайте из ReSukiSU CI (ksud-aarch64-linux-android.zip) |
| Тип | Количество | Извлечение |
|---|
| Глобальные символы 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 | Операции с буфером канала |
file_operations | 13 | Таблица поддельных fops |
mm_struct | 1 | Владелец дескриптора памяти |
| Модуль | Файл(ы) | Ответственность |
|---|
| Вход | main.c | Разбор CLI, диспетчеризация W1/W2, поток bootstrap |
| Маршрут PI | fops.c / slide.c | Разметка стека pselect/select, манипуляции цепочкой futex PI |
| KASLR | util.c / fops.c / slide.c | Обход в двух режимах: утечка boot_id + утечка таблицы fops |
| Распыление кучи | util.c | Выделение страниц order-3, распыление SKB, компоновка поддельных объектов |
| Физическое R/W | pipe.c | Перехват буфера канала, произвольный доступ к физической памяти |
| Повышение привилегий | root.c | Перезапись cred, проверка возможностей, очистка seccomp |
| ADB | miniadb.c | Лёгкий клиент протокола ADB, RSA аутентификация |
| Движок утечки | kernelsnitch/ | Коллизия хеша futex для определения местоположения mm_struct |