Windows用インストーラのセキュリティ問題

#はじめに
##概要
本記事は、Windows用のソフトウェアのインストーラに潜むセキュリティ問題につき注意喚起するものです。

##影響範囲
* 対象
    * OS: Windows Vista以降  
      ※検証はWindows 10 で行っております  
      ※サーバ系のWindows OSも同様と推測しますが、対象範囲は把握しておりません
    * ソフトウェア: 多数あると推測しています  
      ※どの程度のソフトが該当するか詳らかには把握しておりません  
      ※あくまで、個々のインストーラ作成者の設計上の問題であって、インストーラ作成ツールやフレームワークそのものの問題ではないという認識です

* 影響およびタイミング
    * 当該ソフトや関連ソフト ( ブラウザ、プラグイン等 ) の脆弱性、バグ、あるいはユーザの誤動作による影響 ( ファイル、レジストリ改ざん等 ) が、システム部分にも拡大するおそれがあります  
      ※新たに脆弱性ができる訳ではないため、影響自体は小さいという認識です
    * ソフトウェアのインストール作業が完了した直後
* 原因
    * インストーラが、本来権限が不要なプロセスも管理者権限で起動するため
* 対策
    * 後述の[対策](#対策)を参照してください

#詳細 ( 一般ユーザ向け )
##背景
Windows Vista以降は、管理者ユーザであっても不用意にシステムに影響を及ぼさないよう、UAC ( User Access Control ) という機能が導入されています。そのため、“C:\Program Files”といったシステムフォルダは、通常の操作ではファイル生成等が抑止されており、明にプロセスに管理者権限を与える必要があります。

この「管理者権限」は、MIC ( Mandatory Integrity Control ) という機能によって制御されています。これは、プロセスおよびファイル/フォルダ・レジストリ項目に IL ( Integrity Level ) という権限レベルを設け、低い IL での高い IL への操作を抑止するものです。  
ILとしては高い順に System, High, Medium, Low の4段階が用意されており、一般のプロセスは Medium、「管理者権限」を持ったプロセスは High で実行されます。

一般に、ソフトウェアのインストーラは、システムフォルダへのファイル配置等を行うために管理者権限を必要とします。しかしながらインストーラ作成者の設計によっては、本来管理者権限を必要としないプロセスも管理者権限 ( High IL ) で実行されるケースがあることを発見しました。

##管理者権限の不要なプロセス
典型的には、次の2種類が分かっています。

* インストール完了後に特定のURLを開くことで起動するブラウザプロセス、および、ブラウザから起動されるプラグイン ( flash player ) 等
* インストール完了後にReadMe表示で起動されるエディタ/ビューアや、あるいはインストールされたソフト本体

こういったプロセスは、インストール完了後もそのまま残るため、ユーザが明示的に終了させなければ、管理者権限で動作し続けることになります。
加えて、通常これらのソフトはユーザ権限 ( Medium IL ) で動作させるものであるため、そもそも管理者権限で動いていることが意識されず、万が一の場合に被害拡大につながるおそれがあります。

##対策
インストーラ自体がこういった問題を孕んでいるかどうか、事前に確かめることは困難です。そのため、管理者権限での不用意なプロセス実行を防ぐことを考えます。

* 予めブラウザを起動した状態でインストールを行う  
    * 実行中のブラウザが既にあれば、新規プロセスを起動する代わりに、既存ブラウザ上のタブで新しいページが開かれるためです  
    ※ただし、ブラウザ本体と競合するソフトの場合はブラウザを終了させざるを得ません。こういった場合の対策は不明です。
* インストール完了時に、インストーラ上で「ReadMeを表示する」「(ソフト本体)を起動する」といった項目を無効にする ( チェックしない )
* もしインストール完了時に何らかのプロセス ( 画面 ) が起動した場合は、一旦終了させてから、改めて必要に応じて起動させる。

##検証を行ったソフトウェア
* 影響あり ( 管理者権限のプロセスが残る )
    * PDF24 Creator 7.4.1 ( ブラウザによるWebサイト表示 )
    * Primo PDF 5 ( ブラウザによるWebサイト表示 )
    * はがき作家 9 Free ( ソフトウェア本体の起動 )
* 影響なし ( 残ったプロセスはユーザ権限 )
    * Adobe Flash Player 20 NPAPI版 ( ブラウザが起動されるがユーザ権限での実行となる )
    * PDF-XChange Viewer 2.5.315.0 ( ソフトウェア本体を起動してもユーザ権限での実行となる )

※ソフトウェアの選定基準は特にありません。( どれが怪しい/怪しくないと目星をつけることもできないため )  
※他のソフトウェアで同様の問題を発見した場合の対処 ( どこに報告する、等 ) は特に定めておりませんが、本記事へのコメントの形で情報を頂けると嬉しいです。
#詳細 ( 開発者向け )
私自身はWindows用ソフトウェアの開発経験がないため、詳細は把握できておりませんが、調査した範囲の情報と推測を以下に記載します。

##インストーラでの権限の制御
インストーラから何らかのプロセスを起動する動作は、「カスタムアクション」と言われているようです。カスタムアクションは、実行タイミングや形態によって幾つか分類があるようですが、それぞれでユーザ権限 ( ユーザコンテキスト ) か、管理者権限 ( システムコンテキスト ) かを選べるようになっているようです。

例えばInstallShieldでは、“～ in system context”というオプションを指定しない場合はユーザ権限でカスタムアクションが実行されるようです。次のヘルプを参照ください。
http://helpnet.installshield.com/isxhelp22/helplibrary/ActionExecutionOptions.htm

また、Windows Installerではカスタムアクションのデフォルトはユーザ権限であり、明示的にmsidbCustomActionTypeNoImpersonateをセットしない限り原則として管理者権限では動作しないようです。詳細は、以下のMSDNのページを参照してください。
https://msdn.microsoft.com/ja-jp/library/aa368073%28v=vs.85%29.aspx

##Microsoftのガイドライン
このInstallerでのカスタムアクションに対するMicrosoftのガイドラインがありました。
https://msdn.microsoft.com/ja-jp/library/aa368778%28v=vs.85%29.aspx

該当箇所を抜粋すると次の通りです。
> Carefully consider whether to use custom actions that use elevated privileges or impersonation.

ここで、“use elevated privileges”は管理者権限を、“impersonation”はユーザ権限を使うことにそれぞれ対応します。
然るに、インストーラから起動されるプロセス ( ブラウザであったり、ソフト本体であったり ) の権限をどのように設計するかはインストーラ作成者の責任であり、本件に該当するソフトではその設計が不適切だった、と考えています。

ぜひ、Windows用のソフトウェア開発に関わる方には、権限の設計にもご留意願いたいと思います。

#検証例
以下では、実際の動作権限や具体的な影響を検証した結果を記載します。

##使用したソフトウェア
* Windows 10 Home x64版
* Mozilla FireFox 42.0 ( 既定のブラウザとして )
* [Process Explorer](https://technet.microsoft.com/ja-jp/sysinternals/processexplorer.aspx) ( 高機能タスクマネージャーとして )
* PDF24 Creator 7.4.1 インストーラ
* はがき作家 9 Free

##Webサイトを開く例 ( PDF24 Creator )
###インストール動作の検証
* インストーラ起動時に、UACにより管理者権限を指定します。このこと自体は已むを得ません  
![pc7-inst-01.png](https://qiita-image-store.s3.amazonaws.com/0/74396/6f7e0cd0-0fe7-0ed8-f589-9d31f4681021.png)
* そしてインストール後にベンダのサイトが表示されますが、起動されたブラウザの権限はインストーラと同じ管理者権限 ( IL High ) になっています  
![pc7-inst-02.png](https://qiita-image-store.s3.amazonaws.com/0/74396/143d6818-71de-d9c6-f820-e0aed63e644f.png)
* この状態で、システムフォルダ ( 画像では“C:\Program Files”以下 ) を指定してファイルの保存を試してみます  
![pc7-inst-03.png](https://qiita-image-store.s3.amazonaws.com/0/74396/d1b32cfb-9b68-637d-5b45-653cb1ba05c0.png)![pc7-inst-04.png](https://qiita-image-store.s3.amazonaws.com/0/74396/656e901d-0841-e5f7-a077-6a623e0f2be5.png)
* そうすると、システムフォルダであるにも関わらず、保存できてしまいます  
![pc7-inst-05.png](https://qiita-image-store.s3.amazonaws.com/0/74396/3d4a65be-3950-a663-c718-3c29ba2661db.png)

###通常の動作
* インストーラ経由ではなく、通常の操作でブラウザを起動した場合です。ユーザ権限 ( IL Medium ) であることが確認できます  
![pc7-inst-06.png](https://qiita-image-store.s3.amazonaws.com/0/74396/57aed25e-73a7-c48b-fe90-745b61d0ced7.png)
* この状態で、同様にシステムフォルダへのファイルの保存を試してみます  
![pc7-inst-07.png](https://qiita-image-store.s3.amazonaws.com/0/74396/f767a0a7-492a-09ec-9b82-d0ef47c44273.png)  
* 今度は権限不足により拒否されました。こちらの方が想定された動作です。  
![pc7-inst-08.png](https://qiita-image-store.s3.amazonaws.com/0/74396/539a97c2-68eb-737b-6090-d7c449b2193e.png)

###対策を施した場合
* 予めブラウザを起動した状態でインストールを試してみます。  
![pc7-inst2-01.png](https://qiita-image-store.s3.amazonaws.com/0/74396/1c33307c-ebf5-1d1d-e910-1f6a3b3b5f40.png)
* インストール完了後、ベンダのサイトは、起動済みのブラウザの別タブで表示されました。別のブラウザプロセスも起動していませんので、「管理者権限のブラウザが起動する」という問題は回避されています。  
![pc7-inst2-02.png](https://qiita-image-store.s3.amazonaws.com/0/74396/480fb9e6-9481-456f-6d9a-c125594be805.png)

##ソフト本体を起動する例 ( はがき作家 9 Free )
* インストーラ完了時にソフト本体を起動するチェックを入れます ( デフォルトではチェックなしです )  
![hwf9-inst-01.png](https://qiita-image-store.s3.amazonaws.com/0/74396/c6dca20e-1c2d-f8f0-1438-44b35f81a516.png)
* 起動されたプロセスは、管理者権限 ( IL High ) になっています  
![hwf9-inst-02.png](https://qiita-image-store.s3.amazonaws.com/0/74396/b28e5db8-ad37-34da-81c9-dbe2d1316b30.png)


#まとめ
* Windows用ソフトのインストーラには、不必要な管理者権限を使って、プロセスを起動するものがあります
* 管理者権限で起動されるのは、インストール完了時のWebサイト表示用のブラウザや、ReadMe表示のエディタ/ビューア、インストールされたソフトウェア本体等です
* 起動されたソフトが脆弱性やバグを持っている場合、あるいはユーザが誤操作を起こした場合、システム部分にも影響が拡大するおそれがあります
* インストール時に予めブラウザを起動しておく、インストール完了時にソフトを起動するためのチェック項目を無効化するといった対策があります
* インストーラから起動されたプロセスがあった場合、一旦終了させた方が安全です