Webセキュリティの小部屋

Twitter のフォローはこちらから Facebook ページはこちら Google+ページはこちら RSSフィードのご登録はこちらから
公開日:2018年1月3日

Windows 10でEMETの代替となるExploit Protectionを使用してセキュアなブラウザ環境を構築する

はじめに

Windows でゼロデイ脆弱性の軽減策として、今までEMET(Enhanced Mitigation Experience Toolkit)というツールが使用されてきました。

EMET というツールは、Windows に組み込まれている脆弱性軽減策の設定を簡素化する優れものでしたが、Windows 10 のサポートはバージョン1607(Anniversary Update)までで、バージョン1703(Creators Update)とバージョン1709(Fall Creators Update)サポートされません。

また、バージョン1703に EMET はインストールできますが、バージョン1709では EMET をインストールすることもできません。そして、EMET は全てのサポートを2018年7月31日に終了してしまいます。

では、これから Windows ユーザーは EMET がなくなった後、どうすればよいのでしょうか?

最近は、Windows Update は強制的に適用されているので、ほとんどの Windows 10 ユーザーはバージョン1709になっていると思います。

Windows 10には、EMET の代替となりうる「Exploit Protection」という機能が組み込まれており、この機能を利用することにより、EMETと同じような脆弱性軽減策を行うことができます。

なお、Windows 10 より前のバージョンは Windows 7やWindows 8.1になりますが、Windows 7は2020年1月14日、Windows 8.1 は2013年1月10日に延長サポートが終了してしまうため、Windows 10への移行が推奨されます。

Exploit Protection とは

Exploit Protection の説明の前に、Windows + EMET の構成より、新しいバージョンの Windows のデフォルト設定の方がセキュリティが強固と言われている点は覚えておくとよいと思います。具体的には、Windows 7 + EMET より、Windows 10のデフォルト設定の方がセキュリティが強固ということです。

Exploit Protection は、OS に組み込まれている脆弱性軽減策を簡単に Windows の機能として提供するものになります。設定は、システム全体へ対するものと、個別のプログラムに対するものがあります。なお、個別のプログラムの設定はシステム全体の設定より優先されます。

具体的に見ていきましょう。

Exploit Protectionは、「Windows Defenderセキュリティセンター」の「アプリとプラウザーコントロール」から開くことができます。「システム設定」タブでシステム全体の設定を、「プログラム設定」タブで個別プログラムの設定を行います。

EP01

システム設定では以下のオプションを設定可能です。基本的にデフォルトのままの運用が望ましいようです。

システム設定 既定値 説明
制御フローガード(CFG) 既定でオンにする 間接的な呼び出しの制御フローの整合性を保証します。
データ実行防止(DEP) 既定でオンにする データ専用のメモリページからコードを実行できないようにします。
イメージのランダム化を強制する(必須ASLR) 既定でオフにする /DYNAMICBASEを使ってコンパイルされていない実行可能イメージを、強制的に再配置します。
仮想メモリの割り当てをランダム化する(ボトムアップASLR) 既定でオンにする 仮想メモリの割り当ての場所をランダムにします。
例外チェーンを検証する(SEHOP) 既定でオンにする ディスパッチ中の例外チェーンの整合性を保証します。
ヒープの整合性を検証する 既定でオンにする

ヒープの破損が検出された場合、プロセスを終了します。

http://www.atmarkit.co.jp/ait/articles/1712/25/news015_2.html より

プログラム設定では以下のオプションを設定可能です。「システム設定の上書き」とは分かりにくい表記ですが、プログラム設定の内容をシステム設定よりも優先させるということです。

プログラム設定 オプション 説明
任意のコードガード(Arbitrary Code Guard:ACG) ・システム設定の上書き:オン/オフ イメージが保護されない実行可能コードを禁止し、コードページの変更を防止します。
・スレッドオプトアウトを許可する
・監査
低整合性イメージをブロックする ・システム設定の上書き:オン/オフ 整合性レベル(Integrity Level:IL)が低いことが示されているイメージが読み込まれないようにします。
・監査
リモートイメージをブロックする ・システム設定の上書き:オン/オフ リモートデバイスからイメージが読み込まれないようにします。
・監査
信頼されていないフォントをブロックする ・システム設定の上書き:オン/オフ %Windir%Fontsディレクトリにインストールされないフォントが読み込まれないようにします。
・監査
コードの整合性ガード ・システム設定の上書き:オン/オフ Microsoftによって署名されているイメージのみ、読み込みを許可します。
・Windowsストアによって署名されているイメージの読み込みも許可する
・監査
制御フローガード(CFG) ・システム設定の上書き:オン/オフ 間接的な呼び出しの制御フローの整合性(Control Flow Integrity:CFI)を保証します。
・厳密なCFGを使用する
データ実行防止(DEP) ・システム設定の上書き:オン/オフ データ専用のメモリページからコードを実行できないようにします。
・ATLシミュレーションを有効にする(日本語訳のミス、正しくはATLエミュレーション)
拡張ポイントを無効にする ・システム設定の上書き:オン/オフ ウィンドウフックなど、全てのプロセスへのDLLの挿入を許可するさまざまな拡張メカニズムを無効にします。
Win32kシステムコールを無効にする ・システム設定の上書き:オン/オフ プログラムがWin32kシステムコールテーブルを使用できないようにします。
・監査
子プロセスを許可しない ・システム設定の上書き:オン/オフ プロセスが子プロセスを作成できないようにします。
・監査
エクスポートアドレスフィルター(EAF) ・システム設定の上書き:オン/オフ 悪意のあるコードによって解決されている危険なエクスポート関数を検出します。
・エクスプロイトによってよく悪用されるモジュールのアクセスを検証する
・監査
イメージのランダム化を強制する(必須ASLR) ・システム設定の上書き:オン/オフ /DYNAMICBASEを使ってコンパイルされていないイメージの再配置を強制する。
・ストリップイメージを許可しない
インポートアドレスフィルター(IAF) ・システム設定の上書き:オン/オフ 悪意のあるコードによって解決されている危険なインポート関数を検出します。
・監査
仮想メモリの割り当てをランダム化する(ボトムアップASLR) ・システム設定の上書き:オン/オフ 仮想メモリの割り当ての場所をランダムにします。
・高エントロピを使用しない
・監査
実行をシミュレートする(SimExec) ・システム設定の上書き:オン/オフ 扱いに注意が必要な関数の呼び出しが正当な呼び出し元に返されることを保証します。
・監査
API呼び出しを検証する(CallerCheck) ・システム設定の上書き:オン/オフ 扱いに注意が必要なAPIが正当な呼び出し元によって呼び出されることを保証します。
・監査
例外チェーンを検証する(SEHOP) ・システム設定の上書き:オン/オフ ディスパッチ中の例外チェーンの整合性を保証します。
ハンドルの使用状態を検証する ・システム設定の上書き:オン/オフ 無効なハンドルの参照に対して例外を生成します。
イメージの依存関係の整合性を検証する ・システム設定の上書き:オン/オフ Windowsイメージの依存関係の読み込みにコード署名を強制します。
・監査
スタックの整合性を検証する(StackPivot) ・監査 扱いに注意が必要な関数に対して、スタックがリダイレクトされていないことを保証します。

http://www.atmarkit.co.jp/ait/articles/1712/25/news015_2.html より

セキュアなブラウザ環境の設定

Exploit Protection でブラウザをプログラム設定で設定すると、よりセキュアにブラウザを利用することができるようになります。但し、ブラウザによって設定項目が異なり、余計な設定を行うとブラウザが起動しなくなるためご注意ください。設定の仕方としては、1項目ずつ設定して動作確認することになります。

ただ、それでは大変なので、私の方で動作確認を行った設定を以下に掲載します。対象となるブラウザは、Google Chrome, Firefox, Microsoft Edge になります。

Google Chrome

Google Chromeでは、[プログラムを追加してカスタマイズ]から[正確なファイルパスを選択してください]から Google Chromeのchrome.exeファイルを選択します。私の環境では、「C:\Program Files (x86)\Google\Chrome\Application\chome.exe」でした。なお、[プログラムの名前で追加]ではうまく動作しませんでした。

プログラム設定画面では、以下のように設定し適用します。

プログラム設定 オプション
任意のコードガード(Arbitrary
Code Guard:ACG)
デフォルト
低整合性イメージをブロックする オン
リモートイメージをブロックする オン
信頼されていないフォントをブロックする オン
コードの整合性ガード デフォルト
制御フローガード(CFG) オン
データ実行防止(DEP) デフォルト
拡張ポイントを無効にする オン
Win32kシステムコールを無効にする デフォルト
子プロセスを許可しない デフォルト
エクスポートアドレスフィルター(EAF) デフォルト
イメージのランダム化を強制する(必須ASLR) デフォルト
インポートアドレスフィルター(IAF) デフォルト
仮想メモリの割り当てをランダム化する(ボトムアップASLR) デフォルト
実行をシミュレートする(SimExec) デフォルト
API呼び出しを検証する(CallerCheck) デフォルト
例外チェーンを検証する(SEHOP) デフォルト
ハンドルの使用状態を検証する オン
ヒープの整合性を検証する デフォルト
イメージの依存関係の整合性を検証する オン
スタックの整合性を検証する(StackPivot) デフォルト

Firefox

Firefoxでは、[プログラムを追加してカスタマイズ]から[正確なファイルパスを選択してください]から Firefoxのfirefox.exeファイルを選択します。私の環境では、「C:\Program Files (x86)\Mozilla Firefox\firefox.exe」でした。

プログラム設定画面では、以下のように設定し適用します。

プログラム設定 オプション
任意のコードガード(Arbitrary
Code Guard:ACG)
デフォルト
低整合性イメージをブロックする オン
リモートイメージをブロックする オン
信頼されていないフォントをブロックする オン
コードの整合性ガード デフォルト
制御フローガード(CFG) オン
データ実行防止(DEP) デフォルト
拡張ポイントを無効にする オン
Win32kシステムコールを無効にする デフォルト
子プロセスを許可しない デフォルト
エクスポートアドレスフィルター(EAF) オン
イメージのランダム化を強制する(必須ASLR) デフォルト
インポートアドレスフィルター(IAF) オン
仮想メモリの割り当てをランダム化する(ボトムアップASLR) デフォルト
実行をシミュレートする(SimExec) オン
API呼び出しを検証する(CallerCheck) オン
例外チェーンを検証する(SEHOP) デフォルト
ハンドルの使用状態を検証する オン
ヒープの整合性を検証する デフォルト
イメージの依存関係の整合性を検証する オン
スタックの整合性を検証する(StackPivot) オン

Microsoft Edge

Microsoft Edge では、[プログラムを追加してカスタマイズ]から[プログラムの名前で追加]から 「MicrosoftEdge.exe」を追加します。

プログラム設定画面では、以下のように設定します。

プログラム設定 オプション
任意のコードガード(Arbitrary
Code Guard:ACG)
オン
低整合性イメージをブロックする オン
リモートイメージをブロックする オン
信頼されていないフォントをブロックする オン
コードの整合性ガード オン
制御フローガード(CFG) デフォルト
データ実行防止(DEP) デフォルト
拡張ポイントを無効にする オン
Win32kシステムコールを無効にする デフォルト
子プロセスを許可しない デフォルト
エクスポートアドレスフィルター(EAF) オン
イメージのランダム化を強制する(必須ASLR) デフォルト
インポートアドレスフィルター(IAF) オン
仮想メモリの割り当てをランダム化する(ボトムアップASLR) デフォルト
実行をシミュレートする(SimExec) オン
API呼び出しを検証する(CallerCheck) オン
例外チェーンを検証する(SEHOP) デフォルト
ハンドルの使用状態を検証する オン
ヒープの整合性を検証する デフォルト
イメージの依存関係の整合性を検証する オン
スタックの整合性を検証する(StackPivot) デフォルト

設定ファイルのダウンロード

上記設定を手動で行うのは大変なので、Google Chrome と Firefox のパスに気を付けて、異なっている場合は修正するのであれば、以下のXMLファイルを右クリックしてダウンロードし、XMLファイルをインポートしてみてください。

インポート方法は、PowerShell のコンソールを管理者権限で起動し以下のコマンドを実行します。

> Set-ProcessMitigation -PolicyFilePath  Settings.xml

これで簡単にセキュアなブラウザ環境を設定できます。

おわりに

EMET がなくなることで Microsoft はかなり非難されていますが、Windows 10 バージョン1709に移行すれば、Exploit Protection が使えるようになりますし、Windows 7 のサポート期間も残り少ないので、セキュリティを考慮すれば Windows 10バージョン1709に移行することが推奨と言ってもよいと思います。

これからは、Windows 10 + Exploit Protection + MyJVNバージョンチェッカ で Windows をセキュアにしていきましょう。

参考サイト


スポンサーリンク




カテゴリー:ブログ

Twitter でも、いろんな情報を発信しています。



コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA