2020. 4. 24. 21:43ㆍ개인 공부/Use After Free (UAF)
UAF 취약점에 대해서 알아보자.
취약점의 유형 중 Memory Corruption Vulnerability(메모리 오염 취약점)에 대해서 공부하던 중 UAF 취약점을 처음 접하게 되었다. 일단 UAF 취약점이 Memory Corruption에 속해 있으니 먼저 정의를 살펴보자.
Memory Corruption (메모리 오염)
- 메모리를 참조하는 부분에서 오류가 발생해 생기는 취약점
- 공격자는 메모리가 Corruption 되는 부분을 이용해 공격자가 원하는 명령어를 참조하도록 수행 가능
이제 Memory Corruption의 정의를 알았다면 한 가지 더 메모리 구조에 대해 이해가 필요하다. 왜냐?
UAF는 Heap 영역에서 일어나는 취약점이며 Heap은 메모리 영역 중 하나이기에 메모리 구조를 알아야 한다.
간단하게 설명하자면, 일단 프로그램이 실행되면 실행에 필요한 정보들이 Memory 영역에 올라가게 되는데, 크게는 Code 영역, Data 영역, Stack영역, Heap 영역이 있다.
- Code 영역 : 프로그램의 코드가 올라가는 곳임. 코드란, 컴파일된 기계어 코드임.
- Data 영역 : Global Variable과 Static Variable이 할당되는 곳임.
( 초기화 된 Data -> Data 영역 , 초기화되지 않은 데이터 -> bss 영역에 구분되어서 저장됨 )- Stack 영역 : Local Variable과 Parameter가 저장되는 곳임. 함수가 시작되면 해당 함수의 Local Variable이 스택에 저장되었다가 함수가 종료되면 해당 영역을 해제시킴
- Heap 영역 : 빈 공간임. 필요에 따라 동적으로 메모리를 할당하기도 하고 해제하기도 함.
Heap 영역은 Stack에서 관리하는 이외의 데이터 형태를 사용하며, 컴파일 시 크기를 알지 못하다가, 프로그램이 실행되었을 때 크기가 결정되는 동적 할당 메모리를 받는 데 사용됨.
Use After Free (UAF)
- 줄여서 UAF라 부름
- Heap 영역에서 할당된 (malloc ) 공간을 free로 영역을 해제하고, 메모리를 다시 할당 시 같은 공간을 재사용 하면서 생기는 취약점임
#include <stdio.h> |
우분투에서 위의 예제 코드를 돌려보면 아래 사진과 같은 출력값이 나오게 된다.
1. heap1을 할당하고 free 해주고, 다른 변수(heap2)에 같은 크기로 할당하면 다시 그 공간을 재사용함.
2. free를 해주어도 그전에 사용했던 공간에 할당 가능함.
3. 사이즈를 다르게 입력하면 다른 공간에 할당함.
만약 함수의 포인터가 동적 할당이 되어있다면, 공격자가 원하는 데로 프로그램의 흐름을 변경시켜 공격할 수 있을 것이다.
시간이 된다면 예제를 사용해 실습하고 heap 영역을 분석을 해봐야겠다.