UAF(user after free)

UAF(user after free)

Memory corruption vulnerability 중 하나로 웹 브라우저, 운영체제와 같은 소프트웨어 및 커널에서는 복잡한 데이터 구조와 효율적 관리를 위해 c 언어 계열로 작성되며, 메모리를 참조하는 부분에서 발생한다. 취약점 원인은 두 가지 타입으로 나뉜다.

1)할당 해제 후 재사용:

malloc 함수는 caching 기능이 있어 Heap 영역의 병합 혹은 분할의 시간을 절약하게 해주지만, free()로 해제한 경우 할당됐던 공간을 참조하여 이전 데이터를 확인할 수 있다.

→별도의 초기화를 해줘야 함

2)둘 이상의 포인터가 특정 영역을 공유하여 참조할 때 영역 해제후 허상 포인터 사용:

할당 해제된 메모리를 다른 프로세스에게 재할당 해주게 되면 기존 프로그램이 허상포인터를 역참조하게 되어 해당 영역을 덮어쓸 수 있는 경우 공격자에게 취약하다.

→메모리 객체를 명시적으로 지우거나 스택 메모리 지울 때 포인터 변경 혹은 null값을 준다.

void func()
{
    char *dp = malloc(A_CONST);
    /* ... */
    free(dp);         /* dp now becomes a dangling pointer */
    dp = NULL;        /* dp is no longer dangling */
    /* ... */
}

+)Dangling 포인터 외에도 void, null, wild pointer가 궁금하다면

https://www.geeksforgeeks.org/dangling-void-null-wild-pointers/

 


DFB(double free bug)

heap 공간에서 메모리 해제를 2번 free()하여 발생하는 취약점. memory leak을 야기한다.

Examples

#define BUFSIZE1    512
#define BUFSIZE2    ((BUFSIZE1/2) - 8)

int main(int argc, char **argv) {
  char *buf1R1;
  char *buf2R1;
  char *buf1R2;

  buf1R1 = (char *) malloc(BUFSIZE2);
  buf2R1 = (char *) malloc(BUFSIZE2);

  free(buf1R1);
  free(buf2R1);

  buf1R2 = (char *) malloc(BUFSIZE1);
  strncpy(buf1R2, argv[1], BUFSIZE1-1);

  free(buf2R1);
  free(buf1R2);