ssongk
ssongk
ssongk
전체 방문자
오늘
어제

공지사항

  • resources
  • 분류 전체보기 (626)
    • CTF (24)
    • background (79)
      • fuzzing (5)
      • linux (29)
      • linux kernel (15)
      • windows (2)
      • web assembly (1)
      • embedded (0)
      • web (13)
      • crypto (9)
      • mobile (1)
      • AI (1)
      • etc.. (3)
    • write-up(pwn) (171)
      • dreamhack (102)
      • pwn.college (4)
      • pwnable.xyz (51)
      • pwnable.tw (3)
      • pwnable.kr (5)
      • G04T (6)
    • write-up(rev) (32)
      • dreamhack (24)
      • reversing.kr (8)
    • write-up(web) (195)
      • dreamhack (63)
      • LOS (40)
      • webhacking.kr (69)
      • websec.fr (3)
      • wargame.kr (6)
      • webgoat (1)
      • G04T (7)
      • suninatas (6)
    • write-up(crypto) (19)
      • dreamhack (16)
      • G04T (1)
      • suninatas (2)
    • write-up(forensic) (53)
      • dreamhack (5)
      • ctf-d (47)
      • suninatas (1)
    • write-up(misc) (13)
      • dreamhack (12)
      • suninatas (1)
    • development (31)
      • Linux (14)
      • Java (13)
      • Python (1)
      • C (2)
      • TroubleShooting (1)
    • 자격증 (8)
    • 이산수학 (1)
    • 정보보안 (0)
hELLO · Designed By 정상우.
ssongk

ssongk

background/linux

Double Free Bug & Tcache Poisoning

2022. 11. 3. 17:47

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

 

로그인 | Dreamhack

 

dreamhack.io

https://learn.dreamhack.io/107#9

 

로그인 | Dreamhack

 

dreamhack.io

 

'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
    'background/linux' 카테고리의 다른 글
    • SECCOMP
    • cyclic pattern for buffer overflow attack
    • ptmalloc2
    • 함수의 프롤로그와 에필로그
    ssongk
    ssongk
    벌레 사냥꾼이 되고 싶어요

    티스토리툴바