카테고리 없음

드림핵 stage12 Memory Corruption: Double Free Bug

O'bin 2022. 7. 31. 23:59

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에 중복 연결되어 연속으로 재할당됨