linuxカーネルの実行保護(ESP:Executable space protection)について調査したのでメモ.
ESPとはOSのセキュリティを高めるための機能の一つ.ESPを使うとたとえば buffer overflow などによる exploit を未然に防ぐことができる.
Linux での主な実装は
の2系統があり,どちらの実装も
- 実行可能なメモリ空間の管理 (NX: No eXecute)
- メモリ空間のランダマイズ (ASLR:address space layout randomization)
を行うことで,セキュリティの向上を図っている*1
以下,二つの実装を比較する形で詳細について,まとめる.
alsr の確認方法
以下の方法で /proc/self/maps を見ると良い.毎回アドレスが変化していれば alsr は有効になっている
$ /bin/cat /proc/self/maps 00110000-00111000 r-xp 00110000 00:00 0 [vdso] 001b7000-001d3000 r-xp 00000000 08:02 1290587 /lib/ld-2.7.so 001d3000-001d4000 r-xp 0001b000 08:02 1290587 /lib/ld-2.7.so 001d4000-001d5000 rwxp 0001c000 08:02 1290587 /lib/ld-2.7.so 001db000-0033c000 r-xp 00000000 08:02 1290588 /lib/libc-2.7.so 0033c000-0033e000 r-xp 00161000 08:02 1290588 /lib/libc-2.7.so 0033e000-0033f000 rwxp 00163000 08:02 1290588 /lib/libc-2.7.so 0033f000-00342000 rwxp 0033f000 00:00 0 08048000-0804d000 r-xp 00000000 08:02 261179 /bin/cat 0804d000-0804e000 rw-p 00004000 08:02 261179 /bin/cat 09728000-09749000 rw-p 09728000 00:00 0 b7ef4000-b7ef6000 rw-p b7ef4000 00:00 0 bff51000-bff66000 rw-p bffea000 00:00 0 [stack]
ASLRを一時的にoffにする方法
/proc/以下のファイルを操作することで一時的にASLRをoffにできる
# echo 0 > /proc/sys/kernel/randomize_va_space
またsetarch コマンド経由でコマンドを実行すると,プロセス単位で ASLR を off にできる
$ setarch i686 -R /bin/cat /proc/self/maps
nxを一時的にoffにする方法
exec-shieldの場合は nx も一時的に off にできる (vanilla kernel の場合は未調査)
# echo 0 > /proc/sys/kernel/exec-shield
設定値の意味は以下の通り
0 | NXは常に無効 |
1 | NXは一部有効(後述) |
2 | NXは常に有効 |
/proc/sys/kernel/exec-shieldが1の場合は,バイナリ単位でNXを制御できる
設定は execstack コマンドをつかう.たとえば
# /usr/bin/execstack -c バイナリ
を実行するとそのバイナリはNXが無効となる.
NXを有効にする場合は -s, 設定を確認する場合は -q をつける
# /usr/bin/execstack -s バイナリ # /usr/bin/execstack -q バイナリ
*1:ちなみに Windows XP に実装されたESPである データ実行防止(DEP:Data Execution Protection)は,ASLRは実装していないらしい.