Computer Security

#13 KPTI 우회 본문

리눅스 커널 해킹

#13 KPTI 우회

쿠리 Kuri 2022. 8. 21. 18:30
반응형

KPTI(Kernel Page Table Isolation)

 

커널 공간과 유저 공간의 전환이 일어날 때, 각각의 페이지 테이블을 사용하여 유저 공간 페이지 테이블에 최소한의 커널 주소만 포함하도록 하는 보호 기법이다.

 

Meltdown 취약점에 대한 보안 패치

 

커널 공간 -> 유저 공간으로 전환할 때 호출되는 어셈블리 함수를 이용해서 우회할 수 있다.

 

 

 

 


우리는 아래의 파일들로 실습 할 것이다.

kpti_bypass

start.sh : qemu script

test.c : 간단한 취약점이 터지는 디바이스 드라이버 예제

exp.c : KPTI를 우회하여 권한 상승을 일으키는 exploit code

 

 


1. start.sh 를 살펴보자.

cat start.sh

-cpu kvm64 : KPTI 적용

-cpu qemu64 : KPTI 미적용

 

 

 


2.BOF 취약점을 이용해 커널의 흐름을 원하는 대로 조작할 수 있는 디바이스 드라이버 예제인 test.c를 살펴보자.

test.c

test_write()함수

 

copy_from_user 함수를 이용해 유저로부터 원하는 크기의 데이터를 전달 받은 뒤, 지역변수 arr에 복사하는 역할을 한다.

이로인해 BOF 취약점이 터지게된다.

 

kbuild 옵션을 통해 SSP(canary) 보호 기법을 제외한 뒤 컴파일 한 예제 드라이버다.

 

 

 

 


3.exp.c 파일을 살펴보자.

exp.c

write() 함수를 이용해 test 드라이버에 ROP payload를 전달한다.

 

ROP payload는 commit_creds(prepare_kernel_cred(0)) 코드를 실행한 후, /bin/sh 를 실행하는 역할을 한다.

 

ROP payload에 swapgs와 iretq 대신 swapgs_restore... 어셈블리 함수가 추가되었다.

 

전체적인 흐름은 kernel ROP 기법을 이용한다.

 

 


swapgs_restore_regs_and_return_to_usermode

 

커널공간 -> 유저공간으로 전환될 때, 호출되는 어셈블리 함수이다.

페이지 테이블을 분리하는 역할을 한다.

해당 함수의 주소는  KADR우회 방식으로 구한다.

 

 

 

 


4. ./start.sh 를 실행시켜보자.

./start.sh

KPTI 보호기법을 적용한 start.sh를 실행한 후, exp를 실행한 결과이다.

user 권한에서 root권한을 획득한 것을 볼 수 있다.

 

 

 

 


5. KPTI의 주요흐름을 알아보자.

 

 

커널공간 : test.c     ,      유저공간 : exp.c

 

 

커널 공간 misc_register(&test_driver)   -->  유저공간 fd=open("/dev/test", O_RDWR) 

--> 유저공간 write(fd, rop, sizeof(rop))   --> 커널공간 test_write() 

--> 커널공간 copy_from_user(ptr, buf, count)  --> 커널공간 memcpy(arr, ptr, count)

 

 

 


KPTI 우회 방법

 

커널공간 -> 유저공간으로 전환할 때 호출되는 swapgs_restore_regs... 어셈블리 함수를 ROP payload에 추가하는 것으로 우회할 수 있다.

 

해당 보호 기법의 원리는 복잡하나, 우회 방법 자체는 간단한 편이다.

 

반응형

'리눅스 커널 해킹' 카테고리의 다른 글

#15 kernel ROP 기법  (0) 2022.08.23
#14 ret2usr 기법  (0) 2022.08.22
#12 SSP 우회  (0) 2022.08.20
#11 KADR 우회  (0) 2022.08.19
#10 SMAP 우회  (0) 2022.08.18
Comments