web-dev-qa-db-ja.com

ASLRは、構造体内のバッファオーバーフローから保護しますか?

単純な構造体を想定します。

struct test {
   char variable[4];
   char variable2;
}

variable[4] = '\0' variable2を変更するバッファオーバーフローがあります。

ASLRはこのバッファオーバーフローを防ぎますか?

3
eez0

ASLRがバッファオーバーフローを防ぐことはありません。バッファオーバーフローとは、アプリケーションがバッファに書き込むことができるよりも多くのバイトをバッファに書き込む場合です。バッファを任意のランダムアドレスに配置しても修正できません。

ASLRが変更するのは、オーバーフローの結果です。攻撃者は、バッファオーバーフローを悪用して、制御された方法で余分なバイトを他のいくつかの要素に流し込もうとします。 ASLRは、次の2つの点でそれをより困難にします。

  • 「物事を移動する」ことにより、攻撃者が上書きしようとするフィールドは、オーバーフローバッファを越えて予測可能な場所に必ずしも配置されるとは限りません。
  • 古典的なオーバーフローエクスプロイトは、ジャンプフィールド(スタック上の戻りアドレス、C++オブジェクトのvtableなど)を上書きして、実行が別の場所にジャンプするようにすることです。 ASLRは、(攻撃者にとって)興味のある場所に行く可能性が低いブラインドジャンプを強制しようとします。

structの場合、ASLRは2つの構造体フィールドを分離しません。これは、C仕様に反し、コードが破損するためです。 ASLRに関係なく、variable2フィールドは常にRAMのvariableバッファーの直後にあるため、バッファーオーバーフローによりvariable2が予測どおりに上書きされます。ただし、ASLRは引き続きアプリケーションの2つの実行間でコードチャンクを移動するため、variable2を上書きしても、たとえば任意のコードを挿入するには不十分な場合があります。

6
Thomas Pornin