
CVE-2026-98260에 대한 ARM64 Android 개념 증명으로, 커널 Timer 하위 시스템의 POSIX 타이머 UAF이며, 전체 레이스, 힙 스프레이, 루트 권한 상승 체인을 포함합니다.
Infinity Core 시리즈 Timer 서브시스템 취약점의 ARM64 구현으로, 대상 커널 형태는 7.0 계열(Ubuntu 26.04 7.0.0-30-generic 동일 소스 코드 구조)입니다. 이 저장소는 완전한 트리거 및 권한 상승 체인을 구현하며, 핵심 오프셋은 해당 대상 버전 구조 레이아웃에 맞춰 하드코딩되어 있어 대상 vmlinux와 직접 대조하여 심볼 주소를 수정할 수 있습니다.
비 leader 스레드가 exec()를 호출할 때 de_thread()가 TID를 교환하고 release_task(leader)를 수행하며, POSIX 타이머 정리는 여러 실패 가능한 작업 뒤에 배치된다. exec가 실패하면 이미 해제된 k_itimer의 timerqueue 노드가 살아 있는 태스크의 timerqueue에 남아 있고, 이후 정리 과정에서 해당 노드를 다시 역참조하여 UAF가 발생한다.
익스플로잇 체인: oracle 스레드 풀로 경쟁 조건 유발 → AIO ring 힙 스프레이로 UAF 객체 회수 → elist로 task 주소 유출 → 제어된 페이지로 fake timer + fake cred 구성 → timerqueue 제거 시 이중 쓰기로 fake cred를 task->cred에 기록 → setresuid(0)로 root shell 획득.
k_itimer.it.cpu.elist 0xe0
k_itimer.it.cpu.handling 0xf0
k_itimer.it_interval 0x68
k_itimer 크기 0x180
task_struct.cpu_timers 헤더 0xca0
task_struct.cred 0xd00
cred.uid/gid/euid/... 4/8/14/18/24/28/34/38
cred.cap_inh/prm/eff 0x30/0x40/0x50
cred.security 0x80
cred.user_ns 0x90
cred 크기 0xb8
대상 머신에 맞춰 수정해야 하는 것: 심볼 주소(로컬 KASLR 유출로 자동 보정되므로 하드코딩 불필요).
timer_lpe.c 메인 프로그램
ic_timer_target.h 구조 레이아웃 (하드코딩됨)
ic_compat.h syscall 래퍼, AArch64 어셈블리 원시 연산
ic_util.h 범용 도구
ic_shellcode_arm64.c AArch64 shellcode 생성기
ic_target.h 기타 오프셋
export ANDROID_NDK_HOME=/path/to/ndk
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang \
-O2 -std=gnu11 -static -fno-stack-protector -fno-pic -no-pie \
-I. timer_lpe.c ic_shellcode_arm64.c -o ic98260 \
-Wl,--gc-sections -Wl,-z,norelro -pthread
Infinity Core Timer 하위 시스템 취약점의 ARM64 구현으로, 7.0 계열 커널 형태(Ubuntu 26.04 7.0.0-30-generic과 동일한 코드 구조)를 대상으로 합니다. 완전한 트리거 및 권한 상승 체인입니다. 주요 오프셋은 해당 대상 구조 레이아웃에 하드코딩되어 있으며, 심볼 주소만 대상 vmlinux와 일치시키면 됩니다.
비리더 스레드가 exec()를 호출하면 de_thread()가 TID를 교환하고 release_task(leader)를 호출합니다. POSIX 타이머 정리는 여러 실패 가능한 작업 뒤에 위치합니다. exec가 실패한 후, 해제된 k_itimer의 timerqueue 노드가 살아 있는 태스크의 timerqueue에 남아 있게 되고, 이후 정리 과정에서 다시 역참조됩니다.
체인: 오라클 스레드 풀 경쟁 → AIO 링 스프레이로 UAF 객체 회수 → elist가 태스크 주소를 유출 → 제어된 페이지에 가짜 타이머와 가짜 cred 구성 → timerqueue unlink가 가짜 cred를 task->cred에 이중 쓰기 → setresuid(0)로 루트 셸 획득.
k_itimer.it.cpu.elist 0xe0
k_itimer.it.cpu.handling 0xf0
k_itimer.it_interval 0x68
sizeof(k_itimer) 0x180
task_struct.cpu_timers head 0xca0
task_struct.cred 0xd00
cred.uid/gid/euid/... 4/8/14/18/24/28/34/38
cred.cap_inh/prm/eff 0x30/0x40/0x50
cred.security 0x80
cred.user_ns 0x90
sizeof(cred) 0xb8
심볼 주소만 대상별로 조정하면 되며, 커널 내 KASLR 유출은 자체적으로 보정됩니다.
timer_lpe.c 메인 프로그램
ic_timer_target.h 구조 레이아웃 (하드코딩됨)
ic_compat.h syscall 래퍼, AArch64 asm 원시 연산
ic_util.h 공용 헬퍼
ic_shellcode_arm64.c AArch64 shellcode 생성기
ic_target.h 기타 오프셋
export ANDROID_NDK_HOME=/path/to/ndk
$ANDROID_NDK_HOME/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android29-clang \
-O2 -std=gnu11 -static -fno-stack-protector -fno-pic -no-pie \
-I. timer_lpe.c ic_shellcode_arm64.c -o ic98260 \
-Wl,--gc-sections -Wl,-z,norelro -pthread