スタックベースのランダム化
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/02/17 14:43 UTC 版)
「PaX」の記事における「スタックベースのランダム化」の解説
PaX は、スタックのベースアドレス(のオフセット)を16バイト単位にランダム化し、同時にセグメントの配置をページ単位の空隙の大きさをランダム化する。全体としてのランダム化の程度は仮想空間サイズに依存する。例えば、32ビットの場合、スタックベースは256MiBの範囲のどこかに設定され、可能な位置は1600万通り、エントロピーは24ビットとなる。 スタックベースのランダム化は、シェルコードとreturn-to-libc攻撃のペイロードに影響を与える。シェルコード攻撃はスタック上のリターンポインタをペイロード内を指すよう変更しようとする。一方、return-to-libc攻撃はスタック上のフレームポインタを書き換えようとする。どちらにしても、成功する可能性は大幅に減る。スタックの位置は予測不可能となり、ペイロードによる書き換えは単にプログラムをクラッシュさせる結果となる。 シェルコードの場合、ペイロードの前にNOP命令(何もしない命令)をたくさん並べておくことがある。こうすることで、ジャンプ先が予測と多少違っても攻撃が成功するようになる。しかし、16バイトぶんのNOP命令を並べても、成功確率は1/16Mから2/16Mになるだけである。また、128バイトのNOP命令を並べても、成功確率は9/16Mにしかならない。成功確率はNOP命令数に比例する。 return-to-libc攻撃はコードを書き込むわけではなく、ある固定幅のスタックフレームを書き換える。このため、スタックフレームは正確に16バイト境界に配置されていなければならない。一般にスタックフレームは16バイトよりも大きいので、スタックフレームを繰り返し書き込むことで成功確率を上げようとする。
※この「スタックベースのランダム化」の解説は、「PaX」の解説の一部です。
「スタックベースのランダム化」を含む「PaX」の記事については、「PaX」の概要を参照ください。
- スタックベースのランダム化のページへのリンク