mmap() ベースのランダム化
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/02/17 14:43 UTC 版)
「PaX」の記事における「mmap() ベースのランダム化」の解説
POSIXでは、mmap() システムコールはプロセスが指定したオフセットかカーネルが選択したオフセットにメモリを配置する。無名メモリを使えば、中身のないメモリがマッピングされ、ファイルを指定すればその中身がマッピングされる。ダイナミックリンクライブラリは mmap() を使ってロードされ、コード部とライブラリのデータ部がそれぞれマッピングされる。データ部に書き込みがあれば、コピーオンライトの要領で無名メモリへのコピーが行われる。 mmap() では、仮想空間上のマッピングすべきオフセットを指定することもある。オフセットが指定されないと、OSが自動的に選択する。Linux のオフセット計算方法は予測可能であり、事前に定義された「mmap()ベース」を始点として計算される。このため、プロセスを起動したときに必ずロードされる標準Cライブラリ(あるいは libc)は常に同じアドレスにロードされる。 mmap()ベースのランダム化を行う場合、PaX はmmap()ベースをランダムにシフトさせ、全てのライブラリおよび他のmmap()コールでのマッピング位置を変えてしまう。このため、ダイナミックリンクされるコード(共有オブジェクト)は毎回ランダムに異なる位置にマッピングされる。攻撃者は特定のライブラリが特定のアドレスにロードされていることを当てにしていることが多い。従って、この機能によってreturn-to-libc攻撃が困難となる。ただし、シェルコードを使った攻撃では GOT(global offset table)を参照することで任意の関数のアドレスを参照可能である。 PaX はライブラリのロード順序は変化させない。従って、1つのライブラリのアドレスがわかれば、他の全てのライブラリの位置もわかってしまう。しかし、もっと重大な問題として、いったんライブラリの位置がわかってしまうと、他のランダム化をしていても意味がないという問題がある(シェルコードはライブラリ内の関数のアドレスさえ分かれば攻撃可能)。 ET_DYN 型の実行ファイル(PIC化されたライブラリ)をロードするとき、そのベースアドレスもランダム化される(mmap() を使うので通常の共有オブジェクトと同じである)。 スタックを実行不可にする機能と mmap() のランダム化を組み合わせると、return-to-libc攻撃の成功確率は激減する。32ビットシステムでは、本来の確率の16分の1になる。さらにスタックベースのランダム化を加えると、もっと攻撃が困難になる。
※この「mmap() ベースのランダム化」の解説は、「PaX」の解説の一部です。
「mmap() ベースのランダム化」を含む「PaX」の記事については、「PaX」の概要を参照ください。
- mmap() ベースのランダム化のページへのリンク