Computer Security

#20 Kernel UAF 1 본문

리눅스 커널 해킹

#20 Kernel UAF 1

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

Kernel UAF(Use-After-Free)

 

UAF(Use-After-Free) 취약점은 할당된 heap 영역을 해제 후 재사용할 때 발생하는 취약점이다.

 

이러한 취약점이 커널에서도 발생할 수 있다.

 

일반적으로 커널에서의 heap은, 슬랩 할당자를 통해 할당 받을 수 있는 슬랩 객체를 의미한다.(vmalloc영역 제외)

 

디바이스 드라이버에서의 UAF 취약점은 보통 dangling pointer를 통해서 발생한다.

 

 

 


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

kernel_UAF

 

start.sh : qemu script

uaf.c : kernel UAF 취약점이 터지는 디바이스 드라이버 예제

exp.c : 취약점을 이용해 권한 상승을 일으키는 exploit code

 


1. bzImage

bzImage

이번 커널 이미지 버전은 이전의 예제에서의 5.8.5 사용한 것과 달리 4.15 버전을 사용한다.

 

4.15버전을 사용하는 이유는,

4.16 버전부터 슬랩 캐시를 생성하는 저수준 커널 함수인 kmem_cache_create()의 구현이 달라져서, 커널 힙 풍수를 맞추기가 매우 힘들어졌기 때문이다.

 

 

 

 


2. cat start.sh 를 이용해 적용된 보호기법을 살펴보자.

cat start.sh

KASLR : 적용 X

SMEP/SMAP : 적용 O

KPTI : 적용 O

 

 

 

 


3. uaf.c 코드를 살펴보자.

uaf.c

 

 

 

 

 


4. uaf.c 에서 open()함수와 release()함수를 살펴보자.

open, release

uaf_open() 

uaf 드라이버가 open 되었을 때 호출되는 함수이다.

전역 변수 ptr에 0x90 크기만큼의 슬랩 객체 할당을 요청한다.

 

uaf_release()

uaf 드라이버가 close 되었을 때 호출되는 함수이다.

전역 변수 ptr에 저장된 슬랩 객체 주소를 할당 해제한다.

 

전역 변수 ptr에 저장된 슬랩 객체를 해제한 뒤 0으로 초기화 하지 않아서 전역 변수 ptr이 해제된 슬랩 객체를 가리키는 dangling pointer가 될 수 있다!!

 

 

 

 

 


5. uaf.c 에서 read()함수와 write()함수를 살펴보자.

read, write

uaf_read()

전역 변수 ptr로부터 0x90 이하의 데이터를 읽어올 수 있는 함수이다.

 

uaf_write() 

전역 변수 ptr로부터 0x90 이하의 데이터를 입력할 수 있는 함수이다.

 

만약, 전역 변수 ptr이 해제된 슬랩 객체를 가리키고 있을 경우, uaf_write() 함수를 통해서 해제된 영역에 대한 쓰기가 가능하다.

 

 

 

 


6. exp.c 코드를 살펴보자.

exp.c

1. fd1, fd2 변수에 각각 uaf 드라이버를 open 한다.

 

2. fd1 변수를 close하여 드라이버 내 dangling pointer을 생성한다.

 

3. fork() 함수를 호출하여 dangling pointer가 자식 프로세스의 struct cred를 가리키도록 설정한다.

 

4. 자식 프로세스에서 fd2 변수를 이용해 struct cred를 0으로 덮어써서 root권한을 획득한다.

 

5. /bin/sh 실행하여 쉘을 획득한다.

 

 

 


 

 

 

dangling pointer의 뜻과, dangling pointer 생성과정과 포크함수를 호출해서 dangling pointer가 자식프로세서의 struct cred를 가리키도록 설정하는 원리 등은 다음 글에 이어서 설명하도록 하겠다.

 

반응형

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

#22 Kernel Heap Overflow  (0) 2022.08.30
#21 kernel UAF 2  (0) 2022.08.29
#19 Stack based BOF  (1) 2022.08.27
#18 struct cred overwrite 기법  (2) 2022.08.26
#17 kernel stack pivoting 기법  (0) 2022.08.25
Comments