KASLR(Kernel Address Space Layout Randomization)은 ASLR의 커널 버전으로
커널의 기본 주소 값을 무작위로 만들어 커널 공격을 어렵게 만드는 기능이다.
실습은 우분투 16.04에서 진행했다.
KASLR을 비활성화 하려면
"/etc/default/grub" 파일의 "GRUB_CMDLINE_LINUX_DEFAULT"에 "nokaslr"을 추가한다.
sudo update-grub으로 설정을 반영한다.
이후 reboot로 적용시켜줘야 한다.
이제 reboot해도 계속 주소가 같게 나오는 것을 확인할 수 있다.
반대로 KASLR을 활성화 하려면
"/etc/default/grub" 파일의 "GRUB_CMDLINE_LINUX_DEFAULT"에서
"nokaslr"을 "kaslr"로 바꿔준다.
마찬가지로 sudo update-grub와 reboot로 설정을 반영한다.
이젠 부팅할 때마다 주소가 바뀌는 것을 확인할 수 있다.
KASLR이 적용되지 않은 환경에서는
리눅스 커널 이미지인 "vmlinux" 파일을 이용하여 Kernel 함수들의 주소를 찾을 수 있다.
readelf 명령어를 이용하여 "vmlinux" 파일에서 prepare_kernel_cred 함수의 주소를 찾을 수 있고,
"/proc/kallsyms" 파일에서 찾은 prepare_kernel_cred 함수의 주소 값이
"vmlinux" 파일에서 찾은 값과 동일한 것을 확인 할 수 있다.
하지만 최신의 Kernel들은 기본적으로 KASLR을 지원하고 있기 때문에
"vmlinux" 파일에서 찾은 커널 함수들의 주소를 공격에 활용하기 어렵다.
그렇다고 해서 "vmlinux" 파일의 활용가치가 전혀 없는 것은 아니다.
공격자는 "vmlinux" 파일을 이용하여 커널 함수의 offset 값을 얻을 수 있다.
다음과 같이 Kernel 함수의 offset 값을 확인 할 수 있다.
readelf 명령어를 이용하여 공격에 사용할 커널 함수의 주소(0xffffffff810b6270)를 확인할 수 있다.
offset값을 계산하기 위해 프로그램 코드 명령어가 저장되어 있는 .text 섹션의 시작 주소가 필요하다.
readelf 명령어를 이용하여 .text 영역의 시작 주소(0xffffffff81000000)를 확인한다.
이렇게 수집된 정보들을 이용하여 다음과 같이 커널 함수의 offset 값을 얻을 수 있다.
prepare_kernel_cred 함수의 주소(0xffffffff810b6270) - .text 섹션의 시작 주소(0xffffffff81000000) = 0xb6270
추가적으로 Kernel Address Display Restriction(KADR)이 비활성화 되어 있으면
일반 계정으로도 /proc/kallsyms 파일을 이용하여 심볼의 주소 정보를 확인할 수 있다.
이는 kernel.kptr_restrict 설정 값에 따른다.
https://www.lazenca.net/pages/viewpage.action?pageId=25624857
'background > linux kernel' 카테고리의 다른 글
Kernel Address Display Restriction (KADR) (0) | 2024.04.04 |
---|---|
[Linux Kernel Exploit] ret2usr (0) | 2024.04.04 |
Linux Kernel Debugging (with VMware) (1) | 2024.04.03 |
Linux Kernel Debugging (with QEMU) (0) | 2024.04.02 |
[Lazenca][Development of Kernel Module] 04.Creating a kernel module to privilege escalation (0) | 2024.03.29 |