
삼성 Galaxy S21을 대상으로 한 CVE-2026-43499 익스플로잇 체인 연구
이 기기를 위한, 현재 동작 중인 활성 KernelSU 프로젝트: kurtulusakyuz/dfroot-s21 — 거기서 시작하십시오. 이 저장소는 IonStack 연구만 유지합니다.
펌웨어 G991BXXSJHZC2를 실행하는 Samsung Galaxy S21(o1s)용
기기 전용 IonStack 페이로드. 상태: 연구 종료 — 결정론적
DoS 전용; 이 빌드에서는 커널 쓰기 경로가 불가능함이 입증됨.
전체 증거는 RESEARCH.md 참조.
| Field | Value |
|---|---|
| Model | SM-G991B |
| Device | o1s |
| Firmware | G991BXXSJHZC2 |
| Android | 15 / API 35 (AP3A.240905.015.A2, fingerprint samsung/o1sxeea/o1s) |
| Page size | 4096 |
| Kernel | 5.4.242-30958140-abG991BXXSJHZC2 |
| SoC | Exynos 2100 |
| Mitigations | CFI+PAC+PAN/UAO, KDP_CRED, SELinux enforcing, no userfaultfd |
NebuSec/CyberMeowfia에 게시된 IonStack CVE-2026-43499 구현
(업스트림 b850d3bddc74c3328d5fbcc0568d21962b55d949)과
BuSung-dev/CVE-2026-43499-S25U를 기반으로 하며,
F-19-F/IonStackQuest3에 감사를 표합니다.
업스트림 Apache License 2.0은 LICENSE에 유지됩니다(NOTICE 참조).
이 기기용 GhostLock 쓰기 프로그램은 일시 중지된 것이 아니라 완료되어 종료되었습니다. 입증된 내용을 순서대로 정리하면:
remove_waiter()가
waiter->task->pi_blocked_on 대신 current->pi_blocked_on을
지우므로, FUTEX_CMP_REQUEUE_PI 롤백이 스택의 rt_waiter에 대한
댕글링 포인터를 남깁니다. 업스트림 수정 3bfdc63은 5.4.242에
없습니다.sched_setattr을 더하면 기기와 동일한 Oops
(rt_mutex_adjust_prio_chain+0x108 → _raw_spin_trylock+0x1c,
fault VA 0)가 KDP 없는 QEMU 게스트와 실제 폰
(lastkmsg 118/119) 양쪽에서 재현됩니다. 댕글링 슬롯은 완전히
매핑되어 있습니다(스택 상단 E-0x328, 수명 주기는 QEMU+GDB로
특성화됨).lock(+0x38)은
결코 공격자가 제어하지 못함을 보여줍니다(15/15 덤프).
독립적인 포팅(ASUS i005, AQUOS sigreturn 경로)도 같은
벽에 부딪힙니다. 확률이 아니라 기하학의 문제입니다.관련된 2026 커널 LPE 경로들도 이 빌드에서는 펌웨어 설정으로
모두 닫혔습니다(USER_NS, RDS, CRYPTO_USER_API_AEAD 모두
미설정; MFC_USE_DMABUF_CONTAINER=n으로 MFC double-free에
도달 불가; AF_ALG/eBPF는 셸에 대해 게이트됨). 쓰기 이후
산출물(이 정확한 펌웨어용으로 빌드된 KernelSU .ko + ksud)은
별도로 준비되어 있습니다. 이 트리의 src/kernelsnitch/ 헤더는
준비된 상태로 남아 있지만 빌드되지는 않았습니다(쓰기 없이는
소비자가 존재하지 않음).
Makefile build (NDK r27+, ANDROID_NDK_HOME)
src/ exploit source (o1s profile only)
src/targets/o1s-G991BXXSJHZC2/ target.h + p0_fingerprint.h
src/kernelsnitch/ mm_struct leak (futex hash collision, staged)
tools/ p0 fingerprint helper
RESEARCH.md research notes (geometry, verdicts)
export ANDROID_NDK_HOME=/path/to/android-ndk
make clean all
# SLIDE_WRITER_SEL=1|2|3 selects mcast/sigreturn(default)/xattr writers.
# Unset selects the experimental pselect writer (see RESEARCH.md).
출력물(build/o1s-G991BXXSJHZC2/):
cve-2026-43499 (LD_PRELOAD 페이로드), cve-2026-43499-app.so (앱 페이로드),
cve-2026-43499-root (루트 헬퍼).
adb push build/o1s-G991BXXSJHZC2/cve-2026-43499 /data/local/tmp/cve-2026-43499
adb push build/o1s-G991BXXSJHZC2/cve-2026-43499-root /data/local/tmp/cve-2026-43499-root
adb shell chmod 755 /data/local/tmp/cve-2026-43499 /data/local/tmp/cve-2026-43499-root
adb shell "LD_PRELOAD=/data/local/tmp/cve-2026-43499 sh"
# on success:
adb shell "/data/local/tmp/cve-2026-43499-root -c 'id; getenforce'"
기대치 관리: 이 빌드에서 "성공"은 트리거 순회와 그 오라클 출력을 의미합니다 — NULL-lock 순회는 루트를 얻는 대신 기기를 재부팅시킵니다(위의 "최종 상태" 참조). 루트는, 미래의 쓰기 프리미티브를 통해 언젠가 달성된다 하더라도, 재부팅까지만 유지됩니다. 아무것도 플래시되지 않습니다.
/data/local/tmp는 재부팅 시 지워지므로 — 부팅할 때마다 바이너리를
다시 푸시하십시오.