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 addresses
  • sysctl kern.* 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