検索に移動この記事には独自研究が含まれているおそれがあります。問題箇所を検証し出典を追加して、記事の改善にご協力ください。議論はノートを参照してください。(2008年10月)この記事は検証可能な参考文献や出典が全く示されていないか、不十分です。出典を追加して記事の信頼性向上にご協力ください。位置(通常、プロセスのアドレス空間における実行ファイルの基底とライブラリ、ヒープ、およびスタックの位置が含まれる)を無作為に配置するコンピュータセキュリティの技術である。外部リンク利点[編集]アドレス空間のランダム化は、攻撃者が標的のアドレスを予測することをより困難にすることによって、ある種のセキュリティ攻撃を妨害する。return-to-libc攻撃で実行を試みる攻撃者は実行されるコードの位置を特定しなければならず、スタック上に注入されたシェルコードの実行を試みる他の攻撃者はまずスタックを見つけなければならない。どちらの場合も、関連するメモリアドレスは攻撃者から隠されている。攻撃者はこれらの値を推測しなくてはならず推測が失敗すると通常アプリケーションはクラッシュするため、回復は不可能である。有効性[編集]アドレス空間配置のランダム化はランダムに置かれた領域を攻撃者が見つける可能性の低さに依存している。探索空間が増大すれば、その分セキュリティも向上する。したがって、アドレス空間のランダム化は無作為なオフセット内に存在するエントロピーが大きくなるほど効果的である。エントロピーはランダム化が行われる仮想記憶領域空間の量を増やすか、ランダム化を行う時間間隔を短縮することによって増加する。時間間隔は通常可能な限り小さくなるよう実装されるので、ほとんどのシステムは仮想記憶領域の量を増やさなければならない。ランダム化に対抗するため、攻撃者は攻撃を望む全ての領域の位置の推測を成功させなければならない。カスタムのコードや攻撃の役に立つデータを乗せることができる、スタックやヒープのようなデータ領域については、コードならばNOPスライドの使用、データならコピーの繰り返しによって、攻撃可能な状態を増やすことができる。領域がランダム化された結果それらの状態のどれか1つになれば攻撃は成功する。ライブラリの基底やメイン実行ファイルのようなコード領域は正確に位置を知る必要がある。これらの領域は混合される。スタックフレームはスタック上に注入され、ライブラリはそこを戻り先にされる。シグネチャベースのIPS、法的規制、その他の要因によって中断されることなく実行されると仮定する。ブルートフォースの場合、デーモンを再起動することはできない。どれだけ多くのビットが関係し、どれだけ多くのビットが1回あたりの試行で攻撃され、どれだけ多くのビット攻撃しなければならないビットが残るかも算出しなければならない。回の試行が与えられたとき、攻撃が成功する確率を表す。数千から数百万の範囲になりうる。64ビットシステム上では、これらの数値は少なくとも数百万に達する。アドレスのランダム化に16ビットを使用する2004年時点の32ビットシステムについて、Shachamと共同研究者は以下のように述べている。この研究者の主張は攻撃者が同じアプリケーションに対していかなる遅延もなく複数回攻撃できる能力に依存していることに注意されたい。grsecurityに含まれているような、ASLRの適切な実装は、このようなブルートフォース攻撃を不可能にするいくつかの手法を提供している。ひとつの方法は、ある一定の時間内に設定された回数以上クラッシュした実行ファイルの実行を妨げることである。一部のシステムはライブラリロード順序のランダム化を実装する。これはライブラリがロードされる順序をランダム化する、ASLRの一形態である。これにより供給されるエントロピーはほとんどない。必要なライブラリ1つごとに供給されるエントロピーのビット数の見積りを以下に示す。これは可変のライブラリサイズを考慮に入れていないため、実際に得られるエントロピーはもう少し大きくなる。攻撃者は通常1つのライブラリしか必要としないことに注意されたい。複数ライブラリの場合の計算式はより複雑になるがこれも以下に示す。して単純化したものであることに注意。大きな値でも、低くなる傾向にある。仮定できるということである。興味深いことにライブラリの数が少なくともここで数ビットのエントロピーが得られる。このようにライブラリロード順序のランダム化を仮想メモリ領域アドレスのランダム化と組み合わせることにより、数ビットの追加エントロピーを得られる可能性がある。これらの追加ビットはライブラリのみに適用され、他のmmap()セグメントなどには適用されないことに注意。sprayingによる攻撃など)まで、いくつかの方法を使ってランダム化されたアドレス空間に現れるエントロピーを削減できる。これに対してできることはほとんどない。書式文字列攻撃を使用したメモリレイアウトに関する情報の漏洩がありうる。printf()のような書式文字列関数は可変長引数リストを使用して作業を行う。書式指定子は引数リストがどのように見えるかを記述する。引数が渡される通常の方法のために、各種書式指定子はスタックフレームの先頭近くに移動する。最終的に、戻り先のポインタとスタックフレームポインタの抽出が可能であり、脆弱なライブラリのアドレスと既知のスタックフレームのアドレスが現れる。これにより攻撃者に対する障害としてのライブラリとスタックのランダム化を完全に取り除ける。スタックやヒープのエントロピーを減らすこともできる。スタックは通常16バイトの倍数境界に配置されなければならないので、ランダム化の間隔もそれより小さくにできない。ヒープはページ(通常4096バイト)境界に配置されなければならない。攻撃を試みるとき、重複した攻撃をこれらの境界に合わせることが可能である。置き換えることができる。このような減少はスタックやヒープのデータ量のために制限される。スタックは通常8MB[2]に制限され、それよりも伸長はずっと少ない。8-10ビットである。ヒープはメモリアロケータの振る舞いに制限される。glibcの場合、128KBを超える割り当てはmmap()を使って作られ、攻撃者のビット削減を5ビットに制限する。これはブルートフォースに対する制限要因でもある。行われる攻撃の回数を削減することはできるが、攻撃のサイズが十分大きくなると一部の環境での振る舞いは侵入検知システムと似たものになりうる。歴史[編集]PaXプロジェクトが最初に「ASLR」という造語を発明した。2001年7月に発行した。これは現在でも最も完全な実装であり、2002年10月からはカーネルスタックのランダム化も提供している。PaXは他の実装と比べて、各ランダム化されたレイアウトごとに最大のエントロピーを与える実装であり続けている[3]。実装[編集]いくつかの主流の、汎用目的のオペレーティングシステムがASLRを実装している。OpenBSD[編集]OpenBSDはASLRをサポートした(そしてデフォルトで有効にした)、最初の主流のオペレーティングシステムの1つとなった[4]。Linux[編集]Linuxは弱い[5]形のASLRを、カーネルバージョン2.6.12からデフォルトで有効にした。ShieldのLinuxカーネルに対するパッチ集はより完全な実装を提供する。Scratchを含む各種のLinuxディストリビューションはPaXのASLR実装をデフォルトで備えている。Shieldパッチは16バイトの間隔上で19ビットのスタックエントロピーを供給する。4096バイトの1ページ間隔上で8ビットのmmap()エントロピーを供給する。これは524288通りの位置がありうる8MBの広さの領域にスタック基底を置く。256通りの位置がありうる1MBの広さの領域にmmap()基底を置く。機能はメイン実行ファイルバイナリのランダムな基底アドレスを2003年から実装する。これはメイン実行ファイルに対して、共有ライブラリで使われるものと同じアドレスのランダム性を提供する。PIE機能は同じ実行ファイルでprelinkの機能と同時に使うことができない。prelinkツールは実行時ではなくprelink時にランダム化を実装する。動的リンカが行わなければならなくなる前にライブラリの再配置を行うことで、プログラムを何度も走らせても再配置が1回しか行われないようにすることが目的だからである。結果として、真のアドレス空間ランダム化はprelinkの目的を打ち消してしまう。R2は、ASLRが有効となるよう特別にリンクされた実行ファイルとダイナミックリンクライブラリについてのみではあるが、デフォルトでASLRを有効にしている[6]。7が含まれていなかった。ASLRとDEPは両方がアプリケーション互換性の目的で無効にされていた[7]。8を含む、より新しいバージョンはこれらの保護を有効にした。すべての実行ファイルとライブラリで強制的にASLRを有効または無効にするレジストリ設定が存在する。ヒープ、スタック、プロセス環境ブロック、およびスレッド情報ブロックの位置もランダム化される。VistaにおけるASLRは期待されるほど堅牢ではない可能性があると注意しており、マイクロソフトはその実装の弱点を認めている[9]。2003オペレーティングシステムに提供している。これらの実装の完全な詳細は公開されていない[12]。サポートされた[13]。v10.5で一部のライブラリオフセットのランダム化を導入した[14]。この実装は、ASLRが防ぐことを目的とした攻撃に対する完全な保護を提供しない[15][16][17][18]。4.3においてASLRを削除した。Sandwichはシステムとサードパーティーのアプリケーションをメモリ管理の問題に起因する脆弱性攻撃から保護するためのASLRを提供する。対応が追加された[19]。(10243)、...を2進接頭辞として使う。2009年8月26日閲覧。2009年3月21日閲覧。2010年7月24日閲覧。2012年7月7日閲覧。(日時は個人設定で未設定ならばUTC)。表示-継承ライセンスの下で利用可能です。追加の条件が適用される場合があります。詳細は利用規約を参照してください。Cookieに関する声明モバイルビュ。