Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

SafeSEH(セーフエスイーエイチ)とは | 意味や読み方など丁寧でわかりやすい用語解説

SafeSEH(セーフエスイーエイチ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

セーフSEH (セーフエスイーエイチ)

英語表記

SafeSEH (セーフエスイーエイチ)

用語解説

SafeSEHとは、Windowsオペレーティングシステムにおいて、プログラムの実行中に発生する「例外」を処理するメカニズムであるSEH (Structured Exception Handling) を悪用した攻撃からシステムを保護するためのセキュリティ機能の一つだ。悪意ある攻撃者がプログラムの脆弱性を突き、不正なコードを実行しようとする試み、いわゆる「エクスプロイト」を防ぐための重要な防御策として導入されている。

プログラムは実行中に予期せぬエラー、例えばメモリへの不正なアクセスやゼロ除算などが発生することがある。これを「例外」と呼ぶ。WindowsのSEHは、このような例外が発生した際に、プログラムが異常終了するのを防ぎ、適切なエラー処理を行うための仕組みを提供する。具体的には、開発者が例外を捕捉し、その例外に応じた処理を行うための「例外ハンドラ」と呼ばれる特定のコードを登録しておく。例外が発生すると、システムは登録された例外ハンドラを見つけ出し、そのハンドラに処理を移行させることで、プログラムの堅牢性を保つ。

しかし、このSEHの仕組みが悪用される危険性があった。SEHのハンドラのアドレスは、プログラムの実行時に使用される「スタック」と呼ばれるメモリ領域に「SEHフレーム」として格納される。このSEHフレームには、次に実行される例外ハンドラのアドレスと、そのSEHフレーム自体のアドレスを指すポインタが含まれる。もし攻撃者がスタックバッファオーバーフローのような脆弱性を利用して、このスタック上のSEHフレームを上書きすることに成功した場合、例外ハンドラのアドレスを攻撃者が用意した不正なコードのアドレスに書き換えることが可能になる。そして、何らかのきっかけで例外が発生すると、システムは上書きされた不正なアドレスを参照し、攻撃者の意図する悪意あるコードを実行してしまうことになる。これが「SEHオーバーライト攻撃」と呼ばれるもので、プログラムの制御を奪う一般的な攻撃手法の一つだった。

このような深刻な脅威に対処するために導入されたのがSafeSEHである。SafeSEHの主な目的は、SEHオーバーライト攻撃によって不正な例外ハンドラが呼び出されるのを阻止することにある。SafeSEHは、プログラムがコンパイルされる際に、コンパイラオプション(例えばVisual C++では/SAFESEHオプション)を有効にすることで機能する。このオプションが有効な状態でコンパイルされた実行可能ファイル(EXE)やダイナミックリンクライブラリ(DLL)は、自身のモジュール内に有効な例外ハンドラのアドレスリストを記録したテーブルを持つようになる。

プログラムが実行され、SEHによって例外ハンドラが呼び出される際に、Windowsのローダーは、呼び出されようとしている例外ハンドラのアドレスが、そのモジュールが持つ有効なハンドラのアドレスリストの中に存在するかどうかを検証する。もし、呼び出されようとしているアドレスがこのリストに存在しない場合、それは不正なアドレスであると判断され、システムはその例外ハンドラの呼び出しをブロックし、プログラムの実行を中断させる。これにより、攻撃者がスタック上に不正な例外ハンドラのアドレスを書き込んでいたとしても、それが実行されることを未然に防ぎ、悪意あるコードの実行を阻止できる。

SafeSEHが有効であるためには、対象のプログラムモジュールがSafeSEH対応のコンパイラオプションでコンパイルされている必要がある。これは、各モジュールが自身の有効な例外ハンドラリストを内包する必要があるためだ。もし、プログラムがSafeSEHに対応していないモジュールをロードし、その非対応モジュールでSEHオーバーライト攻撃が発生した場合、SafeSEHによる保護は機能しない可能性がある。しかし、少なくともSafeSEHに対応しているモジュールにおいては、その有効なハンドラリストに基づいた厳格なチェックが行われるため、セキュリティが向上する。

SafeSEHは非常に効果的な防御機構の一つだが、すべてのタイプの攻撃を防げるわけではない。例えば、Return-Oriented Programming (ROP) のような、SEHを直接上書きしない攻撃手法や、ヒープ領域を標的とする攻撃には対応できない。また、攻撃者はSafeSEHのチェックを回避する技術を開発することもある。そのため、SafeSEHは複数のセキュリティ対策が重層的に適用される「多層防御」の一部として位置づけられ、DEP (Data Execution Prevention) やASLR (Address Space Layout Randomization) といった他の防御機構と組み合わせて利用することで、より堅牢なシステムを構築することが可能になる。システムエンジニアを目指す者にとって、SafeSEHのような低レベルなセキュリティ機能の原理を理解することは、安全なソフトウェアを設計・開発・運用するために不可欠な知識である。

関連コンテンツ