Skip to content

Address Space Layout Randomization

stack, mmap region (shared libraries/VDSO), heap ve PIE executable'ın base'ini randomize et ki attacker, code ya da data'nın adresini hard-code edemesin.

Mechanism

Neden çalışır

Klasik exploitation absolute bir adrese ihtiyaç duyar: system()'in nerede olduğu, jump edilecek bir stack buffer'ın adresi, yazılabilir bir function pointer. ASLR, bu adresleri exploit-development zamanında bilinmez hale getirerek precondition'ı bozar — loader her execve()'de, randomize edilen her region için taze bir rastgele base seçer.

Linux'ta policy tek bir knob'tur, /proc/sys/kernel/randomize_va_space, üç level'lı (kernel sysctl dokümanlarındaki tam ifadeyle):

  • 0 — randomization kapalı (ayrıca norandmaps boot parametresiyle de zorlanır).
  • 1mmap base, stack ve VDSO page'i randomize et. Bu yüzden shared library'ler rastgele adreslerde load olur ve PIE-linked bir binary için code başlangıcı da randomize edilir.
  • 2 — ek olarak heap (brk)'i de randomize et. CONFIG_COMPAT_BRK disable olduğunda default budur.

Invariant şu: attacker, herhangi bir absolute referans kullanılabilir hale gelmeden önce bir runtime adresi öğrenmek (leak ya da brute-force) zorundadır. Dolayısıyla ASLR yalnızca entropy'si ve en zayıf non-randomized region'ı kadar güçlüdür — tek bir pointer leak onu çökertir.

Bu not userspace ASLR'yi kapsar: per-execve yeniden seçilen, process bazında randomize edilen user mapping'ler. Kernel image'ının boot başına bir kez seçilip relocate edilen slide'ı ayrı bir mekanizmadır — bkz. Kernel Address Space Layout Randomization.

Walkthrough

1. Mevcut policy'yi oku ve randomize edilen map'leri gözlemle.

$ cat /proc/sys/kernel/randomize_va_space
2

$ cat /proc/self/maps | grep -E 'stack|libc'
7ffced1a3000-7ffced1c4000 rw-p ... [stack]
7f3b2c4a0000-7f3b2c4c8000 r--p ... /usr/lib/x86_64-linux-gnu/libc.so.6

$ cat /proc/self/maps | grep -E 'stack|libc'   # run again
7ffe1b8e2000-7ffe1b903000 rw-p ... [stack]      # different base
7f9d04e00000-7f9d04e28000 r--p ... /usr/lib/x86_64-linux-gnu/libc.so.6

Library ve stack base'leri çağrılar arasında değişir.

2. Tek bir komut için disable et (kendi target'larını debug ederken).

$ setarch -R /bin/cat /proc/self/maps    # -R, --addr-no-randomize -> ADDR_NO_RANDOMIZE
# or globally:
# echo 0 > /proc/sys/kernel/randomize_va_space

-R ile tekrarlanan çalıştırmalar aynı map'leri üretir.

ASLR per-execve'dir, per-fork değil

fork()'lanan bir child, parent'ın zaten seçilmiş layout'unu inherit eder. Fork eden bir network daemon her connection'a aynı randomize base'i verir — ASLR brute force ve canary brute force'un dayandığı precondition tam da budur.

Mitigation

(Residual risk / bypass.) ASLR tek bir information leak karşısında, low-entropy 32-bit sistemlerde brute force karşısında, non-PIE binary'ler (sabit .text) karşısında ve software leak olmadan adres bitlerini geri kazanan AnC ile prefetch-side-channel gibi microarchitectural derandomization saldırıları karşısında çöker.

References