公開日:2007年9月26日
独立行政法人情報処理推進機構
セキュリティセンター
本ページの情報は2007年9月時点のものです。
記載の資料は資料公開当時のもので、現在は公開されていないものも含みます。
セキュリティ対策の各場面でツールの利用が有効である。例えば、ソースコードを記述する場面では、対策されたランタイムライブラリの利用、ソースコード中の脆弱性が疑われる箇所を指摘してくれる静的検査ツール、ヒープのハンドリングの誤りを指摘してくれる動的検査ツール等がある。また、運用環境においても防御機能が利用できる場合がある。
ツールを使用する場面として、次の4つの場面が想定できる。
脆弱性を生じにくいソースコードを記述しようとする際、従来のランタイムライブラリの代わりに「対策されたランタイムライブラリ」を用いる方法がある。例えば、そのようなライブラリには次のものがある。
領域あふれが生じにくい文字列操作ライブラリ。strcpy_m()、strcat_m()等、約25の関数が用意されている。Burch, Long, Seacord らによる。
領域あふれが生じにくい文字列操作ライブラリ。safestr_copy()、safestr_concatenate()等約45の関数が用意されている。Messier、Viegaらによる。
従来のランタイムライブラリに出力領域長引数を追加する等の改善を施したライブラリ。strcpy_s()、strcat_s()等約70の関数が用意されている。Microsoft Visual Studio 2005にて利用できる。
プログラム中の脆弱性を、ソースコードを走査するツールを用いて比較的手早く検出する方法がある。例えば、そのようなツールには次のものがある。
strcpy()など、取り扱いに注意を要するC言語のライブラリ関数を使用していると警告してくれるタイプの検査ツール。無償で提供されているものには次のものがある。
プログラムのビルド手順の中で情報を収集し、実際にはプログラムを動作させることなく脆弱性を検出するツール。Coverity Inc.の製品。
プログラムのビルド手順の中で情報を収集し、実際にはプログラムを動作させることなく脆弱性を検出(静的解析)するツール。C、C++、Java、ASP .NET等18の開発言語に対応している。
FORTIFY SOFTWARE INC.の製品。
これを指定することによってバッファオーバーフロー等の問題を指摘してくれるようになるVisual C++のコンパイルオプション。Microsoft Visual Studio 2005 Team Systemに含まれる。
ヒープ上の変数等、ポインタで参照される領域のあふれはソースコードの静的解析では見つけにくい。そのような問題についても検出できるようにするには、実行時に領域のあふれを監視するツールを用いてデバッグする方法がある。例えば、次のものがある。
glibcがもつmalloc() - free()関連のチェック機能を活性化させる環境変数。
C言語のランタイムライブラリのうちのいくつかを、領域あふれを検出するバージョンに置き換えるよう指示する、GCC および glibc (GNU C Library) のオプション。n=1 または 2。
バッファオーバーフロー、メモリリーク、ポインタの誤使用等を実行時に検出してくれる。GCCのコンパイルオプションおよびランタイムライブラリからなる。
割当て領域外への書き込みや、メモリリークを検出することができるヒープデバッガを中心とした、ツールスイート。GNU/Linux用。
Visual C++ のデバッガとともに動作し、ヒープのダブルフリー等の不具合を検出してくれるVisual Studio 2005の機能。日本語版では「アプリケーションの検証」と呼ばれる。
スタック上の文字配列のあふれを実行時に検出してくれる、Visual C++ のコンパイルオプション。/RTCs のチェックは、後述の /GS のチェックより先に行われる。
プログラム運用環境のいくつかは、領域あふれを検出して処理を中断したり、プログラム中のスタックの位置を変化させて特定アドレスを狙う攻撃を失敗に終わらせる等の防御策をもっている。以下にその主なものを紹介する。
コンパイラによっては、プログラム実行中にスタック破壊を検出する実行コードを生成するよう指示するコンパイルオプションが使える。
1) -fstack-protector [GCC]
2) /GS [Visual C++]
プログラムのロード時に、スタックおよびヒープの開始位置がランダムに決定される。
このリンクオプションをつけてリンクされたプログラムは、プログラムのロード時にスタックの開始位置がランダムに決定される。加えて、text、data、bssの各メモリセグメントが標準とは異なる位置に置かれる。text、data、bssの非標準の位置はVistaの起動のたびにランダムに決定される。なお、ヒープの位置は/dynamicbaseを指定しなくても、プロセスの起動ごとに変化する。
オペレーティングシステムによっては、データ実行、すなわち、スタックやヒープなどのデータ領域に置かれたバイト列をマシン命令として実行することを禁止できるものがある。多くの場合「実行禁止」ビット(AMDのNXビット、IntelのXDビット)をもつプロセッサの機能が利用される。
実行禁止ビットがサポートされたプロセッサの上では、data、bss、ヒープ、スタックの各セグメントにおけるデータ実行を禁止できる。実行禁止ビットがサポートされないプロセッサにおいても、スタック上のデータ実行を禁止できる。
実行禁止ビットがサポートされたプロセッサで動作する、XP sp2以降のWindowsでは、data、bss、ヒープ、スタックの各セグメントにおけるデータ実行を禁止できる。
システムがもつ例外ハンドラアドレスワードを書き変えることによる攻撃を防ぐための Visual Studio のリンクオプション。プロセスで使われるすべてのモジュールがこのオプションでリンクされている必要がある。