Information Leaks & KASLR Bypass
Trước khi đọc/ghi kernel memory, bạn cần biết kernel load ở đâu. KASLR (Kernel Address Space Layout Randomization) randomize kernel base address mỗi boot. Info leak = bước 1.
KASLR Trên iOS
Kernel base address = fixed_base + random_slide
fixed_base: 0xFFFFFE0007004000 (varies by device/iOS version)
random_slide: random value, aligned to 2MB boundary
→ Actual base: 0xFFFFFE0007004000 + 0x000000XXXX000000
Nếu biết slide → tính được address mọi kernel symbol:
symbol_runtime_addr = symbol_static_addr + slide
Leak Techniques
1. IOKit Property Leaks
Một số IOKit drivers trả về kernel addresses trong properties:
io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault, ...);
CFTypeRef prop = IORegistryEntryCreateCFProperty(service, CFSTR("some-property"), ...);
// prop có thể chứa kernel pointer → leak!
2. Uninitialized Heap Data
1. Trigger allocation từ zone chứa stale data
2. Read back data → có thể chứa kernel pointers từ previous object
3. Calculate slide từ leaked pointer
3. Timing Side Channels
- Measure access time cho different kernel addresses
- Mapped vs unmapped addresses có timing difference
- Used to brute-force KASLR slide
4. Via Vulnerability Itself
Nhiều vulnerabilities cho cả info leak + write primitive:
Heap overflow → overread adjacent object → leak pointer
→ overwrite adjacent object → write primitive
5. proc_info / sysctl Leaks
Historically, một số syscalls leak kernel addresses:
proc_info(PROC_PIDINFO, ...)từng leak kqueue kernel addressessysctlkern.* nodes từng leak kernel pointers
Không Cần KASLR Bypass Khi
- checkm8/palera1n: Bootrom exploit chạy trước KASLR → biết fixed layout
- Deterministic exploits: Một số exploits không cần biết exact addresses
- Relative exploits: Chỉ cần relative offsets giữa objects