1. ASLR이란?
ASLR(Address Space Layout Randomization)은 프로그램이 실행될 때, 프로세스의 메모리 내 주요 구성요소(스택, 힙, 공유 라이브러리, 실행 파일 등)의 메모리 주소를 무작위(Random)하게 배치하여, 공격자가 특정 메모리 주소를 예측하거나 악용하는 것을 어렵게 만드는 메모리 보호 기법입니다. 이는 시스템을 공격하는 데 사용되는 대표적인 취약점인 버퍼 오버플로우(Buffer Overflow), Return-to-libc, ROP(Return-Oriented Programming) 등의 공격 기법을 어렵게 만듭니다.
2. ASLR의 동작 원리
프로세스가 실행될 때 운영체제는 해당 프로세스에 할당되는 가상 주소 공간의 중요한 위치를 무작위(Random)로 배정합니다. 예를 들어, 스택 시작 주소, 힙 시작 주소, 라이브러리 로딩 주소, 실행 파일(.text) 로딩 주소 등을 실행할 때마다 다르게 배치합니다.
- 운영체제가 사용하는 난수 생성기를 통해 각 메모리 영역에 대해 오프셋(offset)을 무작위로 결정합니다.
- 실행될 때마다 이러한 오프셋이 바뀌기 때문에, 동일한 바이너리 프로그램도 실행할 때마다 메모리 주소 배치가 달라집니다.
ASLR 적용 전 메모리 구조 (예시)
0x08048000 <- 실행 파일(.text, .data)
0xbffff000 <- 스택
0x40000000 <- 공유 라이브러리(libc 등)
0x08000000 <- 힙
위와 같이 메모리 배치가 고정되어 있으면, 공격자가 특정 주소를 이용해 정확한 위치로 점프하는 공격이 가능합니다.
ASLR 적용 후 메모리 구조 (예시)
0x08f2a000 <- 실행 파일(.text, .data) - 무작위 위치
0xbf75d000 <- 스택 - 무작위 위치
0x426f1000 <- 공유 라이브러리(libc 등) - 무작위 위치
0x0915e000 <- 힙 - 무작위 위치
주소가 매번 다르기 때문에, 공격자가 정확한 주소를 모르면 쉘코드를 실행하거나 함수 포인터를 조작하기가 매우 어렵습니다.
3. ASLR의 목적
ASLR의 주요 목적은 메모리 기반 공격을 어렵게 만들어 Exploit의 성공 가능성을 낮추는 것입니다. 메모리 취약점을 악용할 때, 공격자는 일반적으로 정확한 메모리 주소를 알아야 합니다. 하지만 ASLR이 활성화되어 있으면 다음과 같은 보안 효과를 얻을 수 있습니다:
- 공격자가 쉘코드를 삽입하더라도, 점프할 정확한 주소를 알 수 없음.
- 공유 라이브러리(libc 등)의 위치도 랜덤화되어 return-to-libc 공격이 실패할 가능성 높음.
- 전체 주소 공간을 브루트 포싱으로 맞추기에는 비용이 큼.
4. ASLR의 장점
- 보안성 향상
메모리 주소가 매번 변경되기 때문에, 취약점을 악용하려는 공격자가 메모리 구조를 예측하기 어렵습니다. - 시스템 성능에 영향 거의 없음
주소 공간을 무작위로 배치하는 작업은 프로세스 시작 시 한 번만 수행되므로, 성능 저하가 사실상 없습니다. - 다른 보안 기법과의 연계 가능
Stack Canaries, DEP(NX 비트) 등의 보안 기법과 함께 사용할 수 있어 다층 방어를 구성할 수 있습니다. - 기존 소프트웨어 구조 변경 없음
운영체제 차원에서 적용되므로, 프로그램 소스코드를 수정할 필요 없이 적용 가능함.
장점 | 설명 |
---|---|
✔️ 보안성 향상 | 메모리 주소 예측을 어렵게 하여 Exploit을 방지 |
✔️ 비용 효율적 | 소프트웨어 구조 변경 없이 OS 차원에서 적용 가능 |
✔️ 다른 보안 기법과 결합 가능 | DEP, Stack Canaries 등과 함께 사용할 수 있음 |
5. ASLR의 단점과 한계
- 정보 유출 취약점(Info Leak)이 있으면 무력화됨
만약 공격자가 메모리 주소 일부를 유출시킬 수 있다면, ASLR이 적용되어 있어도 전체 주소를 추측하거나 복원하는 것이 가능함. - 64비트에 비해 32비트 환경에서는 랜덤화 범위가 작음
32비트 시스템에서는 가상 주소 공간이 4GB로 제한되어 있어, 랜덤화 가능한 주소 공간도 작음. 따라서 브루트 포스 공격이 상대적으로 쉬움. - 정적인 바이너리(DLL, Shared Library 등)가 ASLR을 지원하지 않으면 전체 효과가 반감됨
일부 바이너리는 ASLR 적용을 위해 다시 컴파일해야 하며, 적용되지 않은 바이너리가 있다면 공격자가 해당 위치를 기반으로 공격 가능. - 부분 덮어쓰기 우회 기법 가능
하위 주소 몇 바이트만 덮어써서 특정 위치로 이동하는 공격도 일부 가능한 것으로 알려져 있음.
단점 | 설명 |
---|---|
❗ 예측 가능성 존재 | 주소 공간이 좁거나, 랜덤화 범위가 작을 경우 예측 가능 |
❗ 성능 저하 | 아주 미세하지만 초기 로딩 시 오버헤드 발생 가능 |
❗ 우회 가능 | 정보 유출(leak) 취약점을 통해 주소를 알아낼 수 있음 (예: InfoLeak) |
6. ASLR 우회 기법
- Memory Leak 이용 (정보 유출)
포인터나 메모리 값을 출력시키는 취약점을 이용해 메모리 주소를 유출시킵니다. 이 정보를 기반으로 랜덤화된 주소를 예측하거나 복원할 수 있습니다. - Brute Force 공격
재시도가 가능한 환경(예: 서버가 계속 재시작되는 경우)에서는 주소를 무작위로 찍어보는 방식으로 성공 가능성을 높일 수 있습니다. - Partial Overwrite
주소의 하위 바이트(예: 마지막 1~2바이트)만 덮어써서, 높은 확률로 맞는 위치로 이동하도록 시도합니다. - ASLR 비활성 시스템 대상 공격
일부 시스템에서는 기본적으로 ASLR이 꺼져 있거나, 잘못 설정된 환경이 많기 때문에 이를 노리는 경우도 있습니다.
7. 운영체제별 ASLR 적용 상태
- Windows
- Windows Vista 이후 기본 적용
- Windows 10에서는 system-wide ASLR 및 forced ASLR 기능도 포함됨
- Linux
- 커널 2.6.12부터 ASLR 지원
/proc/sys/kernel/randomize_va_space
값으로 설정 확인 가능
- macOS
- macOS 10.5 이후부터 지원
- ASLR이 점점 강화되고 있음
- Android
- Android 4.0 (Ice Cream Sandwich) 이후 적용
- ART 런타임에서는 더 정교하게 주소 공간이 관리됨
8. Linux에서 ASLR 설정 확인 및 변경 방법
ASLR 활성화 상태 확인:
cat /proc/sys/kernel/randomize_va_space
결과값 의미:
0
: 비활성화 (ASLR 미적용)1
: 일부 랜덤화2
: 완전한 랜덤화 (기본 권장값)
설정 변경 (일시적으로 비활성화):
echo 0 > /proc/sys/kernel/randomize_va_space
영구 적용을 원할 경우 /etc/sysctl.conf
에 다음 줄 추가:
kernel.randomize_va_space = 2
9. 결론
ASLR은 운영체제에서 제공하는 기본적이면서도 강력한 메모리 보안 기법입니다. 그러나 완벽한 보안책은 아니며, 다른 보안 기법들과 함께 사용해야 실제 효과를 극대화할 수 있습니다. 특히, ASLR은 정보 유출이 있는 경우 우회가 가능하기 때문에, 시스템의 다른 취약점도 함께 고려하여 방어 전략을 세워야 합니다. 다양한 운영체제에서 지원되고 있으며, 서버 및 클라이언트 시스템 모두에서 기본 활성화되어야 합니다.