Double Free Bug
Double Free Bug (DFB)는 같은 청크를 두 번 해제할 수 있는 버그를 말합니다.
ptmalloc2에서 발생하는 버그 중 하나이며
공격자에게 임의 주소 쓰기, 임의 주소 읽기, 임의 코드 실행, 서비스 거부 등의 수단으로 활용될 수 있습니다.
지난 코스에서 배운 Dangling Pointer는 Double Free Bug를 유발하는 대표적인 원인입니다.
코드 상에서 Dangling Pointer가 생성되는지, 그리고 이를 대상으로 free를 호출하는 것이 가능한지 살피면
Double Free Bug가 존재하는지 가늠할 수 있습니다.
Double Free Bug를 이용하면 duplicated free list를 만드는 것이 가능한데
이는 청크와 연결리스트의 구조때문입니다.
ptmalloc2에서, free list의 각 청크들은 fd와 bk로 연결됩니다.
fd는 자신보다 이후에 해제된 청크를, bk는 이전에 해제된 청크를 가리킵니다.
해제된 청크에서 fd와 bk 값을 저장하는 공간은 할당된 청크에서 데이터를 저장하는 데 사용됩니다.
그러므로 만약 어떤 청크가 free list에 중복해서 포함된다면
첫 번째 재할당에서 fd와 bk를 조작하여 free list에 임의 주소를 포함시킬 수 있습니다.
오른쪽 실습 모듈을 통해서 fd, bk를 조작해볼 수 있습니다.
초기에는 Double Free에 대한 검사가 미흡하여 Double Free Bug가 있으면 트리거할 수 있었습니다.
특히, tcache와 관련해서는 얼마전까지도 보호 기법이 전무하여 Double Free의 쉬운 먹잇감이 되었습니다.
그러나 최근에는 관련한 보호 기법이 glibc에 구현되면서
이를 우회하지 않으면 같은 청크를 두 번 해제하는 즉시 프로세스가 종료됩니다.
Tcache Poisoning
Tcache Poisoning은 tcache를 조작하여 임의 주소에 청크를 할당시키는 공격 기법을 말합니다.
중복으로 연결된 청크를 재할당하면, 그 청크는 할당된 청크이면서 동시에 해제된 청크가 됩니다.
이 둘을 겹쳐보면 할당된 청크에서 데이터를 저장하는 부분이
해제된 청크에서는 fd와 bk 값을 저장하는 데 사용된다는 것을 알 수 있습니다.
따라서 공격자가 중첩 상태인 청크에 임의의 값을 쓸 수 있다면
그 청크의 fd와 bk를 조작할 수 있으며
이는 ptmalloc2의 free list에 임의 주소를 추가할 수 있음을 의미합니다.
ptmalloc2는 동적 할당 요청에 대해 free list의 청크를 먼저 반환하므로
이를 이용하면 공격자는 임의 주소에 청크를 할당할 수 있습니다.
Tcache poisoing으로 할당한 청크에 대해 값을 출력하거나
조작할 수 있다면 임의 주소 읽기, 임의 주소 쓰기가 가능합니다.
레퍼런스
https://learn.dreamhack.io/116#4
https://learn.dreamhack.io/107#9
'background > linux' 카테고리의 다른 글
SECCOMP (0) | 2022.12.01 |
---|---|
cyclic pattern for buffer overflow attack (0) | 2022.11.11 |
ptmalloc2 (0) | 2022.11.01 |
함수의 프롤로그와 에필로그 (0) | 2022.10.29 |
환경 변수(environ) (0) | 2022.10.11 |