すべてにASLRを展開する場合の課題の1つは、少なくともWindowsでは、一部のDLL(ライブラリ)がASLRと互換性のある方法でコンパイルされていないことです。 (位置に依存しないコードとしてコンパイルされていないため、メモリに読み込まれる場所をランダム化することはできません。)
アプリケーションがランダム化されていないDLLを1つでもロードした場合、事実上ランダム化されないため、これには問題があります。標準的な攻撃(ROP攻撃など)を阻止するには、 すべてのコードをランダム化する必要があります :ランダム化されていない単一のDLLで十分ですしたがって、一次近似として、ASLRは、特定のアプリケーションの保護にのみ役立ちます(そのDLLのallがランダム化されている場合)。多くのDLLをロードします。必要なのは1つの非ランダム化DLLだけなので、すべてのDLLがランダム化されるようにすることが特に重要になります。
一般に、業界はランダム化の使用の増加に向かっていますが、 ゆっくり :これをすべてのDLLすべてのプログラムで使用する)に導入するには時間がかかると思います。たとえば、 、最近 Dropbox DLLはランダム化を使用しない であるため、Dropbox DLLを使用するプログラムは保護されないROP攻撃に対して(Dropbox DLLを使用するすべてのプログラムはASLRの利点を失います)。
私の質問:一部のDLLがランダム化されない一般的な理由は何ですか? DLLを位置に依存しないコードとしてコンパイルすることを困難または不可能にするのは、通常、ある種の技術的な障壁または技術的な問題ですか?それは、セキュリティに対する認識/注意の欠如ですか? DLLを作成している開発者ですか?非常に古く、ランダム化を利用するために再コンパイルされていないレガシーDLLですか?Microsoft Visual C++は、デフォルトで正しいことを実行できません(位置に依存しないコードとしてDLLをコンパイルできませんか?)デフォルトでは)?それは完全に別のものですか?
現在ランダム化をサポートしていないDLLのASLR /ランダム化の展開を促進するのに役立つ技術的な進歩やツールはありますか?
関連リソース: SlopFinder は、ASLRをサポートしていないDLLについてシステムをスキャンするツールです。
良い情報があります ここ 。明らかに、「後方互換性の問題」のため、DLLは、タグが付けられている場合にのみ、ASLRの対象となる可能性があります。DLLは、本来、再配置されることを意図して、私は一部の(不十分な)記述されたソフトウェアがDLLに依存するトリックをいくつかのアドレススペースで終わる)に実行することを想像できます(可能な候補は一部に ガベージコレクター 「データへのポインター」と「コードへのポインター」を区別する必要があります-このような問題は、Linuxエミュレーションを備えたOpenBSDで起動したときに、ChromeのJavaScriptインタープリターの一部のバージョンで発生したことを知っています) 。
Microsoftが追加のフラグを実装する問題に遭遇した場合、可能ではないにしても、無視できないようなソフトウェアのケースが少なくとも1つ発生した可能性があります(Windowsの世界では下位互換性が非常に重要です)。
DLLは、DLLが最後にビルドされたときに静的リンカーがそう言った場合にASLRが発生することを許可します。これは/DYNAMICBASE
国旗。 documentation は次のように述べています。
デフォルトでは、/ DYNAMICBASEはオンです。
Visual Studio 2010および2012のドキュメントにはこの文が含まれていますが、Visual Studio 2008のドキュメントは含まれていません。そのため、Visual Studio 2010+を使用するほとんどの人がASLR互換DLLを生成するが、Visual Studio 2008または以前のバージョンでは、DLLが生成されますnotASLRの対象となります)。
上記の最初にリンクしたページで、コメントの1つに次のように書かれています。
PEイメージがビルドされた後でも、Microsoftリンカーを使用してそれを行うことができます。リンク/ edit/dynamicbase(またはeditbin/dynamicbase)を使用します。
したがって、DLLを「修正」できますが、これはDLLがASLRで壊れないことを前提としています。つまり、フラグの欠如は、Visual Studioのデフォルトの構成が原因でした。 DLLベンダー。