Binary Pulsar

技術寄りなセキュリティの話題について書きます

Structured Exception Handlingとセキュリティ

概要

Structured Exception Handling (SEH)は、Windows OSに実装されている、プログラムの例外を処理する機構です。本記事では、SEHの概要とともに、SEHに関するセキュリティの話題について解説します。

SEHの概要

SEHはWindows OSのプログラムの例外を処理するために実装されている処理です。以下の図にその概要を表しています。SEHのエントリの低位アドレスに次のSEHのエントリのアドレスを、上位アドレスに例外を処理するためのハンドラのアドレスを格納することにより構成されています。

f:id:binary-pulsar:20190117003541p:plain
SEHの処理の概要

SEHはプログラムにおけるtry-catchの例外処理に例えられます。最初のSEHエントリのアドレスは、セグメントレジスタFSに格納されています。例外が発生すると、セグメントレジスタFSに登録されているアドレスのSEHエントリに実行を移し、SEHエントリに指定されているハンドラのアドレスに記述されている処理を実行します。ハンドラにより例外の処理に成功した場合は例外処理を終了しますが、失敗した場合はSEHエントリに指定されているアドレス情報に従って次のSEHハンドラで例外処理を試みます。同様の手続きを継続して、例外の捕捉に成功するまで例外処理を試行します。すべてのSEHハンドラの処理がすべて失敗した場合は、ntdll.dllに定義されているFinalExceptionHandlerで例外を処理して例外処理を終了します。

Buffer Overflowの脆弱性をついた攻撃におけるSEH

SEH Overwrite

SEH Overwriteは、Windows OSのプログラムにスタックベースのBuffer Overflowの脆弱性が存在していた場合に、悪用される可能性がある手法の一つです。Windowsのプログラムは、コンパイル時に/GSオプションを設定することにより、Stack Canaryを設定することが可能です。Stack Canaryが設定されている場合、単純なスタックベースのBuffer Overflowで実行ポインタを書き換えてもStack Canaryの値の整合性が崩れるため、攻撃者による悪意のあるコードの実行を防ぐことが可能となります。しかし、SEH Overwriteを悪用することにより、攻撃者はStack Canaryによる防御が有効なプログラムに任意のコードが実行できることがあります。 SEHのハンドラはBuffer Overflowにより書き換える対象となる実行ポインタよりも高位のアドレスに存在します。SEH Overwriteでは、名前の通り、スタックベースのBuffer Overflowの脆弱性を悪用する際に、SEHのハンドラを書き換えてしまいます。SEHのハンドラはStack Canaryやリターンアドレスよりも高位アドレスに存在するため、SEHを書き換える際に当然Stack Canaryが破壊されてしまいます。しかし、Stack Canaryの破壊により発生した例外は、SEHにより例外処理されるため、SEHのハンドラが格納されているアドレスを書き換えることにより、Stack Canaryが破壊された状態でも悪意のあるコードが実行可能となります。

SEH Overwriteによる攻撃への対策機構

SEH Overwriteにより、Stack Canaryが設定されていたとしても、スタックベースのBuffer Overflowによる任意のコード実行が可能となります。Windows OSではSEH Overwriteによる任意のコード実行を防ぐために、いくつかの保護機能を実装しています。

SafeSEH

SafeSEHはSEH Overwriteに対する防御機構の一つです。SEHのハンドラが格納されているアドレスのリストを保持することにより、攻撃者によって上書きされた不正なSEHのアドレスを検出します。しかし、プログラムのイメージ内のアドレスに存在するハンドラにのみ有効であり、プログラムのイメージの外のアドレスは有効な例外ハンドラとして扱われるという欠点があります。また、プログラムをすべて/SAFESEHオプションをつけて再ビルドする必要があるため、SafeSEHによる対策状況はプログラムの開発者に依存します。

Software DEP

Software DEPはSafeSEHを拡張した防御機構です。Windows XP SP2から導入されました。DEP (Data Execution Protection)という文言が含まれていますが、Hardware DEPのように特定のメモリ領域のコードをすべて実行禁止にするものではありません。 Software DEPでは、プログラムのKPROCESS構造体内の_KEXECUTE_OPTIONS構造体に定義されている、ImageDispatchEnableフラグとExecuteDispatchEnableフラグでSEHハンドラの実行制御をします。それぞれ値が「0」に設定されている場合は有効、「1」に設定されている場合は無効です。ImageDispatchEnableフラグが有効に設定されている場合は、プログラムのイメージの外部のアドレスを例外ハンドラとして取り扱いません。ExecuteDispatchEnableフラグが有効に設定されている場合は、実行可能属性がついていない例外ハンドラを呼び出さないことで、攻撃者により上書きされたSEHハンドラの実行を防止するというものです。

SEHOP

SEH Overwrite Protection (SEHOP)は、Windows Vista SP1およびWindows Server 2008から導入された保護機構です。SEHハンドラを辿り、最後に処理される例外ハンドラのアドレスがntdll.dllのFinalExceptionHandlerのアドレスを指していない場合は、不正なSEHが混入されたとしてプログラムの実行を停止します。FinalExceptionHandlerのアドレスがわかっている場合は、SEHOPの防御機構を回避して任意のコードを実行できる可能性が有りますが、Address Space Layout Randomization (ASLR)によるアドレスのランダム化と併用することで堅牢な防御機構となります。 SEHOPは、Windows Vista SP1では初期状態で無効、Windows Server 2008では初期状態で有効に設定されており、レジストリキーHKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel\DispatchExceptionChainValidationの値を0に設定することで有効化することができます。

マルウェアの自己防衛におけるSEH

マルウェアには、マルウェア解析者による解析を困難にする目的で、SEHを悪用することがあります。悪用手順は以下の通りです。

  1. マルウェアが実行したいコードが配置されているアドレスをSEHのハンドラとするSEHのエントリを作成
  2. 意図的に例外を発生させて例外処理として悪意のあるコードを実行

挙動を確認する目的でアセンブリ言語を用いて解説します。以下のアセンブリ言語は、上述の手法でSEHを悪用する処理を例示したものです。

mov   eax, maliciousCodeAddress
push  eax
push  dword ptr fs:[0]
mov   dword ptr fs:[0], esp
xor   eax, eax
mov   dword ptr ds:[eax], ecx

maliciousCodeAddressは、マルウェアが実行したいコードが配置されているアドレスであるとします。まず冒頭の以下の処理ですが、マルウェアが実行したいコードが配置されているアドレスを、スタックに格納しています。

mov   eax, maliciousCodeAddress
push  eax

Windowsのプログラムでは、fs:[0]にはSEHエントリの最初のアドレスが格納されています。よって、続く処理は、SEHハンドラの最初のアドレスをスタックに格納しています。

push  dword ptr fs:[0]

以上までの処理で、マルウェア開発者が作成したSEHエントリが完成しました。続く以下の処理では、fs:[0]にスタックポインタを格納することにより、マルウェア開発者が作成したSEHエントリが最初のSEHエントリとして登録されます。こうして作成されたSEHエントリで示されている次のSEHエントリのアドレスは、そもそものSEHハンドラのアドレスとなり、最終的にはFinalExceptionHandlerのアドレスに到達するため、SEHOPの規則に違反しません。

mov   dword ptr fs:[0], esp

最後に、以下の処理で適当な値をNULLポインタに代入することになるため、Null Pointer Dereferenceによる例外が発生します。

xor   eax, eax
mov   dword ptr ds:[eax], ecx

例外が発生することにより、マルウェア開発者が作成したSEHハンドラが最初に処理されるため、マルウェア開発者が意図したコードが実行されます。下図に概要を示します。

f:id:binary-pulsar:20190117144348p:plain
SEHを悪用したマルウェアの動作の概要

まとめ

本記事では、Windows OSにおける例外処理機構であるSEHの概要について解説しました。また、SEHに関連したセキュリティの技術について解説しました。