Kernel/Kernel Exploits

Kernel mitigations

범고래_1 2020. 12. 13. 17:00

 

- 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로 시작하지 않는다.