
GhostLock (CVE-2026-43499) — приложение для серии Galaxy S26
indev.ghostlock.s26)Обёртка для Android в один клик для 1ndevelopment/ghostlock-s26: GhostLock (CVE-2026-43499), портированный на всю серию Samsung Galaxy S26 (Android 16 / GKI 6.12). Один APK, три линии ядра, сопоставление параметров во время выполнения — без вариантов приложения под каждую сборку.
Используйте только на устройствах, которыми вы владеете или которые вам явно разрешено тестировать. Временный root исчезает при перезагрузке. Второй запуск эксплойта в рамках той же загрузки может привести к падению устройства — перезагрузите перед повторной попыткой.
Эксплойт сопоставляет по линии ядра, а не по отдельной сборке
(exploit/src/params_table.c — источник истины; ParamsTable.kt дублирует
его только для вердикта в UI):
| Кодовое имя устройства | Маркетинговое название | SoC | Линия ядра |
|---|---|---|---|
| m1q | Galaxy S26 (SM-S942x) | Snapdragon | cn или intl (по CSC) |
| m2q | Galaxy S26+ (SM-S947x) | Snapdragon | cn или intl (по CSC) |
| m3q | Galaxy S26 Ultra (SM-S948x) | Snapdragon | cn или intl (по CSC) |
| m1s | Galaxy S26 (SM-S942B) | Exynos | exynos |
| m2s | Galaxy S26+ (SM-S947B) | Exynos | exynos |
Протестированные сборки (17): S9420ZCS4AZG1, S9470ZCS4AZG1, S9480ZCS3AZF1, S9480ZCS4AZG1, S942BXXS4AZG5, S947BXXS3AZF1, S947BXXS4AZG5, S942QOPU1AZDE, S942U1UES4AZG3, S942USQS4AZG3, S947USQS4AZG3, S9480ZHS4AZG1, S948BXXS4AZG5/6, S948NKSS4AZG3, S948U1UES2AZE1, S948USQS4AZG3.
Неизвестные OTA обрабатываются точно так же, как в upstream params.c: сначала
точная сборка, затем та же модель + 3-символьный CSC (переиспользование OTA),
затем последняя запись для того же устройства (помечается как непроверенная),
иначе fail-closed (приложение показывает UNSUPPORTED, а нативный слой
завершается с кодом 2). Полностью неизвестные модели отклоняются — никогда не
форсируются.
Одна большая кнопка — Root my S26 — запускает весь конвейер и ведёт повествование в карточке Output:
adb shell из README). Разрешение
запрашивается один раз при запуске (и снова, если сервер перезапускается);
поток Root ждёт предоставления разрешения, а не прерывается. Если сервер
не работает, приложение открывает менеджер Shizuku, чтобы вы могли его
запустить, затем переключается на встроенный shell. Добавление приложения
в белый список Shizuku полностью убирает запрос.preload.so, su_daemon, ksud в /data/local/tmp
(preload.so, cve-2026-43499-root, ksud) и выполняет chmod. Если вы
уже сделали adb push файлов согласно upstream README, они подхватываются
на месте.Ниже: одна строка поле команды + Run as root (одноразовые команды через
протокол C su-демона; интерактивный PTY вне области охвата v1), и небольшая
ссылка Reset, которая очищает /data/local/tmp/ghostlock-boot.log, чтобы
можно было повторить запуск без перезагрузки (upstream предупреждает, что это
может вызвать панику — перезагрузка безопаснее).
exploit/ vendored upstream (Makefile + src/, источник истины)
ksud upstream prebuilt KernelSU loader (ARM64 PIE, также в assets)
app/src/main/assets/ksud staged copy shipped in the APK
app/src/main/assets/ + preload.so / su_daemon after stage-assets.sh
app/src/main/cpp/ optional CMake rebuild of preload.so from exploit/src
app/src/main/java/indev/ghostlock/s26/
MainActivity.kt UI (device / stage / run / shell / boot guard)
ParamsTable.kt series table mirror (17 builds, 3 lines, 5 codenames)
DeviceCompat.kt Build.* identity + series verdict
ShellRunner.kt Shizuku (uid 2000) + local fallback, staging
SuClient.kt /data/local/tmp/temp_su.sock 'C'-mode client
GhostlockManager.kt exit-code interpreter (0/1/2/3/4)
PORTING.upstream.md porting notes (new firmware = new device_map row)
Требования: Android Studio (JBR 21) / SDK 35 / NDK r26+ / CMake 3.22.1 / JDK 17.
# 1. Build the native payloads with the NDK (upstream flow):
cd exploit && make preload
# -> build/bin/preload.so, build/embed/su_daemon_aarch64_pie
# 2. Stage them into the APK assets:
./stage-assets.sh
# 3. Build the app:
./gradlew :app:assembleDebug
# -> app/build/outputs/apk/debug/app-debug.apk
ksud уже включён в репозиторий (ksud + app/src/main/assets/ksud), так что
шаги 1–2 создают только два вывода NDK. Цель CMake в
app/src/main/cpp/CMakeLists.txt может дополнительно пересобрать libpreload.so
из тех же исходников внутри APK в качестве запасного варианта.
aapt2/NDK из SDK — x86_64 и не могут выполняться на устройстве. Проверенная
процедура (SDK в ~/android-sdk, Gradle 8.9 — AGP 8.5.2 отвергает системный
Gradle 9.x):
# Native payloads with the Termux toolchain (API 35 target, system liblog):
cd exploit
clang -O2 --target=aarch64-linux-android35 -fPIE -pie -Isrc src/su_daemon.c \
-o build/embed/su_daemon_aarch64_pie
clang -O2 --target=aarch64-linux-android35 -fPIC -Isrc \
-Wno-unused-parameter -Wno-sign-compare -Wno-unused-function -Wno-macro-redefined \
src/main.c src/util.c src/bootclaim.c src/slide.c src/fops.c src/attr.c \
src/root.c src/params.c src/params_table.c src/preload.c \
-L/system/lib64 -llog -shared -o build/bin/preload.so
cd .. && ./stage-assets.sh
# APK (CMake native step auto-skips without SDK cmake; Termux aarch64 aapt2
# is injected via -P so checked-in files stay workstation-clean):
env ANDROID_HOME=~/android-sdk ANDROID_SDK_ROOT=~/android-sdk \
JAVA_HOME=$PREFIX/lib/jvm/java-21-openjdk \
~/gradle-dists/gradle-8.9/bin/gradle :app:assembleDebug --console=plain \
-Pandroid.aapt2FromMavenOverride=$(command -v aapt2)
uid=0 …. Затем выполняйте команды в карточке
Root shell.me.weishu.kernelsu);
демон автоматически поздне загружает ksud (см. режим K в su_daemon.c).Shizuku необязателен, но настоятельно рекомендуется: upstream-поток выполняется
из adb shell (uid 2000, SELinux-контекст shell), а встроенный запасной
вариант (untrusted_app) гораздо чаще блокируется для LD_PRELOAD/exec на
/data/local/tmp.
exploit/ + PORTING.upstream.md + ksud из
1ndevelopment/ghostlock-s26 (Apache-2.0; см. LICENSE.upstream,
NOTICE.upstream). Приложение не линкует код эксплойта в свой процесс —
оно размещает файлы, собранные NDK, и запускает задокументированный
LD_PRELOAD shell.env LD_PRELOAD=/data/local/tmp/preload.so sh.so_exitBOOT_FORCE=1id сообщает uid=0 через любой канал:
сначала сокет временного демона, затем su в стиле KernelSU. Это важно,
потому что при полном успехе su_daemon по замыслу удаляет свой сокет и
завершается (передача управления KernelSU) — мёртвый временный сокет при
работающем su означает, что root получен, а не что всё сломано. Выводит
хвост лога boot-claim и сообщает рекомендации по rooted / коду выхода.| Код | Значение | Что делать |
|---|
| 0 | успех (сокет поднят, поздняя загрузка ksud OK) | Check root, используйте shell |
| 1 | гонка проиграна / проверка не удалась | просто повторите (нормально) |
| 2 | неподдерживаемая сборка (fail-closed) | остановитесь; прошивке нужен порт |
| 3 | carrier/root не удался | перезагрузите перед следующей попыткой |
| 4 | уже запускалось в этой загрузке | перезагрузите; BOOT_FORCE=1 переопределяет, но может упасть |