
Futex-PI use-after-free 취약점을 이용한 CVE-2026-43499 Android 커널 익스플로잇으로, Xiaomi XIG04에서 ADB를 활성화하기 위해 임시 루트 권한을 획득합니다. 자동화된 페이로드 빌드와 원탭 활성화를 포함합니다.
개발자 옵션에 접근할 수 없는 au/KDDI Xiaomi "aristotle"(XIG04, Android 12) 기기에서 CVE-2026-43499로 얻은 임시 루트를 사용하여 ADB를 켜는 최소한의 Android 앱입니다. KingRoot와 같은 범주의 기기 소유자 도구로, 자신의 휴대폰을 루팅하여 설정 하나를 변경합니다.
범위: 다음 펌웨어를 실행하는 본인의 XIG04
Xiaomi/XIG04_jp_kdi/XIG04:12/SP1A.210812.016/V14.0.3.0.TMFJPKD. 범용 또는 원격 익스플로잇이 아닙니다.
버튼 하나, 작업 하나:
preload.so)를 APK에서 앱의 개인 filesDir로
스테이징하고 chmod 0700을 적용합니다.LD_PRELOAD가 해당 페이로드를 가리키는 단기 실행 /system/bin/true를
실행하여 커널 버그를 작동시킵니다. 페이로드의 ELF 생성자가 Futex-PI
use-after-free를 트리거하여 임시 루트를 획득하고 su 클라이언트와
데몬을 자체 설치합니다.su -c id를 실행하고 uid=0을 확인하여 루트를 확인합니다.settings put global development_settings_enabled 1settings put global adb_enabled 1stop adbd; start adbd (setprop ctl.restart adbd로 대체)모든 단계가 화면의 로그로 출력됩니다.
CVE-2026-43499 — Linux 커널 Futex-PI 경로(kernel/locking/rtmutex.c,
remove_waiter())의 use-after-free 취약점입니다. aristotle의
5.10.136-android12 커널이 영향을 받습니다(CONFIG_FUTEX_PI=y,
CONFIG_RT_MUTEXES=y). 이 익스플로잇은 데이터 전용 "direct-root"(cred 교체,
SELinux enforcing 전환)를 사용하고 MTE 태그를 브루트포스하여 기기의
하드닝을 우회합니다. 익스플로잇 소스와 측정된 aristotle 오프셋은 이 저장소의
exploit/ git 서브모듈에 있습니다.
preload.so는 커밋되지 않습니다. exploit/ 서브모듈에서 생성되어
빌드 시점에 APK에 포함됩니다:
exploit/ — git 서브모듈: CVE-2026-43499 aristotle 익스플로잇(preload.so
빌드).buildExploitSo(preBuild에 연결됨)는 익스플로잇의
make ... API=31을 실행한 다음, APK가 패키징되기 전에 결과 preload.so를
app/src/main/assets/exploit/preload.so로 복사합니다.따라서 Android NDK가 설치되어 있으면 일반적인 ./gradlew assembleDebug로
페이로드를 빌드하여 함께 배포합니다.
# 1. fetch the exploit submodule
git submodule update --init --recursive
# 2. install the Android NDK r29 (the exploit Makefile auto-detects it,
# or export ANDROID_NDK_ROOT), plus JDK 17 and Android SDK platform 34
# 3. build — auto-builds preload.so (API=31) and embeds it
./gradlew assembleDebug # -> app/build/outputs/apk/debug/app-debug.apk
NDK가 없거나 앱 셸만 필요한가요? 페이로드 빌드를 건너뛰세요(그러면 앱이 실행 시 "exploit payload NOT deployed"라고 보고하며 런타임에 아무것도 변경하지 않습니다):
./gradlew assembleDebug -PskipExploitBuild
래퍼 jar: gradle-wrapper.jar는 커밋되지 않습니다.
gradle wrapper --gradle-version 8.2로 한 번 생성하거나 시스템 Gradle로
빌드하세요(CI는 시스템 Gradle을 사용하므로 래퍼 jar가 필요하지 않습니다).
.github/workflows/build-release.yml(GitHub Actions)은 모든 push에서
APK를 빌드하고 app-debug.apk를 첨부하여 GitHub Release(태그
build-<run>)로 게시합니다. 워크플로는 exploit 서브모듈을 체크아웃하고
JDK 17 / Android SDK 34 / NDK r29를 설치한 다음 gradle assembleDebug를
실행하여 preload.so(API=31)를 빌드하고 포함합니다.
1회성 설정: 이 저장소와 익스플로잇 저장소를 동일한 GitHub 소유자 아래
형제 저장소로 푸시하여 서브모듈의 상대 URL이 올바르게 해석되도록 하세요.
익스플로잇 저장소가 비공개인 경우 repo 범위의 PAT를 시크릿
SUBMODULE_PAT으로 추가하고 워크플로의 token: 줄 주석을 해제하세요.
.
├── settings.gradle / build.gradle / gradle.properties Gradle wiring
├── gradlew(.bat) + gradle/wrapper/ wrapper
├── exploit/ git submodule (builds preload.so)
└── app/
├── build.gradle minSdk 31 / targetSdk 31 / compileSdk 34, arm64-v8a; buildExploitSo task
└── src/main/
├── AndroidManifest.xml single launcher Activity, no dangerous perms
├── java/.../MainActivity.kt button + scrolling log
├── java/.../ExploitRunner.kt stage → LD_PRELOAD → su -c "settings ..."
├── res/{layout,values}/ UI, strings, theme
└── assets/exploit/ preload.so is embedded here at build time
git submodule update --init --recursive를 실행하고 NDK를 설치한 다음
./gradlew assembleDebug를 실행합니다.adb_enabled is now: 1로 끝납니다.adb_enabled는 일반적으로 유지되며, 일단 활성화되면 adbd는 루트가 필요
없습니다.LD_PRELOAD를 통한 앱 비공개 파일 실행은 앱 도메인에
따라 거부될 수 있습니다. 익스플로잇 자체 전략이 이를 처리하며, 거부 사항은
숨기지 않고 로그에 표시됩니다.