19

ヒープオーバーフロー攻撃はどのように実行されますか?

スタックオーバーフロー攻撃の場合、攻撃者は関数のリターンアドレスを選択したアドレスに置き換えます。

ヒープオーバーフロー攻撃の場合、これはどのように行われますか?また、ヒープからコードを実行することは可能ですか?

4

1 に答える 1

32

これはプラットフォームによって異なり、私の例は非常に単純化されていることに注意してください。基本的には、オーバーランする可能性のあるリンクリストを持つヒープマネージャーに帰着します。リンクリストポインターを使用して、プロセスのメモリのランダムな部分を上書きできます。

制御ブロックが次のような単純なヒープ実装があると想像してください。

struct HeapBlockHeader
{
    HeapBlockHeader* next;
    HeapBlockHeader* prev;
    int size;

    // Actual heap buffer follows this structure.
};

ヒープが解放されると、この制御ブロックは、next / prevポインターを変更することにより、解放されたブロックのリストに戻ります。ヒープバッファをオーバーランした場合、次の制御ブロックのポインタを自分が制御するデータで上書きできます。これらのリンクをオーバーライドして、コードへのポインター(おそらく、オーバーランしたバッファー内)とスタック上の関数のリターンアドレスを指すとします。ヒープマネージャがブロックを解放されたリストにリンクしようとすると、実際には、スタック上のリターンアドレスが、私が制御するコードへのポインタで上書きされます。

この記事には、ヒープオーバーフロー攻撃の概要が記載されています: http ://www.h-online.com/security/features/A-Heap-of-Risk-747161.html

この記事では、この種の攻撃を防ぐためにVistaのヒープマネージャーに導入された強化について説明し ます。http ://www.blackhat.com/presentations/bh-usa-06/BH-US-06-Marinescu.pdf

編集:ヒープからコードを実行する可能性については、はい、可能です。現在、多くのプラットフォームでは、ヒープメモリがデフォルトで実行不能になっているため、任意のコードを実行する際の障壁が高くなっています。ただし、「libcへのジャンプ」スタイルの攻撃を実行することはできます。リターンアドレスを、実行可能になる既知の関数に上書きします。

于 2009-03-20T17:52:09.527 に答える