linuxカーネルの実行保護機能

linuxカーネルの実行保護(ESP:Executable space protection)について調査したのでメモ.

ESPとはOSのセキュリティを高めるための機能の一つ.ESPを使うとたとえば buffer overflow などによる exploit を未然に防ぐことができる.

Linux での主な実装は

の2系統があり,どちらの実装も

  • 実行可能なメモリ空間の管理 (NX: No eXecute)
  • メモリ空間のランダマイズ (ASLR:address space layout randomization)

を行うことで,セキュリティの向上を図っている*1

以下,二つの実装を比較する形で詳細について,まとめる.

ESPを使う方法

下記の方法でESPを有効にしたカーネルを使えばよい

  • vanilla kernelの場合
    • x86の場合,config で PAE を有効にすると NX が有効となる
    • COMPAT_VDSOを n にすると ASLR が有効となる
      • include/mm.h
      • MMUが無いarchや,性能に問題がある一部のCPU(transmetaなど)はASLRがoffになる場合がある
  • RedhatのExec Shieldの場合
    • linux-2.6-execshield.patch というパッチをカーネルにあてると,NX,ASLRが有効となる
    • fedora/redhat はすでに上記パッチが当たっているため,インストール直後からESPが有効となっている

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にする方法

カーネルコマンドラインオプションに "norandmaps=0" をつけると ASLRは off になる

NX をoffにする方法

  • vanilla kernelの場合

カーネルコマンドラインオプションに "noexec=off" をつける

  • RedhatのExec Shieldの場合

カーネルコマンドラインオプションに "exec-shield=0" をつける

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は実装していないらしい.