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);
Comment