Computer Security

#21 kernel UAF 2 본문

리눅스 커널 해킹

#21 kernel UAF 2

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

 

7. dangling pointer , dangling pointer생성과정

 

 

 

 

허상 포인터(dangling pointer)

 

컴퓨터 프로그래밍에서 적절한 타입의 유효한 객체를 가리키고 있지 않는 포인터를 말한다. 

 

 

 

 


dangling pointer 생성과정 

 

 

 

먼저, 디바이스 드라이버의 전역 변수는 해당 드라이버가 close 되어도 메모리 상에서 사라지지 않는다.

(rmmod로 커널에서 삭제해야만 메모리상에서 제거된다.)

 

exp.c 코드에서 두 개의 uaf 드라이버를 open 후 하나의 드라이버를 close한다.

 

남은 하나의 드라이버에서 전역 변수 ptr에 접근할 수 있으며, 이 때 ptr은 해제된 슬랩 객체를 가리키고 있는 dangling pointer가 되어있다.

 

 

 

 

 


8. 포크함수를 호출해 danging pointer가 자식프로세서의 struct cred를 가리키도록 설정하는 원리에 대해 알아보자.

 

 

 

 

1. fork()함수를 호출하면 _do_fork() 함수를 호출하게 된다.

copy_process() 함수를 호출하는 것을 알 수 있다.

 

 

 


2. copy_process()

copy_process 일부분

copy_creds() 함수를 호출하는 것을 볼 수 있다.

 

 

 


3. copy_creds() 함수를 살펴보자.

copy_creds()

prepare_creds()함수를 호출하는 것을 볼 수 있다.

 

 

 


4. prepare_creds() 함수를 살펴보자.

prepare_creds()

kmem_cache_alloc() 함수를 호출하는 것을 볼 수 있다.

 

이 kmem_cache_alloc() 함수가 바로 인자로 넣은 슬랩 캐시로부터 슬랩 객체를 할당 받는 저수준 커널 함수이다.

(커널 힙 영역을 할당 받는 함수이다!)

 

 

 

 

 


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

./start.sh

 

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

 

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

 

 

 

 

 


Kernel UAF 최종 정리

 

 

 

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

 

일반적으로 디바이스 드라이버에서의 UAF 취약점은, 전역 변수가 초기화 되지 않아 dangling pointer가 되어 발생하는 취약점이 일반적이다.

 

이러한 UAF control이 가능할 때, struct cred 뿐만 아니라 특정한 함수 포인터를 덮은 뒤 kernel stack pivoting 기법을 연계해서 권한 상승을 일으킬 수도 있다.

 

반응형

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

#23 Arbitrary Write 1  (0) 2022.08.31
#22 Kernel Heap Overflow  (0) 2022.08.30
#20 Kernel UAF 1  (0) 2022.08.28
#19 Stack based BOF  (1) 2022.08.27
#18 struct cred overwrite 기법  (2) 2022.08.26
Comments