Computer Security

#22 Kernel Heap Overflow 본문

리눅스 커널 해킹

#22 Kernel Heap Overflow

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

Kernel Heap Overflow

 

 

 

Heap Overflow 취약점은 할당된 heap 객체에서 buffer overflow가 발생해 인접한 heap 객체의 데이터를 변경할 수 있는 취약점이다.

 

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

 

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

슬랩 객체는 같은 크기(kmalloc-N)의 슬랩 객체끼리 인접해 있다는 점을 고려해서 힙 풍수(1)를 맞춰야 한다.

 

 

 

 

 

(1) 힙 풍수(Heap Feng Shui)  :   Heap 영역에 할당된 Chunk 들의 Layout 을 조작해 exploit 하는 기법입니다.

 

 


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

kernel_heap_overflow

start.sh : qemu script

hof.c : Kernel Heap Overflow 취약점이 터지는 디바이스 드라이버 예제

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

 

 

 

 


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

 

KASLR : 적용 X

SMEP : 적용 O

SMAP : 적용 X

KPTI : 적용 O

 

 

 


2.Kernel Heap Overflow 취약점이 터지는 디바이스 드라이버 예제인 hof.c 파일을 살펴보자.

hof.c

 

 

 


3. hof_open()

hof_open()

 

1. 만약, 전역 변수 seek가 9보다 클 경우 실행을 종료한다.

 

2. struct map 크기의 슬랩 객체를 할당 받은 뒤, 전역 배열 arr에 주소를 저장한다.

 

3. 할당된 map 구조체의 func 멤버를 print_noob() 함수의 주소를 설정한다.

 

4. 전역 변수 seek의 값을 1 증가한다.

 

 

 

 


4. hof_read() 함수와 hof_write()함수를 살펴보자.

hof_read()

hof_read()

 

원하는 struct map 구조체로부터 데이터를 읽어올 수 있는 함수이다.

 

 


hof_write()

hof_write()

 

 

원하는 struct  map 구조체에 원하는 데이터를 쓸 수 있는 함수이다.

 

각 함수에서 copy_from_user()를 호출할 때 8byte 만큼의 heap overflow가 발생한다.

 

 

 


5. Kernel Heap Overflow 취약점을 이용해 권한상승을 일으키는 exp.c 코드를 살펴보자.

exp.c

 

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

 

2. write() 함수를 호출해 fd1에 할당된 struct map에서 heap overflow를 발생시켜 fd2에 할당된 struct map의 함수 포인터를 xchg 가젯으로 덮는다.

 

3. ioctl() 함수를 호출해 fd2에 할당된 struct map의 함수 포인터를 실행하여 root권한을 획득한다.

 

 

 


6. ./start.sh 를 실행해보자.

./strat.sh

 

start.sh를 실행한 후, exp를 실행한 결과이다.

 

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

 

 

 

 


Kernel Heap Overflow 최종 정리

 

 

 

Kernel Healp Overflow 취약점은 유저 공간 뿐만 아니라 커널 공간에서도 발생할 수 있다.

 

보통 인접한 슬랩 객체의 함수 포인터를 덮는 방식으로 exploit한다.

 

만약 해제된 슬랩 객체를 덮을 경우, 해제된 슬랩 객체의 Free Pointer를 덮어서 원하는 공간에 슬랩 객체가 할당 되도록 악용할 수 있다.

 

 

반응형

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

#24 Arbitrary Write 2  (0) 2022.09.01
#23 Arbitrary Write 1  (0) 2022.08.31
#21 kernel UAF 2  (0) 2022.08.29
#20 Kernel UAF 1  (0) 2022.08.28
#19 Stack based BOF  (1) 2022.08.27
Comments