Use After Free (UAF) 너 뭐임??

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>
#include <stdlib.h>

int main() {
    int *heap1, *heap2, *heap3;

    heap1 = malloc(4);
    *heap1 = 0xcaaaaaaa;

    printf("heap1 address : %#x, %#x\n", heap1, *heap1);

    free(heap1);

    heap2 = malloc(4);
    printf("heap2 address: %#x, %#x\n", heap2, *heap2);
 
    free(heap2);
   
    heap3 = malloc(1024);
   
    printf("heap3 address : %#x, %#x\n", heap3, *heap3);
    return 0;
}

우분투에서 위의 예제 코드를 돌려보면 아래 사진과 같은 출력값이 나오게 된다.

 

uaf 예제 실행 결과

 

1. heap1을 할당하고 free 해주고, 다른 변수(heap2)에 같은 크기로 할당하면 다시 그 공간을 재사용함.

2. free를 해주어도 그전에 사용했던 공간에 할당 가능함.

3. 사이즈를 다르게 입력하면 다른 공간에 할당함.

 

 

 

만약 함수의 포인터가 동적 할당이 되어있다면, 공격자가 원하는 데로 프로그램의 흐름을 변경시켜 공격할 수 있을 것이다.

 

시간이 된다면 예제를 사용해 실습하고 heap 영역을 분석을 해봐야겠다.