web-dev-qa-db-ja.com

ASLRはLinuxでのReturn-to-libcなどの攻撃の防止には役に立たないのですか?

私が正しい場合、ASLRによりlibcをランダムなアドレスにロードします。そして、メモリ内のテキストページの書き込み権限を許可せずにそれを実現するには、plt/gotを使用します。これで、プログラムを実行する前に、よく知られているlibc @ plt関数に戻り、ほとんどバイパスすることができます。それでは、plt-to-pltはコンセプト全体を役に立たないのでしょうか?

4
DrPrItay

はい、PIEが無効になっている場合。ASLRの有効性が 大幅に低下するアプリケーション PIE(Position Independent Code)サポート付きでコンパイルされていません。 PIEを使用しない場合、プログラム は、リンク中に作成された固定PLT に依存して、共有ライブラリ内の関数のアドレスを解決する必要があります。 ASLRが使用され、PIEが有効になっている場合、一般的にコード再利用攻撃は軽減されますが、infoleaksはまだ至る所に存在するため、ASLRは サイドチャネル攻撃 で倒されることが多く、ローカルの悪意のあるコードに対してはほとんど役に立たず、その効果をネットワーク経由の攻撃と スクリプトレスなエクスプロイト に制限します。 が別の回答で説明されているように 、PIEなしのASLRの方が弱く、ランダム化の使用が少ない理由は他にもいくつかあります。

4
forest

return to pltとreturn to libcは少し異なる攻撃です。

libcに戻る

バッファオーバーフローを防ぐ方法の1つは、非実行可能スタックを使用することです。非実行スタックを作成するには、CPUおよびシステムレベルから、NXビットと呼ばれるものを使用します。 NXビットが設定されている場合、そのメモリアドレスは実行できません。バッファーオーバーフローを実行してスタックを上書きし、シェルコードが存在するスタックにリターンポインターをリダイレクトしても、シェルコードはスタック内にあるため実行されません。これは非実行可能メモリセクションです。

これは、Return to libc attackを使用してシェルを生成する場合です。戻りアドレスをシェルコードのアドレスに上書きする従来のアプローチを使用する代わりに、libc system()呼び出しのアドレスを使用します。

PLTに戻る

ASLRまたはアドレス空間レイアウトのランダム化は、バッファオーバーフローを制御するもう1つの方法です。前のセクションで述べたように、人々はsystem.like libcによってメモリにロードされた実行可能ファイルを見つけることによってNXをバイパスします。これは、システムにロードされた実行可能ファイルの場所を簡単に特定できるために可能でした。 ASLRはこれらの実行可能ファイルのアドレスをランダム化し、それらにリダイレクトすることでシェルを生成する可能性を減らしました。

この攻撃が可能である理由は、動的にリンクされたライブラリを含む実行可能ファイルでは、libc関数アドレスがPLTおよびGOTから取得できるためです。 PLTアドレスはランダム化されないため、攻撃が容易になります。

2
hax