Enhanced Mitigation Experience Toolkit

**Enhanced Mitigation Experience Toolkit**（EMET）とはマイクロソフトが提供する脆弱性緩和ツールである。OSに実装されている緩和策の設定のほか、OSやコンパイラでは提供されていない緩和策をアプリケーション単位で設定することができる。

使用に当たってはアプリケーションが意図的にEMETが防御する手法を使用している可能性があるリスクや、EMETを使用するだけで全ての攻撃を防げるわけではない事に留意する必要がある。

## 概要
EMETが提供するのは主にメモリ関係の保護機能である。それ以外にもSSL/TLSの正当性確認などの補助機能が追加されている。一部の機能は確率（運）に影響される防御システムのためマイクロソフトは「緩和」と表現している。各機能はアプリケーションごとにオンオフが可能である。

EMETは主にメモリの防御機能のみであるためパターン解析型または動作監視型であるアンチウイルスソフトとは異なる防御システムであり、EMETとアンチウイルスを組み合わせることでより強力なセキュリティを発揮できる。特にゼロデイ攻撃を防ぐ手段の一つとして有効である。アンチウイルスソフトの中にはEMETのような保護機能を持つものがいくつか存在するものの、EMETほど多機能で詳細な動作設定が出来る物はない。

ほとんどのアプリケーションでは、プログラマの設計ミスによりメモリ処理のバグ（セキュリティホール）が日常的に発生する。このようなメモリバグを突き、システムに侵入しようとするマルウェアからシステムを保護する機能を提供する。例えば、セキュリティホールのある画像閲覧ソフトが悪意のある画像を読み込むとマルウェアに侵入されてしまう。メモリに不正なアクセスが行われると、EMETは対象のプログラムを停止させてアラートを表示しイベントログに記録する。

悪意のないプログラムであってもセキュリティホールが存在する事があり、EMETがプログラムの動作を中断してしまう事がある。EMETが提供する機能のうち、どれがプログラムに悪影響を及ぼすかはユーザ側が判断する必要がある。特にシステムファイルを保護する場合、システムごとフリーズしてしまう可能性がある。また、EMETより先に起動するようなプログラムは保護できない。Google Chromeなど自前でメモリ保護機能を持っているソフトウェアは、EMETで保護指定すると競合し、不具合を起こす恐れがある。

インストール時に「推奨設定」にすると、Internet Explorerなど一部のマイクロソフト製品やJava、Adobe Readerなどのいくつかのアプリケーションが保護設定に追加される。

パス（フォルダ名）の一部にワイルドカードを指定する事が出来る。ただし、ファイル名の一部には指定できない。
:OK:  *\java.exe
:OK:  *Java*\java.exe
:NG:  *\java*.exe

EMETは、2018年7月31日でサポートを終了した。Windows 10 ver.1703の場合には一部の機能はOSに取り込まれているため、これらの設定についてはPower Shellで実行するProcessMitigations Moduleを導入すれば継続して設定可能である。Windows 10 ver.1709以降では、Windows Defender Exploit Guard(およびそのサブセットであるWindows Defender Exploit protection)として後継機能が提供されている。

## EMETにより提供される機能
以下の脆弱性緩和策を設定することができる。この内システム全体に設定出来るのは**DEP**、**SEHOP**、**ASLR**のみである。また一部のシステム設定は互換性の問題から規定では選択できないようになっている。

;DEP(Data Execute Prevention)
:データ実行防止を参照。システム設定は全ての対応Windowsにて任意の設定が可能。
;SEHOP(Structured Exception Handler Overwrite Protection)
:SEHハンドラーチェーンの上書きを検出しハンドラーを実行せずにプロセスを終了させる。Windows Vista Service Pack 1にて実装された機能でもあるが、EMETではそれとは別の実装を提供するため以下の2点の違いがある。
:* Windows 7/2008 R2より前のWindowsでもアプリケーション単位でOpt-Inできる。
:* Windows Server 2003でも利用可能。
:EMETによるSEHOP実装にはWindowsのそれと比べて脆弱な部分が指摘されている。

:
;NullPage(Null Page pre-allocation)
:ヌルポインタ付近のメモリアドレスへのメモリ割り当てを拒否することでヌルポインタをdereferenceしてしまう脆弱性を利用した攻撃を防ぐ。Windows 8、Windows Server 2012にも実装されており、既定で有効である。
;HeapSpray(Common heap spray address pre-allocation)
:で利用されやすいアドレスを予め使えなくしておくことで攻撃の成功率を下げる。
;EAF(Export Address Table Access Filtering)
:kernel32.dllとntdll.dllのExport Address Tableの読み込み元を限定することで攻撃を防ぐ。この防御により同様の手法を利用した攻撃は99.9%防げるとしている。
;EAF+
:EAFの防御に追加でスタックメモリとスタックレジスタのチェックを行う。また、アプリケーションごとにExport Address Tableの読み込み元として（EAFのルールでは許可されるがEAF+有効時は）許可しないDLLの指定も行う。
;MandatoryASLR(Enforces Address Space Layout Randomization on loaded binaries)
:詳細はアドレス空間配置のランダム化を参照。WindowsではASLRの適用はDLL単位でのOpt-Inであり対応になっていないDLLは通常再配置されないが、EMETにより再配置を強制する。アプリケーション単位での強制ASLRはWindows 7以降にも実装された機能であるがEMETはその実装を利用していない。
:
:
;BottomUpASLR(Bottom-Up virtual memory randomization)
:DLL読み込み以外の低位アドレスから割り当てていくタイプ（ヒープやスタック、メモリマップドファイルが該当する）のメモリ確保をランダム化する。
;LoadLib(Check and prevent Loadlibrary calls against UNC paths)
:ネットワークパスからのDLL読み込みを拒否する。
;MemProt(Special check on memory protection APIs)
:スタックメモリに実行可能属性を付加しようとするAPI呼び出しを拒否する。スタックに書き込まれた攻撃コードを実行しようとした際にDEPにより実行が拒否される。
;Caller(ROP mitigation that checks if critical function was called and not returned into)
:攻撃コードにおいて用いられやすい幾つかのAPIが正しい命令で呼び出されたのかをチェックする。
;StackPivot(Check if stack pointer was pivotted)
:スタックメモリがすり替えられていないか（OSがスタックに割り当てたメモリをスタックレジスタが指しているか）をチェックする。
;SimExecFlow(Simulate the execution flow after thr return address to detect subsequent ROP gadgets)
:攻撃コードにおいて用いられやすい幾つかのAPIの呼び出し元アドレスの命令をシミュレート実行しReturn-oriented programmingで用いられる手法が使われていないかをチェックする。
;ASR(Attack Surface Reduction)
:指定したDLLの読み込みを拒否する。任意のプラグインを追加できるアプリケーションの防御に使用する。Internet Explorerではセキュリティーゾーンと連携してDLLの読み込みを許可するゾーンを設定できる。
;Block Untrusted Fonts
:Webフォントや文書に埋め込まれたフォントなどシステムにインストールされたフォント以外のフォント読み込みを拒否する。Windows 10でのみ利用可能。
;Certificate Trust
:特定のSSL/TLS証明書を検証する際に指定したルート証明機関から発行されたルート証明書であるかなどをチェックする。既定ではデスクトップ版Internet Explorerのみ対応する。

以下はEMETを適用したアプリケーションすべてに適用される。
;Deep hooks
:チェックを公開APIだけでなく公開APIが呼び出す内部非公開APIでも行う。
;Anti detours
:API入口のコードをあらかじめ別の場所にコピーしておき、コピーしてある方のコードを実行したのち途中から元のAPIに処理を戻す手法（こうすることで本物のAPIの入口にEMETが追加したチェックを回避しようとする）のAPIフックを検出する。なおDetoursとはマイクロソフトが提供している同様の手法を用いるAPIフックライブラリの名前である。
;Banned functions
:一般的なアプリケーションでは正当な利用方法が無い特定のシステム用APIの使用を拒否する。

## 脚注