ヒープオーバーフロー攻撃はどのように実行されますか?
スタックオーバーフロー攻撃の場合、攻撃者は関数のリターンアドレスを選択したアドレスに置き換えます。
ヒープオーバーフロー攻撃の場合、これはどのように行われますか?また、ヒープからコードを実行することは可能ですか?
ヒープオーバーフロー攻撃はどのように実行されますか?
スタックオーバーフロー攻撃の場合、攻撃者は関数のリターンアドレスを選択したアドレスに置き換えます。
ヒープオーバーフロー攻撃の場合、これはどのように行われますか?また、ヒープからコードを実行することは可能ですか?
これはプラットフォームによって異なり、私の例は非常に単純化されていることに注意してください。基本的には、オーバーランする可能性のあるリンクリストを持つヒープマネージャーに帰着します。リンクリストポインターを使用して、プロセスのメモリのランダムな部分を上書きできます。
制御ブロックが次のような単純なヒープ実装があると想像してください。
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へのジャンプ」スタイルの攻撃を実行することはできます。リターンアドレスを、実行可能になる既知の関数に上書きします。