
# Приложение GhostLock с запуском в один клик (CVE-2026-43499)
中文: README_ZH.md
uname -r и отклоняет неподдерживаемые сборки, отображая статус в верхней части. Встроенные профили находятся в app/src/main/assets/kernel_profiles/: один файл HOCON на релиз, index.conf в качестве индекса времени выполнения и шаблоны семейств версий <major.minor>-template.conf.Полный процесс портирования на устройство, ссылки на шаблоны семейств ядер и обоснование настроек см. в Руководстве по портированию профилей ядра.
Строки, явно помеченные Требуется Shizuku, выполняются через shell UserService. Запустите Shizuku через ADB и нажмите на карточку статуса, чтобы предоставить доступ; все остальные строки используют обычный путь выполнения приложения.
Откройте GhostLock и нажмите Run. KernelSU (me.weishu.kernelsu), ReSukiSU (com.resukisu.resukisu) или KowSU (com.kowx712.supermanager) предоставляют ksud для загрузки модулей; без него W1/W2 всё равно предоставляют uid 0, но модуль не загружается.
Цепочка выполнения представляет собой конвейер из трёх компонентов: фронтенд (запуск/передача root_child), бэкенд (примитив futex CVE-2026-43499) и маршрут middleware. Каталогизированные комбинации создаются во время сборки; разрешённый профиль выбирает, какая из них будет запущена. Маршрут гоняет два ядра: на ядрах 6.6/6.12 с tree-waiter главный поток нагружает select, пока поток-потребитель возмущает приоритет waiter'а; на ядрах 6.1 с compact-waiter он прогоняет getsockopt(TCP_ZEROCOPY_RECEIVE) через страницу с пробитым отверстием; ядра 5.15 используют multicast waiter. Пара CPU также берётся из разрешённого профиля.
В adb/shell нет фильтра seccomp, поэтому W3 пропускается — удобно для быстрой проверки:
make -C src ghostlock
./gradlew exportKernelProfiles
adb push build/native/ghostlock /data/local/tmp/ghostlock
adb push build/kernel-profiles/<release>.bin /data/local/tmp/profile.bin
adb shell chmod 755 /data/local/tmp/ghostlock
adb shell /data/local/tmp/ghostlock --load-prebuilt-profile /data/local/tmp/profile.bin
tools/extract_rs извлекает смещения из boot.img (плюс опциональный xbl_config.img), полного OTA ZIP или URL http(s), указывающего на один из них. kallsyms берутся из --kallsyms или восстанавливаются из встроенной таблицы образа. pselect_waiter_shift и off_slide_loggers_0_1 выводятся встроенным дизассемблером arm64. Образы MediaTek не имеют xbl_config.img и обычно не имеют BTF: физический адрес загрузки выводится из kallsyms _text (переопределяется с помощью --phys).
Push-Location tools/extract_rs
cargo build --release
Pop-Location
build/extract/release/ghostlock-extract.exe boot.img --xbl-config xbl_config.img --format conf --out profile.conf
build/extract/release/ghostlock-extract.exe OTA.zip --format conf --out profile.conf
--format conf — это вывод экстрактора: уплощённый, самодостаточный профиль (без строк include, общие константы credential/KernelSnitch для 6.x встроены, маршрут выбирается на основе данных --analysis, если только --route его не переопределяет). Экстрактор выдаёт каждое поле, которое образ действительно даёт, и опускает остальные; он никогда не заполняет пробелы догадками из соседнего семейства ядер (непроверенное семейство 6.6, значение по умолчанию -2, константы multicast для 5.15 или значение phys по умолчанию). Каждый вывод — это непроверенный кандидат: импортируемый и разбираемый, с отсутствующими или недействительными полями, блокируемыми предварительной проверкой приложения перед выполнением, поэтому успешный запуск никогда не подразумевает поддержку устройства. На 5.x он также выводит исправление ссылки на credential из init_cred и геометрию multicast из BTF (см. docs/analysis/extractor-5x-derivation-plan.md). --format json остаётся для пути импорта v1. Чтобы добавить встроенный профиль, заполните и проверьте соответствующий шаблон семейства версий, сохраните его как отдельный профиль .conf и добавьте его в kernel_profiles/index.conf. Старый реестр C offsets.h устарел и удалён.
Образы MediaTek не имеют xbl_config.img и обычно не имеют встроенного BTF, поэтому
экстрактор не может вывести два физических адреса (kernel_phys_load,
kernel_phys_offset) из образа и оставляет их null. Во время выполнения
происходит откат к формуле SoC, которая даёт сбой на W1 на MediaTek. Заполните оба,
запустив отдельный экстрактор tools/mtk-phys/ на рутованном устройстве (он читает
/proc/iomem), и вставьте значения в расширенные переопределения приложения. См.
MEDIATEK.md.
Экстрактор дизассемблирует remove_waiter() перед извлечением смещений. Ядра с исправлением отклоняются с кодом выхода 6; продолжают только уязвимые ядра.
Полный OTA можно проанализировать целиком на телефоне: boot плюс xbl_config
извлекаются автоматически. Передайте --work-dir — каталог, доступный для записи приложению, — при
запуске внутри песочницы приложения. Кросс-компиляция и отправка:
rustup target add aarch64-linux-android
$ndk = "$env:ANDROID_HOME\ndk\<version>\toolchains\llvm\prebuilt\windows-x86_64\bin"
$env:CC_aarch64_linux_android = "$ndk\aarch64-linux-android35-clang.cmd"
$env:AR_aarch64_linux_android = "$ndk\llvm-ar.exe"
$env:CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER = $env:CC_aarch64_linux_android
Push-Location tools/extract_rs
cargo build --release --target aarch64-linux-android
Pop-Location
adb push build/extract/aarch64-linux-android/release/ghostlock-extract /data/local/tmp/
adb shell /data/local/tmp/ghostlock-extract /sdcard/OTA.zip
Новым ядрам больше не нужна пересборка приложения: нажмите Import offsets.conf (HOCON)
и выберите уплощённый .conf экстрактора, или используйте Import offsets.json (v1)
для более старого отчёта JSON. v1 JSON конвертируется внутри приложения, поэтому ничего не нужно
отправлять на устройство: нативный код всегда стартует с документа GLK1, который приложение отправляет
на stdin, и сопоставляет текущий uname -r с разрешённым профилем
перед отклонением ядра. Импорты объединяются между файлами; при уже
сохранённом релизе запрашивается подтверждение перед перезаписью.
Приложение также может само сгенерировать профиль — Parse OTA link (URL полного OTA ZIP)
и Parse image (boot.img + опциональный xbl_config.img) запускают
экстрактор внутри процесса и при успехе записывают уплощённый .conf в каталог данных приложения: