167 lines
8.0 KiB
Markdown

# ヒープ関数のセキュリティチェック
{{#include ../../../banners/hacktricks-training.md}}
## unlink
詳細については確認してください:
{{#ref}}
unlink.md
{{#endref}}
実施されたチェックの概要は以下の通りです:
- チャンクの指定サイズが次のチャンクに示された `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
詳細については確認してください:
{{#ref}}
malloc-and-sysmalloc.md
{{#endref}}
- **ファストビン検索中のチェック:**
- チャンクが不揃いの場合:
- エラーメッセージ: `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`
詳細については確認してください:
{{#ref}}
free.md
{{#endref}}
- **`_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`
{{#include ../../../banners/hacktricks-training.md}}