
Android-фронтенд для CVE-2026-98260: root-оболочка + поздняя загрузка KernelSU через Shizuku
Android-фронтенд для CVE-2026-98260 (use-after-free в POSIX CPU timer) — того же класса ошибок, что и CVE-2026-64560. Одно нажатие даёт вам root-оболочку, а затем поздно подгружает KernelSU (u:r:ksu:s0).
Сам эксплойт здесь не включён. Этот репозиторий — оболочка приложения вокруг него: UI, определение состояния и инфраструктура Shizuku, необходимая для запуска эксплойта из shell-домена из обычного приложения.
Приложение работает как untrusted_app и не может читать /sys/kernel/tracing, что необходимо эксплойту для утечки и триггера. Поэтому TimerRoot запускает пользовательский сервис Shizuku, который Shizuku выполняет от имени пользователя shell (uid 2000, u:r:shell:s0). Бинарник эксплойта исполняется внутри этого процесса, поэтому получает то же окружение, что и при запуске из adb shell.
MainActivity (untrusted_app)
└─ Shizuku user service (uid 2000, u:r:shell:s0)
├─ extracts assets/timer to /data/local/tmp/timer
└─ runs it; on success keeps /system/bin/sh alive
minSdk 30), arm64Load KernelSU6.12.69-android16-6-g242e1a07f878-ab15865446-4k; см. ниже.TimerRoot ожидает скомпилированный эксплойт по пути app/src/main/assets/timer:
git clone https://github.com/YuKongA/CVE-2026-98260
cp CVE-2026-98260/timer/timer app/src/main/assets/timer
или
scripts/fetch-timer.ps1
Бинарный файл распространяется по лицензии MIT от его авторов; используйте его только на оборудовании, которым вы владеете, и только если ваше ядро соответствует сборке, под которую он был портирован.
Откройте проект и выполните сборку, или:
./gradlew assembleDebug
Для проекта требуется Android SDK с платформой 36 и build-tools 36. Shizuku API подтягивается из Maven (dev.rikka.shizuku:api).
scripts/build.ps1 собирает и подписывает APK, используя только SDK, javac, d8, aapt2 и apksigner. Он ничего не вендорит: он компилирует приложение вместе с исходниками Shizuku API, поэтому сначала склонируйте их:
git clone https://github.com/RikkaApps/Shizuku-API
scripts/build.ps1 -Sdk "C:\Users\<you>\AppData\Local\Android\Sdk"
Shizuku должен быть запущен до того, как TimerRoot сможет что-либо сделать: это процесс, который предоставляет пользователя shell, необходимого для эксплойта. Shizuku останавливается при каждой перезагрузке, поэтому это первый шаг каждый раз.
Отладка по Wi-Fi (без ПК после первой сопряжения)
Через USB
При подключённом телефоне и авторизованной отладке по USB:
adb shell sh /sdcard/Android/data/moe.shizuku.privileged.api/start.sh
Более новые версии Shizuku могут больше не содержать этот скрипт; если его нет, используйте описанный выше способ с беспроводной отладкой.
Проверьте, что сервер запущен:
adb shell ps -A | grep shizuku_server
# shell 12345 1 ... shizuku_server
ps, показывающий только moe.shizuku.privileged.api, означает, что приложение-менеджер открыто, но сервер не запущен; эксплойт не может начать работу, пока он не запущен.
Not connected, нажмите Shizuku в строке инструментов, чтобы запросить снова.Prepare извлекает assets/timer в /data/local/tmp/timer:
installed 307192 bytes
Одно нажатие. Приложение повышает привилегии, удерживает оболочку с uid=0 внутри сервиса, а затем
автоматически запускает позднюю загрузку KernelSU:
[child] woke uid=0
root shell ready - loading KernelSU...
Loading KernelSU... 12s
KSU_LOADED
Карточка переходит в Root shell -> Jailbreak mode (u:r:ksu:s0). Если
этап KernelSU проигрывает гонку, карточка становится красной с надписью KernelSU failed, и
перед повторной попыткой следует перезагрузиться.
Используйте кнопку Reboot. Она работает через сервис (svc power reboot), поэтому
работает даже когда root-оболочка ещё не открыта. Перезагрузка также является единственным чистым способом
удалить припаркованные процессы и выгрузить KernelSU.
После перезагрузки начните снова с шага 1: Shizuku остановлен, а KernelSU выгружен.
Карточка статуса отражает то, что реально активно, определяемое запуском
su -c id и проверкой на u:r:ksu:s0:
| карточка | значение |
|---|---|
| Not connected | Shizuku не запущен / не привязан |
| Ready | Shizuku подключён, root пока нет |
| Root shell | uid=0, u:r:shell:s0 |
| Jailbreak mode | KernelSU загружен, su работает в u:r:ksu:s0 |
KernelSU failed и base calibration failed в логеЭтапу подделки учётных данных нужна база линейного отображения ядра, которую эксплойт выводит из событий трассировки page-alloc. Он предполагает страницы размером 4 КБ:
[base] made=512 best=0 count=0
[-] base calibration failed
Проверьте размер страницы устройства:
adb shell getconf PAGE_SIZE
4096: раскладка отличается по другой причине; соберите uname -r, модель
и полный лог и сообщите об этом в upstream.16384: эксплойт не может работать на этом устройстве в его текущем виде. Его
нужно пересобрать под 16-КБ страницы (сдвиги страниц, маски и размеры порядков), что
является задачей портирования, а не настройкой приложения.Root-оболочка всё ещё может сработать на таком устройстве, поскольку этому пути нужен только утёкший адрес учётных данных, а не база линейного отображения.
Not connectedShizuku не запущен. Запустите его снова (он останавливается при каждой перезагрузке) и см. шаг 1.
Prepare ничего не сообщаетСистемный диалог может перекрывать приложение (сопряжение Shizuku, сканирование установщика OPPO).
Закройте его и нажмите Prepare снова.
Это эксплойт ядра. Прочитайте это перед тем, как что-либо нажимать.