GS Optionにより、単純なバッファーオーバーフローで戻り番地を書き換えることが難しくなったことから、関数から戻る前に攻撃を完了する「SEH Overwrite」と呼ばれる攻撃が行われるようになります。
リスト5に、SEH Overwrite脆弱性のある関数のひな形を記載します。
void vulnerable(char *ptr){ char buf[128]; try {strcpy(buf, ptr); … exception … } except(…) { } }
SEH(Structured Error Handling)は、例外処理を行うための仕組みで、SEHを利用して関数内に例外処理を書くことが可能です。
例外処理を行うコードのアドレスは、配列とGS Cookieの間に配置されます(図8)。
SEHは、リスト5のexcept(…){} で記載される例外処理を行うHandlerと、次の例外処理を示すNextで構成される一方向リストです(図9)。バッファーオーバーフローにより、Handlerのアドレスを書き換え、何らかの例外処理を発生させることで、Handlerを上書きした任意のアドレスのコードを実行できます。
この手法は、関数が呼び出し側に戻る前に、つまりGS Cookieのチェック前に、シェルコードが実行されため、プログラムが異常終了する前に攻撃を完了することが可能です。また、図9の吹き出しのようなコードを例外処理とすることで、GS Cookieのチェックを回避して、任意のアドレスに“戻る”ことも可能です。
Visual C++ 2003で、Safe SEHと呼ばれるSEH Overwriteの対策が実装されます。Safe SEHオプションを有効にすると、リンク時にプログラムが設定した例外処理ハンドルのテーブルを作成され、実行時にこれをチェックします。例外処理がテーブルに登録されていれば例外処理を実行し、テーブルに登録されていない場合は、上書きされたと判断しプログラムを終了します。
しかし、Safe SEHオプションでコンパイル・リンクが行われていないモジュールがある場合、そのモジュールは、テーブルによるチェックが行われず、SEH Overwriteが実行できてしまいます。
このような攻撃の対策として導入されたのが、SEHOP(Structured Exception Handler Overwrite Protection)です。
SEHOPは、SaefeSEHとは異なり、システムレベルで実装される技術で、Windows Vista SP1、Windows Server 2008 RTMから実装されています。
SEHOPは、例外処理チェーンの最後に、評価用の値をセット(図12のsehprot!_validation_eh)します。SEH Overwriteにより、Nextポインターが上書きをされると、最終アドレスが評価用の値と異なる値になるため、SEH Overwriteを検出しプログラムを終了します。
今回は、最も伝統的な攻撃手法であるスタックに対する攻撃について取り上げました。ここで取り上げた手法はSEHOPを除き、コンパイラーレベルで実施されるもので、ハードウェアやシステムにかかわらず、広く利用することが可能です。一方で、コンパイル時やリンク時にオプションを設定しないと、対策が実装されないため、プログラム開発者によるセキュリティへの取り組みが重要となります。
最初にご紹介したように、スタックに対する攻撃は徐々に減少しており、現在では主要な攻撃手法ではなくなっています(図13)。これは、ここで紹介した対策が確実に実装されるようになったことで、スタックオーバーフローの脆弱性が少なくなったこと、また、スタックオーバーフローの脆弱性があっても、別途紹介するDEPなどの対策により、攻撃を成功させることが難しくなったことが背景となっています。
次回は、私自身がなかなか理解できていなかった、ヒープオーバーフローについて解説します。
高橋 正和(たかはし まさかず)
チーフ セキュリティ アドバイザー
1980年代初頭からミニコン、PC-98、8085、4ビットマイコンなどを使った制御システムの開発などを経験。
1980年代中頃から、日本デジタル研究所株式会社で標準ライブラリの開発保守、開発環境の開発保守、独自OSからWindows NT/Windows XPへの移植、品質管理、新入社員向けのC言語の新人教育などを担当した。
標準ライブラリでは、ファイルシステムやSocketライブラリの開発・実装・保守、開発環境では、68K系のCPUにWhite Sims’s Cによるリロケータブルな実行ファイル形式という特性を使って、オーバーレイリンカー・ローダー等も開発した。
1999年にISS(現在はIBM)セキュリティに関わり、2006年から現職(日本マイクロソフト株式会社 チーフセキュリティアドバイザー)を務める。
Copyright © ITmedia, Inc. All Rights Reserved.