Computer Security

#19 Stack based BOF 본문

리눅스 커널 해킹

#19 Stack based BOF

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

Stack based BOF

 

 

스택에 위치한 버퍼에 할당된 크기보다 더 많은 데이터가 쓰여질 때 발생하며, 이를 이용해 스택의 retrun address등을 덮어 프로그램의 흐름을 변조할 수 있는 취약점이다.

 

하나의 태스크에는 유저 공간 전용 스택도 존재하고, 커널 공간 전용 스택도 존재한다.

 

유저 공간의 스택과 마찬가지로 커널 공간의 커널 스택도 BOF가 발생할 수 있다.

 

 

 

 


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

stack_based_BOF

 

start.sh : qemu script

bof.c : Stack based BOF 취약점이 터지는 디바이스 드라이버 예제

exp.c : struct cred overwrite기법을 이용해 권한 상승을 일으키는 exploit code

 

 

 

 


1. cat start.sh를 통해 걸려있는 보호기법을 살펴보자.

cat start.sh

 

KASLR : 적용 X

SMEP/SMAP : 적용 O

KPTI : 적용 O

 

 

 

 


2. bof.c 중 bof_read()함수를 살펴보자.

bof_read()

1. 만약, 전달 받은 세 번째 인자 count가 32보다 클 경우 실행을 종료한다.

 

2. 전달 받은 count 인자를 unsigned char 형으로 형변환한 뒤, len 변수에 저장한 후, len 변수에서 -1을 한다.

 

3. copy_to_user() 함수를 이용해 arr 배열로부터 len 크기만큼 커널 데이터를 유저 공간으로 전달한다.

 

4. kbuild에 의해 컴파일 과정에서 SSP(canary) 보호 기법이 자동으로 적용된다.

 

 

 

 


integer underflow

count 값으로 0을 준다면, 위와 같은 조건문을 통과할 수 있다.

 

하지만 -1 연산 떄문에 integer underflow가 발생해 len이 255가 되었으므로, 이후 작업에서 Stack based BOF가 발생한다.

 

발생한 Stack based BOF를 이용해 canary leak이 가능하다.

 

 

 

 

 


3. bof.c 중 bof_write()함수를 살펴보자.

bof_write()

1. 만약, 전달 받은 세 번째 인자 count가 32보다 클 경우 실행을 종료한다.

 

2. 전달 받은 count 인자를 unsigned char 형으로 형변환한 뒤, len 변수에 저장한 후, len 변수에서 -1을 한다.

 

3. copy_to_user() 함수를 이용해 유저로부터 len 만큼 데이터를 전달 받은 뒤, 지역 변수 arr에 복사한다.

 

4. bof_read() 함수와 마찬가지로 integer underflow로 인한 Stack based BOF가 발생한다.

 

 

 

 

 


4. exp.c 코드의 main()함수 부분을 살펴보자.

main()

1. read() 함수를 호출해서 integer underflow를 이용해 canary leak한다.

 

2. 현재의 context를 저장하는 backup_rv()함수를 호출한다.

 

3. 권한 상승을 일으키는 commit_creds(pre... 코드 및 필요한 명령, 저장한 context, canary, KPTI 우회 가젯을 이용해서 ROP payload를 구성한다.

 

4. write() 함수를 호출해서 integer underflow를 이용해 ROP payload를 전달한다.

 

 

 

 

 


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

start.sh

 

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

 

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

 

 

 

 

 

 


Stack based BOF 최종 정리

 

 

 

커널 공간의  커널 스택에도 유저 공간의 스택과 마찬가지로 작업을 마친 뒤 복귀할 주소가 저장된 return address가 존재한다.

 

return address를 조작하는 것으로 커널의 흐름을 바꿀 수 있다.

 

일반적으로 SSP가 기본적으로 걸려있기 때문에 canary leak 과정을 통해 이를 우회해야 한다.

 

 

반응형

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

#21 kernel UAF 2  (0) 2022.08.29
#20 Kernel UAF 1  (0) 2022.08.28
#18 struct cred overwrite 기법  (2) 2022.08.26
#17 kernel stack pivoting 기법  (0) 2022.08.25
#16 cr4 overwrite 기법  (0) 2022.08.24
Comments