エントロピーの削減
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/01/06 03:54 UTC 版)
「アドレス空間配置のランダム化」の記事における「エントロピーの削減」の解説
攻撃者は単純な情報漏洩から、攻撃1回あたりの複数ビットエントロピー攻撃(heap sprayingによる攻撃など)まで、いくつかの方法を使ってランダム化されたアドレス空間に現れるエントロピーを削減できる。これに対してできることはほとんどない。 書式文字列攻撃を使用したメモリレイアウトに関する情報の漏洩がありうる。printf()のような書式文字列関数は可変長引数リストを使用して作業を行う。書式指定子は引数リストがどのように見えるかを記述する。引数が渡される通常の方法のために、各種書式指定子はスタックフレームの先頭近くに移動する。最終的に、戻り先のポインタとスタックフレームポインタの抽出が可能であり、脆弱なライブラリのアドレスと既知のスタックフレームのアドレスが現れる。これにより攻撃者に対する障害としてのライブラリとスタックのランダム化を完全に取り除ける。 スタックやヒープのエントロピーを減らすこともできる。スタックは通常16バイトの倍数境界に配置されなければならないので、ランダム化の間隔もそれより小さくにできない。さらにヒープはページ(通常4096バイト)境界に配置されなければならない。攻撃を試みるとき、重複した攻撃をこれらの境界に合わせることが可能である。NOPスライドをシェルコードの注入に使うことができ、system()への戻りを試みるときは文字列 '/bin/sh' を任意個数のスラッシュの '////////bin/sh' に置き換えることができる。削減されるビット数は間隔 n {\displaystyle n} の攻撃に対して、ちょうど l o g 2 ( n ) {\displaystyle log_{2}\left(n\right)} である。 このような減少はスタックやヒープのデータ量のために制限される。たとえば、スタックは通常8MBに制限され、それよりも伸長はずっと少ない。これにより削減が可能なのは最大19ビットであるが、より保守的な見積もりでは4-16KBのスタックの詰め物に対しておよそ 8-10ビットである。一方ヒープはメモリアロケータの振る舞いに制限される。glibcの場合、128KBを超える割り当てはmmap()を使って作られ、攻撃者のビット削減を5ビットに制限する。これはブルートフォースに対する制限要因でもある。行われる攻撃の回数を削減することはできるが、攻撃のサイズが十分大きくなると一部の環境での振る舞いは侵入検知システムと似たものになりうる。
※この「エントロピーの削減」の解説は、「アドレス空間配置のランダム化」の解説の一部です。
「エントロピーの削減」を含む「アドレス空間配置のランダム化」の記事については、「アドレス空間配置のランダム化」の概要を参照ください。
- エントロピーの削減のページへのリンク