4n6x4t

Heap Overflow Attacks 원리와 대응방안 3가지 본문

Study/System Security

Heap Overflow Attacks 원리와 대응방안 3가지

HCHC 2023. 5. 2. 10:24
728x90

그냥한번 넣어봤습니다.

Heap?: stack과 마찬가지로 동적으로 영역의 크기가 변하는 메모리 공간

위의 그림처럼 malloc(5)이 실행되면 5의 크기를 만족하는 free chunk를 찾는다.

각 청크에는 주소와 크기가 적혀있는데 이것을 확인해서 크기 5를 만족하는 청크에 할당하는 원리이다.

뒤에 자세히 후술하겠지만, 이 청크를 free()로 unlinking 하는 과정에서 힙오버플로우가 발생하게 된다.

사용된 청크를 할당해제(dealloc)하고 freelist에 추가하게되면, 인접한 free chunk와 list가 합쳐진다.

여기서 중요한게 힙의 각 청크에는 메타데이터가 존재한다는 것입니다.

힙의 관리를 위해 모든 청크는 메타데이터를 header에 갖는다.

 

위와 같이 chunk 앞에 header가 있어서 overflow 발생 시 다음 chunk의 header를 overwrite 가능하다.

즉 metadata와 data가 붙어있는 in-band 구조가 문제이다.

SoF는 Return address를 덮어써서 RA를 공격자가 원하는 코드 주소로 보내는 취약점이었다면

HoF는 이를 포함해서 프로그램 필요 정보조작을 통한 공격이 가능하기 때문에 SoF에 비해서 공격의 범위가 넓다.

 

힙 청크의 레이아웃이다. 각각 할당된 것과 비할당된 청크의 구조를 볼 수 있다. 특히 비할당 청크에는 Forward pointer to next(fd)와 Back pointer to previous(bk)가 존재하게 된다.

 

전체적인 힙오버플로우의 과정은 다음과 같다. char *b가 있는 b 청크를 free()해주고, a 청크에서 strcpy()로 b청크를 덮어쓴다. 이 후 a청크를 free()해주게 되면 미할당영역에 메타데이터를 넣을 수 있게된다. (double free bug라고도 함)

이 과정을 통해서 fd, bk를 free chunk 속에 넣을 수 있는데 이것이 실행되며 exploit되게 된다.

overwrite the 'fd' = 'where - 12', 'bk' = 'what'

위와 같은 공식이 성립되게 되는데, 예를 들면 puts_got - 12 를 puts_got을 overwrite할 값으로 넣으면 된다.

대응방안 3가지

  1. Sanity check : free 시 magic number를 사용하여 변조여부를 확인하는 방법으로 스택가드와 유사하다
  2. DEP(Data Execution Prevention): 스택에 더해 힙, 그리고 다른 영역(코드 영역 제외)에서 실행권한을 막음으로서 힙에 악성코드가 주입되더라도 실행이 안되게 만든다. NX-bit와 유사하다.
  3. ASLR(Address Space Layout Randomization): 함수의 메모리 주소를 랜덤화하는 것으로 공격 난이도를 올리지만 완벽히 공격을 차단하지 못한다는 한계가 있다.

이상으로 힙오버플로우에 대한 설명을 마치겠습니다. 감사합니다.

728x90
Comments