====== Address Space Layout Randomization (ASLR) ======
Memory corruption exploitation techniques depend on the knowledge of absolute addresses in the context of the running application. Introducing randomness to the memory layout of the process increases exploitation difficulty. One attempt to do so is Address Space Layout Randomization (ASLR). As an operating system feature ASLR is available on all modern platforms, but its effectiveness depends on the implementation and size of the address space((D. H. Aristizabal, D. M. Rodriguez and R. Y. Guevara, "Measuring ASLR implementations on modern operating systems," 2013 47th International Carnahan Conference on Security Technology (ICCST), Medellin, 2013, pp. 1-6.)).
On Linux systems ASLR for user programs is implemented as an operating system feature and is enabled or disabled globally. Its status is represented by the file ''/proc/sys/kernel/randomize_va_space''. Following states are available(([[https://www.kernel.org/doc/Documentation/sysctl/kernel.txt|Documentation for sysctl - The Linux Kernel Archives]])).
^ Value ^ Description ^
| 0 | ASLR is disabled |
| 1 | Stack and shared library offsets are randomized |
| 2 | Additionally to value 1, also the heap offset is randomized |
The program below is used to inspect the effects of the different ASLR values on different types of process addresses.
// gcc addresses.c -no-pie -fno-pie -ldl
#include
First, use a value of ''0'' during the execution.
$ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
0
$ ./a.out
executable: 0x400677
stack: 0x7fffffffe21c
heap: 0x602010
system@plt: 0x400550
libc: 0x7ffff7ff59b0
system: 0x7ffff7877480
$ ./a.out
executable: 0x400677
stack: 0x7fffffffe21c
heap: 0x602010
system@plt: 0x400550
libc: 0x7ffff7ff59b0
system: 0x7ffff7877480
Clearly, all addresses are unchanged during both executions.
Having ASLR enabled with the value 1 results in the following output.
$ echo 1 | sudo tee /proc/sys/kernel/randomize_va_space
1
$ ./a.out
executable: 0x400677
stack: 0x7fff0561a30c
heap: 0x602010
system@plt: 0x400550
libc: 0x7ff03b6e79b0
system: 0x7ff03af64480
$ ./a.out
executable: 0x400677
stack: 0x7fffe76dd26c
heap: 0x602010
system@plt: 0x400550
libc: 0x7f063ddf79b0
system: 0x7f063d674480
We can see that the stack and the shared library including the ''system()'' function are randomized. However, this is not true for the code of the executable itself, the heap and the PLT.
Increase the ASLR value to ''2'' and check again.
$ echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
2
$ ./a.out
executable: 0x400677
stack: 0x7ffde2b72b9c
heap: 0x1a5d010
system@plt: 0x400550
libc: 0x7fa0323fc9b0
system: 0x7fa031c79480
$ ./a.out
executable: 0x400677
stack: 0x7ffc594969cc
heap: 0x16c0010
system@plt: 0x400550
libc: 0x7f16da8019b0
system: 0x7f16da07e480
Now all addresses except for the executable itself and the PLT are randomized which is still a security risk(([[https://sploitfun.wordpress.com/2015/05/08/bypassing-aslr-part-i/|Bypassing ASLR - Part I - sploitF-U-N]])). See the chapter about [[.pie|Position-independent Executable (PIE)]] on how to further improve this situation.
Summarizing ASLR, the table below shows how the used ASLR value and the randomization of addresses correlate.
^ ASLR value ^ Executable ^ Stack ^ Heap ^ PLT ^ Shared libraries ^
| 0 | ✗ | ✗ | ✗ | ✗ | ✗ |
| 1 | ✗ | ✔ | ✗ | ✗ | ✔ |
| 2 | ✗ | ✔ | ✔ | ✗ | ✔ |
\\
----
[[.stack-protection|← Back to stack protection]] | [[..start|Overview]] | [[.pie|Continue with Position-independent Executable (PIE) →]] |