Double Free
리소스를 두번 이상 free하면 메모리 누수가 발생한다. allocator의 데이터 구조가 공격자에 의해서 손상되어 exploit 될 수 있다.
아래의 샘플 프로그램에서 fastbin chunk가 두 번 해제됩니다. glibc에 의한 'double free or corruption(fasttop)' security check을 피하기위해 두 free 사이에 다른 청크가 free된다.
이것은 동일한 두개의 청크가 서로 다른 malloc에 의해 반환된다는 것을 의미한다.
아래에서 d 와 f 포인터는 동일한 메모리 주소를 가리킨다. d 나 f 둘 중 하나의 메모리 수정이 이루어지면 다양한 공격으로 이루어질 수 있다.
a = malloc(10); // 0xa04010
b = malloc(10); // 0xa04030
c = malloc(10); // 0xa04050
free(a);
free(b); // To bypass "double free or corruption (fasttop)" check
free(a); // Double Free !!
d = malloc(10); // 0xa04010
e = malloc(10); // 0xa04030
f = malloc(10); // 0xa04010 - Same as 'd' !
fastbin의 상태 :
1. 'a' free됨
head -> a -> tail
2. 'b' free됨
head -> b -> a -> tail
3. 'a' 다시 free됨
head -> a -> b -> a -> tail
4. 'd' malloc요청
head -> b -> a -> tail (a 공간 리턴)
5. 'e' malloc 요청
head -> a -> tail (b 공간 리턴)
6. 'f' malloc 요청
head -> tail (a 공간 리턴)
이제, 'd' 와 'f' 포인터는 같은 메모리 주소를 가리킨다. smallbin 범위에서 크기가 변경될 시 예제 작동 x
첫번째 free에서 next chunk의 prev_inuse 비트가 0으로 설정도니다. 두번째 free 과정에서 이 비트가 0이면 "double free or corruption(!prev)" 오류가 발생한다.
'Heap' 카테고리의 다른 글
11.Unlink Exploit (0) | 2018.06.11 |
---|---|
10.Forging chunks (0) | 2018.06.07 |
08.First-fit behavior (0) | 2018.06.06 |
07.Security Checks (1) | 2018.06.05 |
06.malloc 분석 (0) | 2018.06.05 |