Windows 8/8.1でEMETを使ってシステム設定を行ってはいけない

EMETを使っていたWindows 7以前からEMETを使うWindows 8に移行したらアプリケーションが動かなくなった人が居たらここを確認してあげるとよい。
2

DEPまたはSEHOPを「Application Opt In」に設定すると本来有効になるべきプロセスで無効になる。

OptIn以外になっている状態からOptInにすると発症。Windows既定のOptInには問題なし。Windows既定のOptInとEMETで変更したOptInはEMET上の表示からは区別できない。

  • /NXCOMPATによる自動的なDEPの有効化が行われなくなる。

  • サブシステムバージョン6.2の時に自動的にSEHOPが有効化される処理が行われなくなる。

  • Permanent扱いになりSetProcessDEPPolicy(PROCESS_DEP_ENABLE)によるDEPの有効化は行えなくなる。

  • EMETを適用してもDEP,SEHOP共に有効にならない。(EMET 4.0未満のSEHOPを除く)

    DEPを「Application Opt Out」に設定すると自動的な救済処置と例外指定が機能しなくなる。

    Windows 7までと同じように設定している(つもりな)のに挙動が違うことになる。

  • /NXCOMPATになっていないプロセスに対するATLサンクエミュレーションが行われなくなる。(OptOutに設定した時、/NXCOMPATになっていないプロセスに対してはATLサンクエミュレーションは有効が正しい

  • DEPとの明確な非互換が確認されている条件に対する自動的なDEPの無効化が行われなくなる。

  • 「次に選択するものを除くすべてのプログラムおよびサービスについて DEP を有効にする」の例外リストによるDEPの無効化が行われなくなる。

  • Permanent扱いになりSetProcessDEPPolicy(0)によるDEPの無効化は行えなくなる。

    DEPは既定のOptInから無変更のままSEHOPの設定を行う(設定値は問わない)とDEPの挙動が変わる。

  • 基本的には上の二番目の状態に加えて有効になるDEPが全てATLサンクエミュレーション有りの状態に変わる。

  • /NXCOMPATなプロセスに対してATLサンクエミュレーションが有効になる。(/NXCOMPATに対してはサンクエミュは無効が正しい
    何が何だかわからない…。

    ASLRが無効にできない。

  • Disabledにしても/DYNAMICBASEになっているDLLは再配置される。
    無効になるのはASLR非対応DLLに対する強制ASLR。
    だから一番目の問題も起きない。…。

    SEHOPの初期設定がDisabledと表示される。(EMET 4.0から)

    EMET 4.1で修正される。
    この状態からOptInに変更すると一番目の問題発症なので注意。

  • この状態でもIFEOキーでのSEHOP有効化は正しく機能している。つまり実状はOptIn。

  • MitigationOptionsがあるとOptIn表示になる。(ASLRかDEPの設定だけ変更後EMETを起動しなおしてもOptIn表示に変わる)

  • Windows XP、Vista、7には影響しない。

  • EMETを使わずシステムのプロパティやBCDEDITによるDEPの設定、DisableExceptionChainValidationによるSEHOPの設定は従来通りの挙動。(ASLR無効化の機能不全はどうしようもない)

  • AlwaysOnに設定する場合は関係なし。救済も例外も無いのは従来通りの挙動。(三番目の問題に注意)

  • 3.0、3.5TP、4.0β、4.0で起こる。(3.0未満は未確認)

確認とワークアラウンド

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Kernel!MitigationOptionsを16進数表示して、

  • 下一桁目(DEP)か二桁目(SEHOP)が2になっていればOptInの問題あり。
    MitigationOptions値を削除して必要に応じて再設定。
    又は
    各桁を0に設定。
  • 下一桁目(DEP)が1なら救済無し、例外無視の問題あり。
    0に設定してBCDストアでのみ設定する。(EMET上の表示はOptInになるが無視)
    又は
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\実行ファイル名 以下にMitigationOptionsをREG_QWORDで作成し下一桁目に2(DEP無効)又は3(DEP有効ATLサンクエミュ有り)を手動で設定。
  • 下一桁目(DEP)が0で二桁目(SEHOP)が0以外ならDEPの設定が無視される問題あり。
    DEPもEMETで設定する。
    又は
    SEHOPも0にしてDisableExceptionChainValidationで設定する。(EMET上の表示はOptInかDisabledになるが無視)
鈴木友紀 @0xbadfca11

Windows8でMitigationOptionsでDEPをOptOutに設定する(EMET3.5TP経由含む)とATLサンク救済処置が行われない。BCDストアでnxがOptOutになっているとき(システムのプロパティ経由含む)は従来通り行われる。

2013-03-15 19:39:10
鈴木友紀 @0xbadfca11

3.5TPの時Windows 8でDEP=OptOutがおかしい(ATLサンクエミュが無効になる)と言ったけど、デフォルトのOptInじゃなく8 & EMET 3.5TP/4.0bで明示的にOptInに設定したときが全項目でおかしい。

2013-04-19 09:03:38
鈴木友紀 @0xbadfca11

/NXCOMPATによる暗黙的有効は無効として扱われる、SetProcessDEPPolicy()呼び出しは無効、などなど。Disable by defaultとしてのOptInになってる。一旦OptOutにしたけどOptInに戻したときとか知らずに使うと死ぬレベル。

2013-04-19 09:08:45
鈴木友紀 @0xbadfca11

サブシステムバージョン6.2にすると暗黙に有効になるはずのSEHOPも無効だわ。

2013-04-19 09:45:47
鈴木友紀 @0xbadfca11

やばい、EMET 3.0の時点で既にMitigationOptions使ってて同問題存在する。

2013-04-19 19:39:09

↓どちらもEMET上の表示はApplication Opt In

鈴木友紀 @0xbadfca11

誰も戻さないだろ、って思ったけど二つ合わさればありえそうなケース EMETでDEPをOptOutに設定する→ATLサンクエミュレーションに依存していたアプリが動かなくなる→EMETでOptInに戻す→\(^o^)/

2013-04-19 22:36:54
鈴木友紀 @0xbadfca11

一度EMETで設定するとMitigationOptionsは最優先されるようなのでシステムのプロパティからの設定が効かなくなってEMETで設定するしかなくなる罠。

2013-04-19 22:40:43
鈴木友紀 @0xbadfca11

Windows 8でEMETのシステム設定からSEHOPをOptOutまたはAlwaysOnに設定するとIMAGE_DLLCHARACTERISTICS_NX_COMPATを問わずATLサンクエミュレーション有効のDEPが有効になるという斬新な挙動を見つけてしまい途方に暮れる。

2013-04-21 16:08:42
鈴木友紀 @0xbadfca11

設定される値は(自分のテストが間違ってなければ)問題ない値のはずで、おかしいのはWindows 8側っていう。

2013-04-21 16:13:36
鈴木友紀 @0xbadfca11

GetSystemDEPPolicy()==OptInのままなのに/NXCOMPAT:NOの実行ファイルからGetProcessDEPPolicy()するとPROCESS_DEP_ENABLEが取れる…。

2013-04-21 16:25:36
鈴木友紀 @0xbadfca11

Windows 8でMitigationOptionsを使ってDEPの挙動をVista/7と一致させることはできないという結論。 1にする⇒/NXCOMPAT:NOに対してATLサンクエミュが有効にならない 3にする⇒/NXCOMPATに対してATLサンクエミュが有効になる

2013-04-21 17:15:24
鈴木友紀 @0xbadfca11

今更ながらEMETでDEPをOptOutにしたときシステムのプロパティの「次に選択するものを除く~」が機能してない(そこ確認してなかったのかよ)。つまりOptOutでありながらOptOutするUIが無い(EMETのConfigure AppsではWindowsの機能は切れない)。

2013-05-12 21:47:55
鈴木友紀 @0xbadfca11

他に今まで確かめてなかった事としては、エントリポイントが実行可能セクション内を指していない時など自動的にDEPから除外されるプロセスも除外されない。もうね…。

2013-05-12 21:48:04
鈴木友紀 @0xbadfca11

BCDストアとMitigationOptionsで違う値を設定するとシステム情報の取得はBCDストアを実挙動はMitigationOptionsを返す。

2013-05-12 21:48:17
鈴木友紀 @0xbadfca11

GetSystemDEPPolicy()==AlwaysOffでGetProcessDEPPolicy()==PROCESS_DEP_ENABLE,TRUEが同時に観測可能なのは流石にふざけてる。

2013-05-12 21:48:25
鈴木友紀 @0xbadfca11

EMET on Win8でASLR=Disabledにしたときに効果を発揮するもの見つけた。IFEOキーで0x100/0x300のForceASLRが働かなくなる。(/DYNAMICBASEなイメージに対して無効にできないのは変わらない)

2013-05-31 21:20:56
鈴木友紀 @0xbadfca11

現時点で気づいたEMET 4.0の不具合らしきもの[未検証] ・VistaでAppsのSEHOPが変更できない ・8でMitigationOptionsが存在してないとSystemのSEHOPがDisabled(AlwaysOff)扱いになってAppsのSEHOPが変更できない

2013-06-18 15:36:39