Studying Security

[glibc] malloc 정리3 - arena 본문

개념 정리/Heap

[glibc] malloc 정리3 - arena

J4guar 2022. 4. 20. 15:51
728x90
반응형

Arena

  • ptmalloc2는 각 thread가 서로 간섭하지 않고, 서로 다른 메모리 영역에 액세스 할 수 있게 합니다.
    • 이러한 메모리 영역을 "Arena"라고합니다.
    • main_arena와 thread_arena가 존재
  • malloc()에는 이 Arena를 가리키는 정적 변수가 있으며 각 Arena에는 추가 Arena를 연결하는 다음 포인터가 있습니다. (main_arena 제외)
  • 각 Arena는 하나 이상의 힙 메모리를 얻습니다.
    • main_arena는 프로그램의 초기 힙을 사용합니다 (.bss 등 직후 시작).
    • 추가 Arena는 mmap를 통해 힙에 메모리를 할당하고, 이전 힙이 소모되면 더 많은 힙을 힙목록에 추가합니다.
  • Arena는 heap 메모리에서 할당된 chunk들을 관리합니다.
    • Arena에서 관리되는 chunk들은 응용 프로그램에서 사용 중이거나 사용이 가능한 chunk들 입니다.
    • 사용중인 chunck는 Arena에서 추적되지 않습니다.
    • Free chunk는 크기와 히스토리에 따라 분류되어 arena에 저장됩니다.
    • 할당자는 arena에서 할당 요청을 충족하는 chunk를 신속하게 찾을 수 있습니다.

struct malloc_state main_arena

Multiple Heaps

heap_info - Heap Header

thread arena는 여러 개의 heap을 가질 수 있고 각각의 heap은 각각의 header를 가짐

추가적인 heap 공간이 필요할 경우 새로운 heap 공간은 기존의 heap 공간과 연속적으로 생성되지 않고 새로운 공간에 생성되며 arena에 mapping된다

malloc_state - Arena Header

thread arena는 여러 개의 heap을 가져도 arena header는 하나이다

arena header는 bins, top chunk, last remainder chunk 등에 관한 정보를 지님

  • mutext는 arena에 대한 access를 제어하는데 사용 → 여러 thread간에 arena 사용 충돌이 발생하는 것을 방지
    • race condition을 막을 수 있지만 병목현상이 발생할 수 있음
    • 병목현상을 완화시키기 위해 tcache를 추가적으로 도입함
  • main_arena의 flags는 2개의 bit로 정보들의 유무를 나타냅니다.
    • 첫번째bit는 해당 Arena가 fastbin(fastchunk)를 가지고 있는지 나타냅니다.
      • fastbin(fastchunk)이 arena에 있다면 0이, 없다면 1
    • 두번째bit는 해당 Arena가 인접한지를 나타냅니다.
      • 해당 arena가 인접한 arena라면 1이, 아니면 0
  • Non-main arena는 하위 heap으로 구성되며 항상 NONCONTIGUOUS_BIT가 설정됩니다.
  • fastbins에 fastbin에 해당하는 free chunk가 배치됩니다.
  • binmap은 bins를 4(BINMAPSIZE)개의 영역으로 나누어서 정보를 배치합니다.
    • binmap[0] : 0 ~ 31, binmap[1] : 32 ~ 64, binmap[2] : 65 ~ 96, binmap[3] : 97 ~128
      • bins[]에 free chunk가 배치되면, binmap[]에는 그 bin이 해당하는 위치에 해당 bin의 bit가 배치됩니다.
    • 예를 들어 크기가 256byte인 free chunk의 인덱스는 65이며, binmap[2]에 bit정보가 저장됩니다.
      • 할당자는 idx2bit() 함수를 이용하여 저장할 bit값을 계산합니다.
      • binmap[2]에는 2(1 << (index(65) & 31))가 배치됩니다.
    • binmap[] 배열을 사용하면 많은양의 빈 검색이 간소화됩니다. 
  • next는 여러 arena가 있는 경우에 추가 arena을 연결하는 포인터입니다.

malloc_chunk - Chunk Header

heap 공간은 요청에 따라 여러 개의 chunk로 나뉘어지는데 각각의 chunk는 각각의 chunk header를 가짐

만약 top chunk size가 요청한 size 보다 적다면?

sbrk(main arena)를 이용해 확장하거나 mmap(thread arena) syscall을 수행

  • 할당자는 요청받은 chunk의 크기가 DEFAULT_MMAP_THRESHOLD(131072)보다 큰경우 mmap()을 호출하여 새로운 Heap 영역을 매핑합니다.

  • 할당자는 메모리를 할당하기에 main_arena의 공간이 부족할 경우 sbrk()를 호출하여 메모리의 공간을 증가시킵니다.
    • malloc.c에서는 MORECORE라는 매크로를 이용하여 sbrk() 함수를 호출합니다.

Reference

 

Understanding glibc malloc

I always got fascinated by heap memory. Questions such as How heap memory is obtained from kernel? How efficiently memory is managed? Is it managed by kernel or by library or by application itself?…

sploitfun.wordpress.com

 

01.Malloc - glibc(ptmalloc2)[Korean] - TechNote - Lazenca.0x0

“html” 매크로 렌더링 오류 Notify your Confluence administrator that "Bob Swift Atlassian Apps - HTML" requires a valid license. Reason: VERSION_MISMATCH Excuse the ads! We need some help to keep our site up. “html” 매크로 렌더링 오

www.lazenca.net

 

malloc.c - malloc/malloc.c - Glibc source code (glibc-2.31) - Bootlin

/* Malloc implementation for multiple threads without lock contention. Copyright (C) 1996-2020 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Wolfram Gloger and Doug Lea , 2001. The GNU C Library is free software; you

elixir.bootlin.com

 

반응형

'개념 정리 > Heap' 카테고리의 다른 글

[Heap Exploit] Double Free Bug(DFB)  (0) 2022.04.22
[glibc] malloc 정리4 - tcache  (0) 2022.04.21
[Heap Exploit] Use-After-Free(UAF)  (0) 2022.04.21
[glibc] malloc 정리2 - bin  (0) 2022.04.20
[glibc] malloc 정리  (0) 2022.04.19
Comments