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

172 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ヒープ関数のセキュリティチェック
<details>
<summary><strong>htARTEHackTricks AWS Red Team Expert</strong>を通じてゼロからヒーローまでAWSハッキングを学ぶ</summary>
HackTricksをサポートする他の方法
- **HackTricksで企業を宣伝したい**または**HackTricksをPDFでダウンロードしたい**場合は、[**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)をチェックしてください!
- [**公式PEASSHackTricksグッズ**](https://peass.creator-spring.com)を入手する
- [**The PEASS Family**](https://opensea.io/collection/the-peass-family)を発見し、独占的な[**NFTs**](https://opensea.io/collection/the-peass-family)のコレクションを見つける
- 💬 [**Discordグループ**](https://discord.gg/hRep4RUj7f)または[**telegramグループ**](https://t.me/peass)に**参加**するか、**Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)をフォローする
- ハッキングトリックを共有するために、[**HackTricks**](https://github.com/carlospolop/hacktricks)と[**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud)のGitHubリポジトリにPRを提出する
</details>
## unlink
詳細については、以下をチェックしてください:
{% content-ref url="unlink.md" %}
[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](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](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`