Windows版FireFox、MICを利用したセキュリティ対策

#はじめに
##背景
この記事を書いている2015年12月初めに、「ブラウザで開いたページに含まれる広告を感染源とするvvvウイルス」が騒ぎになりました。例えば、以下で取り上げられています。

* http://togetter.com/li/909731
* http://togetter.com/li/909801
* http://togetter.com/li/909748

実態としては、“CryptoWall 4.0”ではないか、とか、ゼロデイ攻撃 ( 公になっていない脆弱性をついた攻撃 ) なのか既知の脆弱性 ( ソフトウェアのアップデートを行っていれば対応できる ) か、執筆時点では不明ですが、どうやらflash playerの脆弱性である可能性は高いようです。

ここでもちろん、「各種ソフトウェアをこまめにアップデートしましょう」というのは、セキュリティ対策としての大前提ではあるのですが、イタチごっこ感もあり、それだけではなあ…という思いもあります。
そこで、セキュリティ対策として、FireFoxに対してWindowsのMICという機能を活用することを、**丁度日本語で公開している人も見つからないので**書いてみることにしました。

##注意事項
以下の点につき、ご注意ください。

* セキュリティ対策はあくまでリスク・コストのバランスを各自で評価して決定するものかと思います。そのため、「こうすべきだ」等の主張は行いません。
* 挙げている手法について、どのような悪影響が出るかとうてい把握しておりません。ですので、あくまで試すときは自己責任でお願いします。
* 筆者はWindowsは全くの専門外です ( Linuxがメインなので… )。Windowsに関しての深い話は期待しないでください。

#Micについて
##コンセプト
「ソフトウェアのアップデート」だけでの対策の限界は何か。それは、ゼロデイ攻撃や誤操作による被害を軽減することができない点です。またアップデートの煩雑さも問題になりえます。  
近年のWindows ( Vista以降 ) にはUACという仕組みがありますので、システム部分が被害を受けることは避けられるにしても、基本はユーザ・グループ権限とファイル・ディレクトリのACLによる制御です。そのため何かあった場合、操作ユーザの管理下にあるデータは全て影響を受ける危険性があります。  
騒ぎとなったvvvウイルスは、ユーザの所有する画像、動画、ドキュメント類がすっかり使えないデータに改変されてしまうものだったとされています。たとえシステム部分が影響を受けなかったとしても、これでは到底被害を抑えられたとは言えません。

こういった事態に対応するため、よりきめ細かいセキュリティ制御としてMAC ( Mandatory Access Control - 強制アクセス制御 ) という考え方があります。Linux における SELinux なんかがそうです。たとえ、権限を持ったユーザであっても、状況に応じて操作を許可するかどうかシステム ( OS ) が介入することで、万が一被害が出たとしてもその影響範囲を抑える、ということを念頭に置いています。

WindowsにおけるMACとして、MIC ( Mandatory Integrity Control ) という仕組みが Vista 以降実装されています。この機能を活用することを考えてみます。  
##MICの機能
MICの機能は ( 私の理解の範囲では ) 非常にシンプルです。それは、各動作プロセスにIL ( Integrity Level ) という権限のレベルを設け、低いものは操作できるデータに制限をかける、というものです。
ILとしては、高い順にSystem, High, Medium, Lowとなっており、デフォルトのレベルはMediumです。  
このILは、実行されるプロセス毎に設定され、原則として新たに生成されるプロセスに引き継がれていくものですが、同時にファイルに対しても設定されるもので、Mediumレベルで実行したプロセスの作ったファイルはMediumレベルで、Lowレベルで実行したプロセスの作ったファイルはLowレベルで、といった具合にプロセスからファイルに受け継がれます。  

よって、FireFox自体をLowレベルで動作させておけば、FireFox自体の脆弱性、あるいは、プラグイン用にプロセスが生成され、そこで実行されるflash playerの影響は、通常のファイルに及ばなくなるということになります。
##具体的な方法
具体的には、実行ファイルと関連ファイルにicaclsコマンドでILの設定を行います。  
ここで「関連ファイル」と言っているのは、FireFoxが弄ることになるファイル群 ( プロファイルであったりダウンロードファイル格納場所であったり ) を指します。LowレベルにしたFireFoxがそれらをいじれなければ、そもそも動作ができないからです。

コマンド例は次の通り、**管理者権限を持ったコマンドプロンプト**で実行します。パスは適宜環境に合わせて読み替えてください。

* icacls "C:\Program Files (x86)\Mozilla Firefox\Firefox.exe" /setintegritylevel low
* icacls "C:\Users\ユーザ名\AppData\Local\Temp" /setintegritylevel(oi)(ci) low /t
* icacls "C:\Users\ユーザ名\AppData\Local\Mozilla" /setintegritylevel(oi)(ci) low /t
* icacls "C:\Users\ユーザ名\AppData\Roaming\Mozilla" /setintegritylevel(oi)(ci) low /t
* icacls "C:\Users\ユーザ名\Downloads" /setintegritylevel(oi)(ci) low /t

なお、これらは http://superuser.com/questions/30668/how-to-run-firefox-in-protected-mode-i-e-at-low-integrity-level を参考にしました。元々は、FirefoxのプログラムフォルダもIL設定の対象になっていましたがここでは含めていません。おそらく、Firefoxの自動アップデートに影響があるのではないかと考えていますが、未検証です。
##効果
起動し直したFireFoxを、[Process Explorer](https://technet.microsoft.com/ja-jp/sysinternals/processexplorer.aspx)で確認したところ、IL ( Mandatory Level ) がLowになっていることが確認できます。
![mic03.png](https://qiita-image-store.s3.amazonaws.com/0/74396/6ab02ca1-7a06-276a-1cdd-94c426301209.png)

この状態で、ILをlowに下げていないフォルダに何かファイルを保存しようとすると、見事にはじかれることが確認できます。
![mic01.png](https://qiita-image-store.s3.amazonaws.com/0/74396/17424a54-1693-1c69-6c46-4387a198a40e.png)
![mic02.png](https://qiita-image-store.s3.amazonaws.com/0/74396/2e867ae9-5b02-4260-7e12-3cb225431e4c.png)

これにより、例えば flash player の脆弱性をついたウイルスが、ユーザのデータを色々書き換えようとしても、その効果はILを low に設定したフォルダ内に限定されることが期待できます。

ただし、lowでないファイルであっても、アップロードに使うことに制限はありませんでした。これはつまり、読み込み操作には制限がかかっていないことになりますので、「情報流出」系の動作は防げないということになります。権限の設定により更に制限をかけることもできるかもしれませんが、この点は未検証です。
#ブラウザ自身の機能
詳細は未確認ですが、このILをlowにするという対策、実はchromeやInternet Explorerは ( おそらく後継のEdgeも )、ブラウザ自身の機能として活用しているらしいという情報がありました。そこで、Firefoxにもあるのではないか? ということで調べてみました。( 先ほどのIL設定は一部元に戻しています )
##sandbox levelの設定
Firefoxはプラグインを別プロセスで実行させ、メインのプロセスと切り離して管理するsandboxモデルを採用しています。  
ここで、このsandboxに関わる設定として、“dom.ipc.plugins.sandbox-level.flash” ( flash player専用の設定、一般のプラグインなら最後を“default”に変える ) をデフォルト値の 0 から 2 に変えることで、Firefox自信がプラグインのILを下げてくれることが分かりました。なお、試しているのはFireFox 42.0 Windows 32bit用 ( 執筆時点での最新版 ) です。
![sandbox01.png](https://qiita-image-store.s3.amazonaws.com/0/74396/047ef0c3-2f29-df74-2cba-ffc5a74de1f5.png)

先ほどと同じくProcess Explorerで見たところ、デフォルトのMediumレベルで動作するFirefoxメインプロセスに対し、プラグイン実行用プロセスはLowレベルに引き下げられています。
![sandbox02.png](https://qiita-image-store.s3.amazonaws.com/0/74396/52f2d0fd-37a9-aa22-b86f-38a6881b4592.png)

この場合に、どのようなフォルダでILを設定すれば十分なのかは未検証ですが、flash playerのみを重点的に対策するのであれば、この機能も良いかもしれません。
#まとめ
長くなってしまいましたが、まとめです。

* WindowsにはMICというILにより権限の制御を行う、シンプルなMACの機能がある
* icaclsコマンドを管理者権限で実行することで、ファイル・フォルダのILを変更することができる
* Firefox自身の設定の中にも、プラグイン実行プロセスのILを引き下げる効果を持つものがある

ただ、これら対策による副作用について私が十分に分かっていないこともありますので、あくまで機能の紹介に過ぎないとお考えください。試される場合には、影響等十分に考えたうえで自己責任でお願いします。  
そして願わくば、識者によるブラッシュアップを!!