- 커널은 절대 사용자 공간 메모리(userspace memory)를 실행하거나 접근해서는 안된다.
- 이러한 규칙은 하드웨어 기반으로 제한(x86의 SMEP/SMAP, ARM의 PXN/PAN)을 지원하거나 에뮬레이션(ARM의 메모리 도메인)을 통해 시행할 수 있다.
- 이러한 방식으로 사용자 공간 메모리를 차단하면 실행 및 데이터 구문 분석이 사용자 공간 메모리로 전달 될 수 없으므로, 공격이 커널 메모리에서만 작동하도록 만든다.
SMEP (Supervisor Mode Execution Prevention)
- 사용자 모드에 있는 실행 코드를 Ring-0 권한으로의 실행을 제한하고 충돌을 일으킨다.
- 따라서 사용자 모드 페이로드 실행에 의존하는 EoP 익스플로잇을 실행하지 못하게 된다.
- 이를 통해 Intel OS Guard는 EoP(Escalation of Privilege) 보안 공격을 방지하는 데 도움이 된다.
- 다음과 같은 명령어로 SMEP의 활성화 여부를 알 수 있다.
$ sudo cat /proc/cpuinfo |grep smep
SMAP(Supervisor Mode Access Prevention)
- SMEP의 목적은 수퍼바이저 모드에서 명령 패치 및 코드 실행을 제어하는 것 이라면, SMAP는 수퍼바이저 모드의 데이터 엑세스를 방지하는 것이다.
- 페이지 관리자 모드 데이터 액세스로부터 보호 가능
- SMAP = 1, OS가 애플리케이션의 선형 주소에서 데이터에 액세스할 수 없는 경우
- 다음과 같은 명령어로 SMAP의 활성화 여부를 알 수 있다.
$ sudo cat /proc/cpuinfo |grep smap
Privileged execute-never(PXN)/Privileged Access Never(PAN) - arm
- PXN은 ARM 하드웨어에 의해 제공되며 SMEP와 유사한 기능이다.
- ARM v8.1에 PAN이 도입 되었는데 SMAP와 유사한 기능이며 커널이 사용자 공간에 직접 액세스하지 못하게 막아준다.
CR4 Register
- 컨트롤 레지스터는 프로세서의 운영 모드나 현재 실행 중인 태스크의 특성을 결정하는 데 이용된다.
- x86에서는 CR0, CR1, CR2, CR3, CR4 5개의 컨트롤 레지스터가 있다.
- x86-64에서는 CR8이 추가되어 6개의 컨트롤 레지스터가 있다.
- CR4레지스터에서는 프로세스에서 지원하는 각종 확장 기능들을 제어하며, SMEP, SMAP 기능들도 제어된다.
- SMEP 비트는 CR4 레지스터의 비트는 20, SMAP 비트는 21이며 인텔은 다음과 같이 정의한다.
- 이 비트를 1로 설정하면 활성화되고 0으로 설정하면 비활성화된다.
SMEP bypass
- "return to user" 전에 CR4 레지스터의 값을 변경하여 SEMP를 비활성화하면 된다.
- 또는 ROP를 이용한 우회도 가능하다.
- 다음과 같은 가젯을 찾아서 활용하면 된다.
pop rdi ; ret
mov cr4, rdi ;
https://www.lazenca.net/pages/viewpage.action?pageId=25624859
'background > linux kernel' 카테고리의 다른 글
[Linux Kernel Exploit] Slab Allocator & msg_msg Struct (3) | 2024.10.03 |
---|---|
[Linux Kernel Exploit] ROP (with ret2usr) (0) | 2024.04.05 |
Kernel Address Display Restriction (KADR) (0) | 2024.04.04 |
[Linux Kernel Exploit] ret2usr (0) | 2024.04.04 |
Kernel Address Space Layout Randomization (KASLR) (0) | 2024.04.03 |