CMMI翻訳版

今年の4月にIPAによって公開された、CMMI-SE/SW/IPPD/SS 公式日本語翻訳版 Version 1.1 をダウンロードして印刷した。明日からの通勤のお供にするのだ。


以前にITProの記事で見て以来楽しみにしていたもので、やっと読む時間が取れた。
いや〜最近のIPAの活動はありがたいモノが多い。

Microsoft Threat Modeling Tool

適宜覚書さんより


本日付けで Threat Modeling Tool の新版、v1.0.1637.18511 がリリースされた。Windows用のバイナリが無料ダウンロード可能。


Threat Modeling とは、Microsoftがセキュリティ欠陥のないソフトウェアを作成するために、ソフトウェアの設計・分析手法として使用しているもの。Writing Secure Code (ASIN:0735617228)で簡単に紹介されている。この7月に専門書(ASIN:0735619913)が発売される予定だ。


上記のソフトウェアは、Threat Modeling をサポートするためのCASEツールのようなもの。ただ、まだかなり試作品っぽいんですよね〜。

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 付近のアドレスにはならないようで、その理由はちょっとわかりません。


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

FC2のexec-shield (2)

スタック上に置かれたコードの実行不許可についてはきちんと効いているのだろうか。こちらも確認してみました。背景となる技術については Shudo's Note さんの5/17の記事などを参照していただくとして、結論のみ。デフォルトでばっちり効いています!。こちらも、 buffer overflow などによる exploit を困難にする効果があります。


FC2のデフォルトでは、/proc/sys/kernel/exec-shield が 1 になっています。これは「/usr/bin/execstack -q で 'X' となっているバイナリについてはstack上のコードの実行を許可、'-' となっているバイナリについては不許可」というモードです。execstackコマンドはバイナリ中のあるフラグを見ています。出力の 'X' は、eXecの略でしょう。

(実行例)
$ execstack -q /bin/foo
 - /bin/foo
$ execstack -q /bin/bar
 X /bin/bar

そして、

  • FC2に付属のバイナリの殆ど全ては '-' になっています
  • gccを用いて自分でバイナリを作成した場合も、特殊なコード*1を書いた場合を除いて '-' に設定されます

要するに、殆ど全てのバイナリで、stack上のコードの実行が禁止されているわけです。


/etc/sysctl.conf を書き換えるなどして、/proc/sys/kernel/exec-shield を 2 にして起動すると、全てのバイナリで強制的にstack上のコードの実行が禁止されます*2。こうしておくほうがよりセキュアな設定といえますが、各種JIT(javaコマンド含む)、insmodの一部機能、wineなどは動かなくなるはずです。


最後に、デフォルトで 'X' にコンパイルされるようなコードを、

  • execstack -s してから実行
  • /proc/sys/kernel/exec-shield を 2 にしてから実行

してみてください。すると、SIGSEGVで異常終了することと思います。これで、実際に防御機構が働いていることを確認できます。


なお、トランポリンの詳細については id:yupo5656:20040602 に書いてありますので参照のこと。

*1:「特殊なコード」というのは、「トランポリン」が生成されるコードのこと。同URIサンプルコードなど

*2:http://kerneltrap.org/node/view/913 が詳しい