본문 바로가기

Use After Free(UAF) 취약점

@eouya22025. 7. 25. 09:54

 

 

Use After Free

말 그대로 메모리 참조에 사용한 포인터를 메모리 해제 후에 적절히 초기화 하지 않아서, 또는 해제한 메모리를 초기화 해주지 않고 다음 청크에 재할당 할 때 발생하는 취약점이다.

 

Dangling Pointer

댕글링 포인터는 유효하지 않은 메모리 영역을 가리키는 포인터를 말한다.

메모리를 동적할당 할 때, 포인터를 선언하고 malloc()함수가 반환하는 메모리 주소를 가리키게 한다.

해제할 때는 free()함수를 호출하는데, free()함수는 청크를 ptmalloc에 반환하기만 하고 청크의 주소를 담고있던 포인터는 따로 초기화 해주지 않는다. 따라서 free 이후 포인터를 개발자가 초기화 하지 않을경우 해당 포인터는 댕글링 포인터가 된다.

 

댕글링 포인터는 프로그램이 예상치 못한 동작을 하게 할 수도 있고, 공격자의 공격 수단으로 활용될 수 도 있다.

한번 free()를 진행하더라도 댕글링 포인터는 해제된 청크의 주소를 가리키고 있기 때문에 다시 free()가 가능한데,

이를 Double Free Bug라고 한다. Double Free Bug 에 대한 포스팅도 추후에 하도록 하겠다.

 

힙 익스플로잇 할 때 댕글링 포인터의 존재 여부를 먼저 확인하면 좋다!

 

// Name: dangling_ptr.c
// Compile: gcc -o dangling_ptr dangling_ptr.c
#include <stdio.h>
#include <stdlib.h>

int main() {
  char *ptr = NULL;
  int idx;

  while (1) {
    printf("> ");
    scanf("%d", &idx);
    switch (idx) {
      case 1:
        if (ptr) {
          printf("Already allocated\n");
          break;
        }
        ptr = malloc(256);
        break;
      case 2:
        if (!ptr) {
          printf("Empty\n");
        }
        free(ptr);
        break;
      default:
        break;
    }
  }
}

출처 : dreamhack.io

댕글링 포인터에 대해 이해할 수 있는 예제 코드이다.

case 2의 free()이후에 따로 포인터를 초기화 해주지 않아 댕글링 포인터가 생기게 된다.

malloc 직후의 모습이다. malloc에서 반환한 청크의 주소가 포인터 ptr에 저장 되었다.

 

free 직후의 모습이다. 해제된 청크는 (256bytes) tcache에 들어가 있는 모습이다.

ptr이 저장된 rbp-0x10에 저장된 값을 보면 위에서 malloc으로 할당한 청크의 주소가 들어가 있다.

이로써 free()로 동적 할당한 메모리를 해제해주는 것은 ptmalloc에 청크를 반환하기만 할 뿐, 해당 청크의 주소를 가리키는 포인터는 초기화 해주지 않는다는 것을 알 수 있다.

 

Use After Free가 왜 위험한가?

앞서 말했듯 free()는 메모리를 반환할 뿐 포인터는 해제해주지 않는다고 하였다.

malloc()함수에는 동적 메모리 해제 후 동일한 크기의 재요청에 대해 heap을 병합하거나 분할하는데 사용하는 시간을 절약하는 목적으로 병합 지연이라는 특성이 존재한다. 이 특성 때문에 free()이후 포인터를 적절한 값으로 초기화 해주지 않고 비슷한 크기의 할당을 요청할 경우, 처음에 free()했던 청크를 그대로 반환하는 취약점이 발생한다. 해당 청크에 중요한 값이 들어있으면 유출이 될 수 있고, 또 해당 포인터가 가리키는 청크에 값을 덮어 쓸 수 있다면 fd/bk등을 조작하여 프로그램의 흐름을 바꿀 수도 있을 것이다.

'PWN > 개념' 카테고리의 다른 글

Format String Bug(FSB) 취약점  (1) 2025.07.27
Double Free Bug(DFB) 취약점  (2) 2025.07.26
ptmalloc2 - Memory Allocator in Linux  (1) 2025.07.24
one_gadget  (0) 2025.07.23
PIE / RELRO  (0) 2025.07.23
eouya2
@eouya2 :: eouya2

개인공부 기록 / 틀린거 있으면 돌팔매질 부탁드립니다

목차