- user level exploit의 목적 : system("/bin/sh");
- kernel exploit의 목적 : commit_creds(prepare_kernel_cred(0));
KASLR
- 커널 주소 랜덤화 → prepare_kernel_cred 주소 랜덤화
- 유저레벨 익스플로잇과 마찬가지로 오프셋 계산
- /proc/kallsyms에서 함수 주소 확인 할 수 있다.
- kernel.kptr_restrict 켜져있으면, 안 된다. (KADR, Kernel Address Display Restriction)
- kernel.kptr_restrict 끄고 확인
SMEP (Supervisor Mode Execution Prevent)
- 커널이 유저 레벨 코드 실행 불가하게 함
- 커널이 커널 페이지 소유가가 아닌 곳의 코드 실행 방지
- prepare_kernel_cred/commit_creds 쉘코드 실행 방지
- ARM에서는 PXN(Privileged executed Never)라고 한다.
SMAP (Supervisor Mode Access Prevent)
- 커널이 유저 레벨 메모리 접근 불가하게 함
- ARM에서는 PAN(Priviledged Access Never)라고 한다.
- SMEP와 SMAP의 적용 여부는 CR4 레지스터에 명시되어 있다.
CR4
- CR4 레지스터는 Control Register이다.
- cat /proc/cpuinfo로 flags 확인 가능 (SMAP/SMEP)
- 즉, cr4 레지스터를 taint 시킬 수 있으면 우회 가능
ex) mov cr4, rdi ; ret
-21번, 20번 비트를 0으로 변경하면 기능을 끌 수 있다.
Canary
- Overflow detection
- 유저 레벨의 canary와는 다르게, null byte로 시작하지 않는다.