Post

[Linux] Kernel protection

개요

Linux Kernel과 관련된 1-day를 분석하기 전, 어떠한 보호기법이 있는지 공부하기 위해서 해당 포스트를 작성합니다.

KASLR

KASLR은 ASLR과 동일하게 커널에 존재하는 주소 값을 랜덤하게 만드는 보호기법입니다.

1
2
ubuntu@ubuntu:~$ cat /proc/sys/kernel/randomize_va_space
2

위의 명령어와 같이 /proc/sys/kernel/randomize_va_space의 값을 보고 확인할 수 있습니다.

  • 0: ASLR 비활성화
  • 1: user 영역에만 ASLR 존재
  • 2: user, kernel 영역에 ASLR 존재

그리고 KASLR을 비활성화 시키기 위해서 아래와 같이 2가지 방법이 존재합니다.

  1. /etc/default/grub 수정
    • GRUB_CMDLINE_LINUX_DEFAULT=”quiet nokaslr”
  2. nokaslr 추가(qemu에서 부팅하는 경우!)
    • append “root=/dev/vda1 console=tty1 console=ttyS0 nokaslr”

SMEP

  • ARM: PXN

Supervisor Mode Execution Prevention의 약자로 ring0 권한에서 ring3의 코드를 실행하지 못하게 막는 것입니다. cr4 레지스터에 SMEP를 on/off 하는 제어 비트가 존재합니다.

해당 보호기법을 통해 prepare_kernel_cred/commit_creds 쉘코드 실행 방지가 가능합니다.

💡 해당 보호기법 때문에 공격자는 Kernel ROP를 통해 Kernel 코드로 이루어진 Gadget으로 LPE를 해야합니다.

SMAP

  • ARM: PAN

Supervisor Mode Access Prevention의 약자로 SMEP와 비슷하게 ring0 권한에서 ring3의 읽기/쓰기 권한도 제한하는 보호기법입니다. 또한 SMAP도 cr4 레지스터에 on/off하는 제거 비트가 존재합니다.

💡 해당 보호기법을 우회하는 방법은 정말 다양하다고 합니다. 1-day 분석을 통해서 직접 알아가는게 공부하는게 좋습니다.

cr4 레지스터

cr4 레지스터의 구조는 아래와 같습니다. 여기서 20, 21bit에 SMEP/SMAP 보호기법을 활성화하는 bit가 설정되어 있는데 해당 값을 0으로 변경해도 우회가 가능합니다.

0cr4 레지스터 구조

KADR

Kernel Address Display Restriction의 약자로 Kernel 내부의 중요한 정보를 root 권한에게만 보여주는 보호기법입니다.

SSP

Stack Smashing Protector의 약자로 우리가 흔히 아는 Stack Canary와 동일한 보호기법이라고 생각하시면 됩니다. Canary와 동일하게 Leak을 통해 우회가 가능합니다.

KPTI

Kernel Page Table Isolation의 약자로 커널 공간과 유저 공간의 전환이 일어날 때, 각각의 페이지 테이블을 사용하여 유 저 공간 페이지 테이블에 최소한의 커널 주소만 포함하도록 하는 보호 기법입니다. Meltdown, Spectre와 같은 공격기법을 막기위해서 탄생했습니다.

This post is licensed under CC BY 4.0 by the author.