歴史
ヒープオーバーフロー
ヒープオーバーフローまたはヒープオーバーランは、ヒープデータ領域で発生するバッファオーバーフローの一種です。ヒープオーバーフローは、スタックベースのオーバーフローとは異なる方法で悪用可能です。ヒープ上のメモリは、実行時にアプリケーションによって動的に割り当てられ、通常はプログラムデータが含まれます。このデータを特定の方法で破壊することにより、アプリケーションがリンクリストポインターなどの内部構造を上書きすることにより、悪用が実行されます。正規のヒープオーバーフロー手法は、動的メモリ割り当てリンケージ(mallocメタデータなど)を上書きし、結果のポインター交換を使用してプログラム関数ポインターを上書きします。
Linuxの古いバージョンでの典型的な例は、ヒープ上で隣り合わせに割り当てられた2つのバッファーです。最初のバッファーの境界を超えて書き込むと、2番目のバッファーのメタデータが上書きされます。使用中のビットを2番目のバッファのゼロに設定し、長さを小さな負の値に設定してnullバイトをコピーできるようにすることにより、プログラムが最初のバッファでfree()を呼び出すと、これら2つのバッファをマージしようとします単一のバッファ。これが発生すると、解放されたと想定されるバッファーは、以前に割り当てられたバッファーの最初の8バイトに2つのポインターFDおよびBKを保持することが期待されます。 BKはFDに書き込まれ、ポインターを上書きするために使用できます。
結果
偶発的なオーバーフローは、影響を受けるメモリ領域を使用するプロセスによってデータ破損または予期しない動作を引き起こす可能性があります。メモリ保護のないオペレーティングシステムでは、これはシステム上の任意のプロセスです。
意図的な悪用により、特定の場所のデータが任意の方法で変更されたり、任意のコードが実行されたりする可能性があります。
たとえば、Microsoft JPEG GDI +バッファオーバーフローの脆弱性により、影響を受けるマシンでコードがリモートで実行される可能性があります。
iOSのジェイルブレイクでは、通常、ヒープオーバーフローを使用して任意のコードを実行します。通常は、カーネルを悪用して、ジェイルブレイクが提供するカーネルでカーネルを置き換える機能を実現します。
検出と予防
バッファオーバーフローと同様に、ヒープオーバーフローを防ぐには、主に3つの方法があります。 WindowsやLinuxなどのいくつかの最新のオペレーティングシステムは、3つすべての実装を提供します。
- 通常、最新システムのNXビットなどのハードウェア機能を使用して、コードとデータを分離することにより、ペイロードの実行を防止します。
- 通常、ASLR(アドレススペースレイアウトランダム化)などのカーネル機能を使用して、ヒープが固定オフセットで見つからないようにランダム化を導入します。
- 健全性チェックをヒープマネージャーに導入します。
バージョン2.3.6以降、GNU libcには、たとえばunlinkを呼び出すときにポインターの一貫性をチェックすることにより、事後のヒープオーバーフローを検出できる保護が含まれています 。しかし、以前のエクスプロイトに対するこれらの保護は、ほぼ即座にエクスプロイト可能であることが示されました。さらに、Linuxには2005年以降、ASLRのサポートが含まれていますが、PaXは数年前により良い実装を導入しました。また、Linuxには2004年からNXビットのサポートが含まれています。
Microsoftは、2003年4月以降のWindows Server 2003および2004年8月のWindows XP Service Pack 2でのヒープ常駐バッファオーバーフローに対する保護を組み込んでいます。これらの緩和策は、安全なリンク解除とヒープエントリヘッダーCookieでした。 Vista、Server 2008、Windows 7などの以降のバージョンのWindowsには、一般的に対象となるデータ構造の削除、ヒープエントリメタデータのランダム化、ヒープヘッダーCookieの拡張ロール、ランダム化されたヒープベースアドレス、関数ポインターエンコーディング、ヒープ破損の終了およびアルゴリズムのバリエーションが含まれます。通常のデータ実行防止(DEP)およびASLRも、この攻撃の緩和に役立ちます。