FC2のexec-shield (1)

Fedora Core 2 のkernelには、exec-shield という、セキュリティ強化のパッチが組み込まれています。インストール直後の状態で、それがちゃんと機能しているか調べてみました。


まずその(1)、アドレススペースのrandomize機能です。これはデフォルトでばっちり効いていますね。buffer overflow などによる exploit が困難になります。

# cat /proc/sys/kernel/exec-shield-randomize 
1

どのように働いているのか、小さなコードを書いてチェックしてみました。

$ cat > print_stack_address.cpp
  #include <cstdio>
  unsigned long get_esp(void) {
    __asm__("movl %esp, %eax");
  }
  int main(void) {
    std::printf("esp: 0x%08lx\n", get_esp());
  }
^D

$ g++ print_stack_address.cpp
$ ./a.out 
esp: 0xfeef05b8
$ ./a.out 
esp: 0xfef833b8

毎回スタックポインタの値が変化しています。ぱっと見、下位20〜22ビットくらいは完全にランダムですね。攻撃者は、buffer overflow などで関数のリターンアドレスを適切に書き換えるのが難しくなります。

# echo "0" > /proc/sys/kernel/exec-shield-randomize 
$ ./a.out 
esp: 0xfefffa48
$ ./a.out 
esp: 0xfefffa48

無効にしてみると、このように固定値になります。ただ、見慣れた 0xbfffffxx 付近のアドレスにはならないようで、その理由はちょっとわかりません。


ランダム化しているのはスタックの開始アドレスだけではありませんが詳細は略。