WiX Toolsetでフォルダの権限を適切に設定するには - 2020-12-29 - ククログ

ククログ

株式会社クリアコード > ククログ > WiX Toolsetでフォルダの権限を適切に設定するには

WiX Toolsetでフォルダの権限を適切に設定するには

XMLからMSIパッケージを作成するためのフリーソフトウェアとしてWiX Toolsetというものがあります。 簡単に導入できるようにダウンロードページにはVisual Studio向けの拡張へのリンクも提供されています。

今回は、WiX Toolsetでフォルダの権限を<Permissioon>を使って適切に設定する方法を紹介します。 なお、WiX Toolsetの対象バージョンは、この記事を書いている時点の最新版の3.11.2とします。

フォルダのアクセス権限が不適切になる例

通常インストーラを起動するとC:\Program Filesなど、標準のフォルダへとインストールします。 フォルダのアクセス権限が不適切になるのは、インストール先をC:\Program Filesから変更した場合です。

具体的な例をみてみましょう。 Fluentdの配布パッケージであるtd-agentは既定で c:\opt\td-agentにパッケージをインストールします。

このときのフォルダへのアクセス権限は以下のようになっています。4.0.1の場合です。(4.1.0では権限に関する問題は修正済みです)

PS C:\> icacls.exe .\opt\td-agent\bin\
.\opt\td-agent\bin\ BUILTIN\Administrators:(I)(OI)(CI)(F)
                    NT AUTHORITY\SYSTEM:(I)(OI)(CI)(F)
                    BUILTIN\Users:(I)(OI)(CI)(RX)
                    NT AUTHORITY\Authenticated Users:(I)(M)
                    NT AUTHORITY\Authenticated Users:(I)(OI)(CI)(IO)(M)

これの何が問題かというと、NT AUTHORITY\Authenticated Usersに修正の権限が付与されています。 つまり、ログインしたユーザーはc:\opt\td-agent\bin以下など、任意のファイルを書き換えることができるということです。

標準のフォルダにインストールした場合には、このようなことにはなりません。

4.0.0ではFluentdをサービスとして起動させるには手動でサービスとして登録する必要がありましたが、4.0.1ではFluentdのサービスが自動起動するようになっています。 したがって、仮に悪意があるユーザーがファイルを書き換えた場合には、何もせずともSYSTEM権限で任意のコードが実行できてしまうことになります。

これが CVE-2020-28169 となった要因です。

CVE-2020-28169への対策

対策としては誰でも書き換えられないように読み取りと実行のみに制限するというものがあります。

これをWiX Toolkitで実現するのが <Permission> 要素です。

<Directory Id="PROJECTLOCATION" Name="td-agent">
  <Component Id="TDAgentAcl" Guid="b0504030-258a-0139-ba33-7085c2f4281d">
    <CreateFolder>
      <!--
        Read/Execute: Builtin Users
        All:: Builtin Administrators, Service, System account(by default)
      -->
      <Permission User="Users" GenericExecute="yes" GenericRead="yes" Traverse="yes"/>
      <Permission User="Administrators" GenericAll="yes" Traverse="yes"/>
      <Permission User="NT SERVICE\TrustedInstaller" GenericAll="yes" Traverse="yes"/>
      <Permission User="CREATOR OWNER" GenericAll="yes" Traverse="yes"/>
     </CreateFolder>
   </Component>
 </Directory>
</Directory>

同様のことを実現するのに、 <PermissionEx> という要素もありますが、SDDLで記述することになるので、よほど細かく制御したい用途でなければ <Permission> 要素で充分でしょう。

上記を適用すると、アクセス権限は以下のようになります。

PS C:\> icacls.exe .\opt\td-agent\bin\
.\opt\td-agent\bin\ BUILTIN\Users:(OI)(CI)(RX)
                    BUILTIN\Administrators:(OI)(CI)(F)
                    NT SERVICE\TrustedInstaller:(IO)(CI)(F)
                    NT AUTHORITY\SYSTEM:(F)
                    CREATOR OWNER:(OI)(CI)(F)
                    NT AUTHORITY\SYSTEM:(OI)(CI)(F)

Authenticated Users への変更権限がなくなり、Users は読み取りと実行のみできるようになったことがわかります。 追加でgemを導入するときなど、従来は td-agent-gem をユーザー権限で実行できていたのが、管理者権限がないとできないよう制限されました。

まとめ

今回は、アクセス権限が不適切なものになってしまう事例をもとに、WiX Toolsetでフォルダの権限を適切に設定する方法を紹介しました。