Address Space Layout Randomization¶
stack, mmap region (shared libraries/VDSO),heapve 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
norandmapsboot parametresiyle de zorlanır). - 1 — mmap 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_BRKdisable 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¶
- Linux kernel. sysctl/kernel.txt — randomize_va_space. — https://www.kernel.org/doc/Documentation/sysctl/kernel.txt
- Ubuntu. Address Space Layout Randomization (ASLR). — https://documentation.ubuntu.com/security/security-features/process-memory/aslr/
- man7. setarch(8). — https://man7.org/linux/man-pages/man8/setarch.8.html