
GhostLock (CVE-2026-43499) Galaxy S26 시리즈용 앱
indev.ghostlock.s26)1ndevelopment/ghostlock-s26를 위한 원클릭 Android 래퍼: GhostLock (CVE-2026-43499)을 삼성 Galaxy S26 시리즈 전체 (Android 16 / GKI 6.12)에 포팅한 것입니다. APK 하나, 커널 라인 세 개, 런타임 파라미터 매칭 - 빌드별 앱 변형이 없습니다.
본인이 소유하거나 명시적으로 테스트 권한을 받은 기기에서만 사용하십시오. 임시 루트는 재부팅 시 사라집니다. 동일 부팅 세션에서 익스플로잇을 두 번 실행하면 기기가 충돌할 수 있습니다 - 재시도 전에 재부팅하십시오.
익스플로잇은 개별 빌드가 아닌 커널 라인으로 매칭합니다
(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는 업스트림 params.c와 정확히 동일하게 폴백합니다: 정확한 빌드 우선,
그다음 동일 모델 + 3자리 CSC (OTA 재사용), 그다음 동일 기기의 최신 항목
(미검증으로 표시), 그 외에는 fail-closed (앱은 UNSUPPORTED를 표시하고
네이티브 레이어는 종료 코드 2로 종료). 완전히 알 수 없는 모델은 거부됩니다 - 강제 실행되지 않습니다.
큰 버튼 하나 - Root my S26 - 가 전체 파이프라인을 실행하고 Output 카드에 진행 상황을 설명합니다:
adb shell 흐름과 동일한 컨텍스트 계열). 권한은 실행 시 한 번 요청되며
(서버가 재시작되면 다시 요청), Root 흐름은 포기하지 않고 권한 부여를 기다립니다.
서버가 꺼져 있으면 앱이 Shizuku 매니저를 열어 시작할 수 있게 한 뒤, 인앱 셸로
폴백합니다. 앱을 Shizuku 허용 목록에 추가하면 프롬프트가 완전히 사라집니다.preload.so, su_daemon, ksud를 /data/local/tmp로 복사하고
(preload.so, cve-2026-43499-root, ksud) chmod합니다. 업스트림 README대로
이미 adb push한 파일이 있다면 그 자리에서 그대로 사용됩니다.env LD_PRELOAD=/data/local/tmp/preload.so sh (.so 생성자가 체인을 실행하고
합니다; stdout이 익스플로잇 로그입니다), 최대 5회 시도 -
레이스는 확률적입니다. 스위치도 사용 가능하지만 재부팅이 더 안전합니다.그 아래에는: 단일 명령 필드 + Run as root 행 (su 데몬의 C 프로토콜을 통한
일회성 명령; 대화형 PTY는 v1 범위 밖), 그리고 /data/local/tmp/ghostlock-boot.log를
지워 재부팅 없이 실행을 재시도할 수 있게 하는 작은 Reset 링크가 있습니다
(업스트림은 이것이 패닉을 유발할 수 있다고 경고합니다 - 재부팅이 안전한 경로입니다).
exploit/ vendored upstream (Makefile + src/, authoritative)
ksud upstream prebuilt KernelSU loader (ARM64 PIE, also in 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는 이미 vendored되어 있으므로 (ksud + app/src/main/assets/ksud) 1–2단계는
두 개의 NDK 출력물만 생성합니다. app/src/main/cpp/CMakeLists.txt의 CMake 타깃은
추가로 동일한 소스에서 libpreload.so를 APK 내부에서 폴백으로 재빌드할 수 있습니다.
SDK의 aapt2/NDK는 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를 자동으로 late-load합니다 (su_daemon.c의 K 모드 참조).Shizuku는 선택 사항이지만 강력히 권장됩니다: 업스트림 흐름은 adb shell
(uid 2000, shell SELinux 컨텍스트)에서 실행되며, 인앱 폴백
(untrusted_app)은 /data/local/tmp에서 LD_PRELOAD/exec이 차단될 가능성이
훨씬 높습니다.
exploit/ + PORTING.upstream.md + ksud는
1ndevelopment/ghostlock-s26에서 가져옴 (Apache-2.0; LICENSE.upstream,
NOTICE.upstream 참조). 앱은 자체 프로세스에 익스플로잇 코드를 링크하지
않습니다 - NDK로 빌드된 파일을 스테이징하고 문서화된 LD_PRELOAD 셸을
스폰할 뿐입니다._exitBOOT_FORCE=1id가 uid=0을 보고하는지 확인합니다:
temp-daemon 소켓 우선, 그다음 KernelSU 스타일 su. 이는 완전 성공 시 su_daemon이
설계상 소켓을 unlink하고 종료하기 때문에 중요합니다 (KernelSU로 핸드오버) -
죽은 temp 소켓과 작동하는 su가 있다면 루팅된 것이지 망가진 것이 아닙니다.
boot-claim 로그 꼬리를 출력하고 루팅 여부 / 종료 코드 조언을 보고합니다.| 코드 | 의미 | 할 일 |
|---|
| 0 | 성공 (소켓 활성, ksud late-load OK) | Check root, 셸 사용 |
| 1 | 레이스 실패 / 검증 실패 | 그냥 재시도 (정상) |
| 2 | 미지원 빌드 (fail-closed) | 중단; 펌웨어 포팅 필요 |
| 3 | carrier/root 실패 | 다음 시도 전 재부팅 |
| 4 | 이번 부팅에서 이미 실행됨 | 재부팅; BOOT_FORCE=1이 재정의하지만 충돌 가능 |