KASLR?
- KASLR은 커널 메모리 주소의 예측을 어렵게 하기 위해 고안된 보호 기법이다.
- 윈도우, 맥, iOS, 리눅스, FreeBSD, OpenBSD등 상당수의 운영체제에서 KASLR을 지원한다.
- 리눅스 커널의 경우 3.14버전에서 최초로 KASLR을 옵션으로 지원하였고, 4.12버전에서는 KASLR이 기본으로 적용되게 하였다.
- 따라서 현재 존재하는 대부분의 리눅스 배포판이 KASLR을 기본적으로 적용시켜 비활성화하려면 커널 명령줄에 nokaslr옵션을 사용해야 한다.
- KASLR이 적용되면 부팅 시에 커널 코드 및 데이터가 임의 주소에 적재된다.
- 따라서 공격자는 기존의 ASLR과 PIE를 우회하듯이 다양한 방법으로 코드나 데이터 섹션의 주소를 구하고, 이를 활용해서 커널이 로드된 주소를 구해야 한다.
KASLR의 한계
- ASLR이 적용된 바이터리의 코드, 데이터, 힙 등의 베이스 주소가 실행중 변경되지 않는 것 처럼, KASLR이 적용된 커널의 경우도 재부팅 되기 전까지는 베이스 주소가 변하지 않는다.
- 따라서 커널 패닉이 발생하지만 않는다면 무차별 대입등의 공격으로 커널의 베이스 주소를 구할 수 있다.
- 심지어 리눅스 KASLR의 경우 ASLR에 비해 무차별 대입 공격에 취약하다.
- 16비트 이상의 엔트로피를 가지는 ASLR과 다르게 KASLR의 경우 32비트에서는 최대 8비트, 64비트에서는 최대 9비트의 엔트로피만 가질 수 있다.
- 여기서 엔트로피란 주소를 구성하는 전체 비트 중 임의로 변경될 수 있는 비트의 수를 말한다.
- 다시 말해 엔트로피가 8인 32비트 아키텍처에서는 256, 엔트로피가 9인 64비트 아키텍처에서는 512만큼의 주소공간이 생길 수 있다.
- 일반적으로 엔트로피가 N, 시도 횟수가 α일때 추측에 성공할 확률은 다음과 같다.
- 따라서 무차별 대입 공격을 8비트 엔트로피에서는 178번, 9비트 엔트로피에서는 355번 시도하면 약 50%확률로 성공할 수 있다.
- 이를 개선하기 위해 최근에 커널 코드를 함수 단위로 재배치 하는 패치가 개발되고 있다고 한다.(오래된 강의니 지금쯤 나왔을지도..?)
ASLR vs KASLR
ASLR(사용자 영역) | KASLR | |
목적 | 바이너리 섹션들의 주소 랜덤화 | 커널 코드 및 데이터의 주소 랜덤화 |
적용 시점 | 바이너리 실행 시 | 커널 부팅 시 |
재배치 주소 공간 | 사용자 주소 공간 | 커널 주소 공간 |
한계 | 바이너리가 실행되는 동안은 주소가 고정된다. | 재부팅 전까지는 주소가 고정된다. 엔트로피가 작다. |
비고 | 바이너리의 코드 섹션의 경우 PIE보호기법이 적용되어 있어야 랜덤화가 가능하다. |
KASLR 실습
- 현재 실습에 사용되는 run.sh의 경우 KASLR을 비활성화하도록 되어있다.
- KASLR을 활성화 하려면 run.sh을 다음과 같이 수정해서 nokaslr옵션을 _kernel_cmdline변수에서 삭제하면 된다.
(수정 전)
_kernel_cmdline="console=ttyS0 mitigations=off nokaslr norandmaps"
(수정 후)
_kernel_cmdline="console=ttyS0 mitigations=off norandmaps"
- KASLR을 활성화 한 후에 다음과 같이 커널 코드의 베이스 주소를 확인해 보면 부팅 시마다 달라지는 것을 볼 수 있다.
- 위의 주소는 기본 주소, 아래의 주소는 실제 부팅시 주소이다.
같이 제공된 커널 디버깅 스크립트(vmlinux-gdb.py)의 경우 KASLR을 지원하지 않는다고 한다.
디버깅 시에는 nokaslr옵션을 복구시켜 KASLR을 비활성화하는 것이 좋다고 한다.
'Pwn > Kernel Security' 카테고리의 다른 글
[Pwn] Dreamhack - 8.Exploit Tech: ret2usr (0) | 2024.01.09 |
---|---|
[Pwn] Dreamhack - 7.Exploit Tech: Kernel Leak (0) | 2024.01.07 |
[Pwn] Dreamhack - 5.Exploit Tech: prepare & commit (1) | 2024.01.07 |
[Pwn] Dreamhack - 4.Background: Tasks (0) | 2024.01.06 |
[Pwn] Dreamhack - 3.Background: Kernel Debugging (0) | 2024.01.06 |