hacktricks/binary-exploitation/libc-heap/heap-memory-functions/heap-functions-security-checks.md

9.5 KiB

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

{% hint style="success" %} AWSハッキングの学習と練習:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングの学習と練習: HackTricks Training GCP Red Team Expert (GRTE)

HackTricksをサポート
{% endhint %}

詳細については次を確認してください:

{% content-ref url="unlink.md" %} unlink.md {% endcontent-ref %}

これは実行されたチェックの要約です:

  • チャンクの指定されたサイズが、次のチャンクに指定された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

詳細については次を確認してください:

{% content-ref url="malloc-and-sysmalloc.md" %} malloc-and-sysmalloc.md {% endcontent-ref %}

  • ファストビン検索中のチェック:
  • チャンクがアラインメントされていない場合:
  • エラーメッセージ: 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は常にアリーナ構造体を指している必要があります。
  • 次のチャンクが前のチャンクが使用中であることを示していない場合:
  • エラーメッセージ: 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

詳細については次を確認してください:

{% content-ref url="free.md" %} free.md {% endcontent-ref %}

  • _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