Kernel?
- 커널이란 중심부라는 뜻으로, 운영체제의 주요기능을 담당하는 시스템 프로그램이다.
- 운영체제가 부팅된 순간부터 종료될 때까지 커널은 메모리에 상주하며 하드웨어 제어, 응용 프로그램을 메모리에 로딩하는 등의 기능을 수행한다.
운영모드
- 시스템에는 파일, 장치, 프로세스등 여러가지의 자원이 존재한다.
- 커널은 응용 프로그램이 시스템 자원을 요청할 때(시스템 콜) 권한에 따라 접근을 제어한다.
- 커널은 메모리를 커널 공간(Kernel Space), 사용자 공간(User Space)로 나눈다.
사용자 모드
- 프로세서가 사용자 모드(User Mode)에 있을 때, 실행중인 프로세스는 사용자 공간에만 접근할 수 있다.
- 각 프로세스는 서로 독립적인 메모리 공간을 가지며 서로의 메모리에 접근할 수 없다.
- 이는 권한이 낮은 프로세스에서 발견된 취약점이 권한이 높은 프로세스에 영향을 끼치지 못하게 한다.
커널 모드
- 프로세서가 커널 모드(Kernel Mode)에 있을 때는 사용자 공간과 커널 공간에 모두 접근할 수 있다.
- 따라서 커널 익스플로잇의 최종 목표는 커널 모드에서 공격자가 원하는 동작을 하게끔 만드는 것이다.
시스템 콜
- 사용자 모드에서 구동되는 프로세스가 키보드 입력을 받거나, 모니터에 데이터를 출력하는 등 외부와 상호작용을 하려면 커널의 권한이 필요하다.
- 하지만 사용자 모드의 프로세스는 위에서 설명했듯 문제가 일어날 수 있기 때문에 임의로 커널 모드에 진입할 수 없다.
- 대신에 운영체제의 제약 조건 아래에서 커널에 도움을 요청할 수 있는데, 이를 시스템 콜(System Call)이라 한다.
- 이러한 시스템 콜은 프로세서에 시스템 콜 명령어를 전달하여 이루어진다.(int 0x80, syscall)
- 프로세서가 이 명령을 실행하면 프로세서는 커널 모드로 전환되는 동시에 커널 개발자가 지정한 진입 코드(Entry Point)를 실행하게 된다.
- 진입 코드는 시스템 콜을 마친 이후에 원래의 코드 흐름으로 돌아갈 수 있도록 프로세서의 상태를 저장하고, 시스템 콜을 처리한다.
- 그 뒤에 저장해놨던 상태를 꺼내어 원래의 흐름으로 돌아간다.
- 이렇게 사용자 모드와 커널 모드가 교차되는 지점이라는 특수성으로 인해 커널 익스플로잇 시 시스템 콜이 중요한 공격대상이 된다.
리눅스 커널의 Attack Surface
- 취약점을 찾기 위해서는 전체 시스템에서 취약할 만한 부분, 즉 공격대상을 파악해야 한다.
- 공격 대상의 집합 = 공격 표면(Attack Surface)
- 리눅스에는 대략 431개의 시스템 콜이 존재한다. 맥의 경우 약 429개, 윈도우의 경우 1787개 정도 된다.
- 갯수 자체는 크게 의미있는 지표가 아니다. 중복되는 내용의 시스템 콜도 다수 존재한다.
- 이외에도 리눅스는 장치 드라이버 및 파일 시스템과 같은 구성요소가 모두 커널 모드에서 동작한다.
- 이러한 커널 유형을 단일형 커널(Monolithic Kernel)이라고 하는데, 이러한 외부 구성요소들까지 고려하면 리눅스 커널의 공격 표면은 시스템 콜에서 네트워크 및 주변 기기로까지 확장될 수 있다.
리눅스 커널 보호기법
- 일반적으로 유저 모드에서 동작하는 프로그램의 보호기법인 NX, ASLR(KASLR), SSP는 리눅스 커널을 빌드할 때 커널에도 적용이 가능하다.
SMEP(Supervisor Mode Execution Prevention)
- SMEP은 사용자 공간의 코드가 커널 모드에서 실행되는 것을 막는 기술이다.
- 특정 공간의 코드 실행을 방지한다는 점에서 NX와 유사하다고 볼 수 있다.
SMAP(Supervisor Mode Access Prevention)
- SMEP에서 더 발전된 SMAP보호 기법은 커널 프로그래머가 명시적으로 허용한 몇몇 경우를 제외하고는 커널 모드에서 사용자 공간에 접근조차 불가능하게 한다.
'Pwn > Kernel Security' 카테고리의 다른 글
[Pwn] Dreamhack - 6.Mitigation: KASLR (0) | 2024.01.07 |
---|---|
[Pwn] Dreamhack - 5.Exploit Tech: prepare & commit (1) | 2024.01.07 |
[Pwn] Dreamhack - 4.Background: Tasks (0) | 2024.01.06 |
[Pwn] Dreamhack - 3.Background: Kernel Debugging (0) | 2024.01.06 |
[Pwn] Dreamhack - 2.Tool: QEMU (0) | 2024.01.05 |