free 함수로 청크 해제 -> ptmalloc2는 이것을 tcache나 bins에 추가 후 관리
이후 비슷한 크기의 malloc 발생 시 연결리스트 탐색해 청크 재할당
청크 duplicated : 청크가 freelist(tcache,bins)에 중복 존재
duplicated free list를 이용하면 임의 주소에 청크를 할당할 수 있음
Double Free Bug
같은 청크를 두 번 해제할 수 있는 버그
ptmalloc2에서 발생
공격자에게 임의 주소 쓰기, 임의 주소 읽기, 임의 코드 실행, 서비스 거부 등의 수단으로 활용될 수 있
Dangling Pointer는 Double Free Bug를 유발하는 대표적인 원인
ptmalloc2에서, free list의 각 청크들은 fd와 bk로 연결
어떤 청크가 free list에 중복해서 포함된다면, 첫 번째 재할당에서 fd와 bk를 조작하여 free list에 임의 주소를 포함시킬 수 있
최근에는 관련한 보호 기법이 glibc에 구현되면서, 이를 우회하지 않으면 같은 청크를 두 번 해제하는 즉시 프로세스가 종료
Mitigation for Tcache DFB
정적 패치 분석
tcache_entry
double free를 탐지하기 위해 key포인터가 tcache_entry에 추가됨
tcache_entry는 해제된 tcache 청크들이 갖는 구조
일반 청크의 fd가 next로 대체되고, LIFO로 사용되므로 bk에 대응되는 값은 없음
tcache_put
tcache_put은 해제한 청크를 tcache에 추가하는 함수, 해제되는 청크의 key에 tcache라는 값을 대입하도록 변경
tcache는 tcache_perthread라는 구조체 변수를 가리킴
tcache_get
tcache_get은 tcache에 연결된 청크를 재사용할 때 사용하는 함수
tcache_get함수는 재사용하는 청크의 key값에 NULL을 대입
_int_free
_int_free은 청크를 해제할 때 호출되는 함수
재할당하려는 청크의 key값이 tcache이면 Double Free가 발생했다고 보고 프로그램을 abort
그 외의 보호 기법은 없으므로, 20번째 줄의 조건문만 통과하면 Double Free를 일으킬 수 있습
동적 분석
gdb를 이용하여 보호 기법의 적용 과정을 동적 분석
우회 기법
해제된 청크의 key값을 1비트만이라도 바꿀 수 있으면, 이 보호 기법을 우회 가능
Tcache Duplication
tcache에 같은 청크가 두 번 연결되는 것. double free bug로 발생시킬 수 있으며, tcache poisoning으로 응용될 수 있음.
tcache에 적용된 double free 보호 기법을 우회하여 Double Free Bug를 트리거하는 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// Name: tcache_dup.c
// Compile: gcc -o tcache_dup tcache_dup.c
#include <stdio.h>
#include <stdlib.h>
int main() {
void *chunk = malloc(0x20);
printf("Chunk to be double-freed: %p\n", chunk);
free(chunk);
*(char *)(chunk + 8) = 0xff; // manipulate chunk->key
free(chunk); // free chunk in twice
printf("First allocation: %p\n", malloc(0x20));
printf("Second allocation: %p\n", malloc(0x20));
return 0;
}
|
cs |
chunk가 tcache에 중복 연결되어 연속으로 재할당됨