ヒープ関数のセキュリティチェック

Reading time: 8 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

詳細については、以下を確認してください:

unlink

実施されたチェックの概要は以下の通りです:

  • チャンクの指定サイズが次のチャンクに示された prev_size と同じか確認
  • エラーメッセージ: corrupted size vs. prev_size
  • また、P->fd->bk == P および P->bk->fw == P も確認
  • エラーメッセージ: corrupted double-linked list
  • チャンクが小さくない場合、P->fd_nextsize->bk_nextsize == P および P->bk_nextsize->fd_nextsize == P を確認
  • エラーメッセージ: corrupted double-linked list (not small)

_int_malloc

詳細については、以下を確認してください:

malloc & sysmalloc

  • ファストビン検索中のチェック:
  • チャンクがアラインされていない場合:
  • エラーメッセージ: malloc(): unaligned fastbin chunk detected 2
  • フォワードチャンクがアラインされていない場合:
  • エラーメッセージ: malloc(): unaligned fastbin chunk detected
  • 返されたチャンクのサイズがファストビンのインデックスのために正しくない場合:
  • エラーメッセージ: malloc(): memory corruption (fast)
  • tcacheを埋めるために使用されたチャンクがアラインされていない場合:
  • エラーメッセージ: malloc(): unaligned fastbin chunk detected 3
  • スモールビン検索中のチェック:
  • victim->bk->fd != victim の場合:
  • エラーメッセージ: malloc(): smallbin double linked list corrupted
  • 各ファストビンチャンクに対して行われる統合中のチェック:
  • チャンクがアラインされていない場合トリガー:
  • エラーメッセージ: malloc_consolidate(): unaligned fastbin chunk detected
  • チャンクがインデックスのために異なるサイズを持っている場合:
  • エラーメッセージ: malloc_consolidate(): invalid chunk size
  • 前のチャンクが使用中でなく、前のチャンクのサイズが prev_chunk に示されたサイズと異なる場合:
  • エラーメッセージ: corrupted size vs. prev_size in fastbins
  • ソートされていないビン検索中のチェック:
  • チャンクサイズが異常(小さすぎるまたは大きすぎる)場合:
  • エラーメッセージ: malloc(): invalid size (unsorted)
  • 次のチャンクサイズが異常(小さすぎるまたは大きすぎる)場合:
  • エラーメッセージ: malloc(): invalid next size (unsorted)
  • 次のチャンクによって示された前のサイズがチャンクのサイズと異なる場合:
  • エラーメッセージ: malloc(): mismatching next->prev_size (unsorted)
  • victim->bck->fd == victim でない場合、または victim->fd == av (arena) でない場合:
  • エラーメッセージ: malloc(): unsorted double linked list corrupted
  • 常に最後のものをチェックしているため、その fd は常に arena 構造体を指している必要があります。
  • 次のチャンクが前のチャンクが使用中であることを示していない場合:
  • エラーメッセージ: malloc(): invalid next->prev_inuse (unsorted)
  • fwd->bk_nextsize->fd_nextsize != fwd の場合:
  • エラーメッセージ: malloc(): largebin double linked list corrupted (nextsize)
  • fwd->bk->fd != fwd の場合:
  • エラーメッセージ: malloc(): largebin double linked list corrupted (bk)
  • 大きなビン(インデックスによる)検索中のチェック:
  • bck->fd-> bk != bck の場合:
  • エラーメッセージ: malloc(): corrupted unsorted chunks
  • 大きなビン(次の大きい)検索中のチェック:
  • bck->fd-> bk != bck の場合:
  • エラーメッセージ: malloc(): corrupted unsorted chunks2
  • トップチャンク使用中のチェック:
  • chunksize(av->top) > av->system_mem の場合:
  • エラーメッセージ: malloc(): corrupted top size

tcache_get_n

  • tcache_get_n のチェック:
  • チャンクがアラインされていない場合:
  • エラーメッセージ: malloc(): unaligned tcache chunk detected

tcache_thread_shutdown

  • tcache_thread_shutdown のチェック:
  • チャンクがアラインされていない場合:
  • エラーメッセージ: tcache_thread_shutdown(): unaligned tcache chunk detected

__libc_realloc

  • __libc_realloc のチェック:
  • 古いポインタがアラインされていないか、サイズが不正な場合:
  • エラーメッセージ: realloc(): invalid pointer

_int_free

詳細については、以下を確認してください:

free

  • _int_free の開始時のチェック:
  • ポインタがアラインされている:
  • エラーメッセージ: free(): invalid pointer
  • サイズが MINSIZE より大きく、サイズもアラインされている:
  • エラーメッセージ: free(): invalid size
  • _int_free tcache のチェック:
  • mp_.tcache_count よりも多くのエントリがある場合:
  • エラーメッセージ: free(): too many chunks detected in tcache
  • エントリがアラインされていない場合:
  • エラーメッセージ: free(): unaligned chunk detected in tcache 2
  • 解放されたチャンクがすでに解放されており、tcache にチャンクとして存在する場合:
  • エラーメッセージ: free(): double free detected in tcache 2
  • _int_free ファストビンのチェック:
  • チャンクのサイズが無効(大きすぎるまたは小さすぎる)場合トリガー:
  • エラーメッセージ: free(): invalid next size (fast)
  • 追加されたチャンクがすでにファストビンのトップであった場合:
  • エラーメッセージ: double free or corruption (fasttop)
  • トップのチャンクのサイズが追加するチャンクのサイズと異なる場合:
  • エラーメッセージ: invalid fastbin entry (free)

_int_free_merge_chunk

  • _int_free_merge_chunk のチェック:
  • チャンクがトップチャンクの場合:
  • エラーメッセージ: double free or corruption (top)
  • 次のチャンクがアリーナの境界の外にある場合:
  • エラーメッセージ: double free or corruption (out)
  • チャンクが使用中としてマークされていない場合(次のチャンクの prev_inuse において):
  • エラーメッセージ: double free or corruption (!prev)
  • 次のチャンクが小さすぎるまたは大きすぎる場合:
  • エラーメッセージ: free(): invalid next size (normal)
  • 前のチャンクが使用中でない場合、統合を試みます。しかし、prev_size が前のチャンクに示されたサイズと異なる場合:
  • エラーメッセージ: corrupted size vs. prev_size while consolidating

_int_free_create_chunk

  • _int_free_create_chunk のチェック:
  • チャンクをソートされていないビンに追加する際、unsorted_chunks(av)->fd->bk == unsorted_chunks(av) を確認:
  • エラーメッセージ: free(): corrupted unsorted chunks

do_check_malloc_state

  • do_check_malloc_state のチェック:
  • アラインされていないファストビンチャンクの場合:
  • エラーメッセージ: do_check_malloc_state(): unaligned fastbin chunk detected

malloc_consolidate

  • malloc_consolidate のチェック:
  • アラインされていないファストビンチャンクの場合:
  • エラーメッセージ: malloc_consolidate(): unaligned fastbin chunk detected
  • 不正なファストビンチャンクサイズの場合:
  • エラーメッセージ: malloc_consolidate(): invalid chunk size

_int_realloc

  • _int_realloc のチェック:
  • サイズが大きすぎるまたは小さすぎる場合:
  • エラーメッセージ: realloc(): invalid old size
  • 次のチャンクのサイズが大きすぎるまたは小さすぎる場合:
  • エラーメッセージ: realloc(): invalid next size

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする