/ POSTS

Use After Free

0x0c Use After Free

안녕하세요. Joel입니다.

오늘은 Use After Free에 대해 알아보도록 하겠습니다.

What is Use After Free?

Use After Free는 단어 그대로 Free된 Pointer를 사용했을 때 발생하는 취약점입니다.

UAF를 설명할 때 주로 다음의 샘플 코드를 많이 이용하는데 UAF를 한 번에 잘 설명하고 있습니다.

Object *obj = (Object *)malloc(sizeof(Object));
obj->Method();
free(obj);		// Free
...
obj->Method();	// Use

위 코드의 첫 코드를 보면 malloc으로 Object의 크기만큼 Heap을 할당해주고 있습니다.

그리고 세 번째 줄에서 할당했던 객체를 해제해주고 있죠.

마지막 코드를 보시면, 이미 해제된 Pointer가 다시 사용되고 있는 것을 알 수 있습니다.

이처럼, Free된 후 해당 메모리를 가리키던 Pointer가 다시 사용될 때를 UAF 버그라고 이야기합니다.

그런데..이거 가지고 뭘 할 수가 있지??

그렇죠.. 아직 이 코드만 가지고는 명확한 이해가 안 될 수 있습니다.

다음 예제를 가지고 조금 더 쉽게 설명해보도록 하겠습니다.

UAF Example
#include <stdio.h>
#include <stdlib.h>

typedef struct uaf {

	void (*vulnfunc)();

}uaf;

void good() {
	printf("I'm Joel\n");
}

void bad() {
	printf("I'm not Joel\n");
}

int main(int argc, char* cargv[]) {

	uaf * first = malloc(sizeof(uaf));
	uaf * second;

	first->vulnfunc = good;
	first->vulnfunc();

	free(first);

	second = malloc(sizeof(uaf));
	second->vulnfunc = bad;
	
	first->vulnfunc();

	return 0;
}

위 코드를 보면 먼저, first라는 객체에 uaf 크기만큼 Heap을 할당해주었습니다.

그리고 vulnfunc에 good 함수의 주소를 넣어주었습니다.

그럼 first->vulnfunc();를 실행하게 되면 “I’m Joel”이라는 메시지가 출력되겠네요.

여기까진 쉽죠??

이후 first를 free 해줍니다.

그리곤 second 객체를 생성하고 uaf 크기만큼 Heap을 할당해주었습니다.

uaf 크기만큼 할당하고 해제한 뒤, 다시 uaf 크기만큼 할당하면 second는 first가 할당받았던 Heap과 동일한 영역을 할당받게 됩니다.

지난 번 Heap 구조를 설명했던 것.. 기억하시나요?

할당된 Heap을 해제하게 되면 Kernel로 바로 보내버리는 게 아니라, List에 넣어둔다고 했었죠?

그런 다음 다시 동일한 크기의 Heap을 할당해달라고 요청하면 방금 해제된 영역을 재할당해줍니다.

그럼 first가 해제된 다음 second를 요청하니까 second에는 first에 할당되었던 것과 동일한 영역이 할당되겠죠?

지금까지 설명한 내용을 표현하자면 다음과 같이 됩니다.

[그림 1-1]

다시 코드로 돌아가서, second의 vulnfunc에 bad 함수의 주소를 넣어주고 있습니다.

마지막으로, 이미 해제된 Pointer를 요청합니다.

first->vulnfunc()를 호출하면 어떤 일이 생기게 될까요?

second에 bad의 함수를 넣어뒀기 때문에 I’m not Joel이 호출되겠죠?

[그림 1-1]

실제 실행을 해보니 동일하게 구동이 되네요.

지금까지 설명한 것을 중요 부분만 한 번 더 따라가 볼게요.

uaf * first = malloc(sizeof(uaf));
first->vulnfunc = good;
first->vulnfunc();

first 객체를 생성하고 uaf만큼 Heap을 할당해줍니다.

free(first);

그런 다음 free로 해제해줍니다.

first->vulnfunc();

그리고 개발자의 부주의로 인해 이미 할당 해제된 Pointer가 재사용되고 있습니다.

뭔가 감이 오시나요?

해제와 재사용 사이에 second 객체 부분이 있었고, second는 first와 동일한 크기, 위치를 할당받았었죠?

이 second 부분이 맨 처음 샘플 코드에서 … 부분인데, 이 부분에서 만약 shellcode의 주소로 바꿀 수 있다면 어떻게 될까요?

first->vulnfunc();가 구동되는 순간, Pointer가 가리키는 영역엔 shellcode의 주소가 있을 것이고…

shellcode가 실행되겠죠?

지금까지 설명한 내용이 UAF의 기본 개념입니다.

UAF를 이용한 Exploit은 UAF의 절친 HeapSpray을 살펴본 후 진행할 예정이니까 그때까지만 기다려주세요 ㅎㅎ

다음 글에서 뵙겠습니다!