스택, 힙, 라이브러리 등의 주소를 랜덤한 영역에 배치하여, 공격에 필요한 Target address를 예측하기 어렵게 만듭니다.
프로그램이 실행 될 때 마다 각 주소들이 변경됩니다.
예를 들어 RTL 공격을 하기 위해서는 공유 라이브러리에서 사용하려는 함수의 주소를 알아야합니다.
이러한 주소 값들이 고정적인 주소를 가지고 있으면 매우 쉽게 공격 당할 수 있습니다.
하지만 ASLR의 적용으로 인해 프로그램이 호출 될때 마다 스택, 힙, 라이브러리 영역의 주소가 변경되면 공격에 어려워집니다.(불가능하지는 않습니다.)
Set ASLR
명령어 : echo 0 > /proc/sys/kernel/randomize_va_space
옵션
0 : ASLR 해제
1 : 랜덤 스택 & 랜덤 라이브러리 설정
2 : 랜덤 스택 & 랜덤 라이브러리 설정 & 랜덤 힙 설정
Check the protection techniques of binary files.
checksec
checksec에서 다음과 같은 결과를 출력합니다.
System-wide ASLR (kernel.randomize_va_space): On (Setting: 2)
1
2
3
4
5
6
7
8
9
10
11
12
❯ checksec --proc ASLR
* System-wide ASLR (kernel.randomize_va_space): Full (Setting: 2)
Description - Make the addresses of mmap base, heap, stack and VDSO page randomized.
This, among other things, implies that shared libraries will be loaded to random
addresses. Also for PIE-linked binaries, the location of code start is randomized.
See the kernel file 'Documentation/sysctl/kernel.txt'for more details.
* Does the CPU support NX: Yes
COMMAND PID RELRO STACK CANARY NX/PaX PIE FORTIFY
Memory map
다음과 같이 메모리의 변화를 확인 할 수 있습니다.
“/proc//maps” 파일을 통해 프로세스의 메모리 구조는 및 주소를 확인 할 수 있습니다.
randomize_va_space에 2를 설정한 환경입니다.
프로그램을 처음 실행했을 때와 두번째 실행했을 때의 메모리 배치가 다른 것을 확인 할 수 있습니다.
# check for system-wide ASLR support
aslrcheck(){# PaX ASLR supportif!(cat /proc/1/status 2> /dev/null | grep-q'Name:');then
echo-n-e':\033[33m insufficient privileges for PaX ASLR checks\033[m\n'echo-n-e' Fallback to standard Linux ASLR check'fi
if cat /proc/1/status 2> /dev/null | grep-q'PaX:';then
printf": "if cat /proc/1/status 2> /dev/null | grep'PaX:' | grep-q'R';then
echo-n-e'\033[32mPaX ASLR enabled\033[m\n\n'else
echo-n-e'\033[31mPaX ASLR disabled\033[m\n\n'fi
else# standard Linux 'kernel.randomize_va_space' ASLR support# (see the kernel file 'Documentation/sysctl/kernel.txt' for a detailed description)printf" (kernel.randomize_va_space): "if /sbin/sysctl -a 2>/dev/null | grep-q'kernel.randomize_va_space = 1';then
echo-n-e'\033[33mOn (Setting: 1)\033[m\n\n'printf" Description - Make the addresses of mmap base, stack and VDSO page randomized.\n"printf" This, among other things, implies that shared libraries will be loaded to \n"printf" random addresses. Also for PIE-linked binaries, the location of code start\n"printf" is randomized. Heap addresses are *not* randomized.\n\n"elif /sbin/sysctl -a 2>/dev/null | grep-q'kernel.randomize_va_space = 2';then
echo-n-e'\033[32mOn (Setting: 2)\033[m\n\n'printf" Description - Make the addresses of mmap base, heap, stack and VDSO page randomized.\n"printf" This, among other things, implies that shared libraries will be loaded to random \n"printf" addresses. Also for PIE-linked binaries, the location of code start is randomized.\n\n"elif /sbin/sysctl -a 2>/dev/null | grep-q'kernel.randomize_va_space = 0';then
echo-n-e'\033[31mOff (Setting: 0)\033[m\n'else
echo-n-e'\033[31mNot supported\033[m\n'fi
printf" See the kernel file 'Documentation/sysctl/kernel.txt' for more details.\n\n"fi}
먼저 “/proc/1/status” 파일을 이용해 ASLR 설정여부를 확인합니다.
하지만 해당 시스템에서는 ”/proc/1/status”를 이용해 ASLR이 적용되었는지 확인 할 수 없습니다.
해당 파일에 “Pax” 정보가 없기 때문입니다.
그렇기 때문에 다음과 같이 ‘sysctl’ 명령어를 이용해 ASLR 설정 여부를 판단할 수 있습니다.
해당 시스템의 설정 값은 ‘2’ 입니다.
sysctl -a | grep 'kernel.randomize_va_space = '
1
2
3
4
5
6
7
8
9
10
11
12
13
root$ sysctl -a | grep'kernel.randomize_va_space = '
sysctl: permission denied on key 'fs.protected_hardlinks'
sysctl: permission denied on key 'fs.protected_symlinks'
sysctl: permission denied on key 'kernel.cad_pid'
kernel.randomize_va_space = 2
sysctl: permission denied on key 'kernel.unprivileged_userns_apparmor_policy'
sysctl: permission denied on key 'kernel.usermodehelper.bset'
sysctl: permission denied on key 'kernel.usermodehelper.inheritable'
sysctl: permission denied on key 'net.ipv4.tcp_fastopen_key'
sysctl: permission denied on key 'net.ipv6.conf.all.stable_secret'
sysctl: permission denied on key 'net.ipv6.conf.default.stable_secret'
sysctl: permission denied on key 'net.ipv6.conf.ens33.stable_secret'
sysctl: permission denied on key 'net.ipv6.conf.lo.stable_secret'