読者です 読者をやめる 読者になる 読者になる

GDI+のセキュリティFIXとXCOPYインストール

9月15日付けでGDI+(id:NyaRuRu:20040915#p2)のセキュリティFIXが公開され,Windows Updateでも既に入手可能な状態となっています*1

  • Windows Server 2003 用セキュリティ問題の修正プログラム (KB833987)」
  • 「Microsoft GDI+ 検出ツール (KB873374)」

http://www.microsoft.com/japan/technet/security/bulletin/MS04-028.asp
今回のFIXで注目すべきは「Microsoft GDI+ 検出ツール (KB873374)」の存在です.
http://www.microsoft.com/japan/security/bulletins/200409_jpeg_tool.mspx
http://support.microsoft.com/default.aspx?scid=kb;ja;873374
このプログラムは今回の修正の影響を受けるインストール済みのMicrosoft製のアプリケーションを調査するものです.サードパーティー製のアプリケーションについて調査を行うものではない点には注意が必要でしょう.
サードパーティー製のアプリケーションがGDI+を利用している場合,Windows Updateを行うだけでは修正が不完全となる可能性があります*2.これはGDIPlus.dllの再配布ポリシーに関係しています.GDI+の再配布ファイルに含まれるredist.txtには,以下のような記述があります.

For Windows 2000, Windows Millennium Edition, Windows NT 4.0 and Windows 98, install gdiplus.dll into the private directory of the application not into the system directory.

再配布ファイルはGDIPlus.dllがOSに標準で含まれないWindowsXP以前のOSで必要になります.これらのOSにGDIPlus.dllを導入する場合,DLLはシステムディレクトリではなくアプリケーションのインストール先ディレクトリに導入するように指示されています.このシナリオではWindowsUpdate後もサードパーティー製のアプリケーションは依然としてセキュリティ問題を抱えたままのGDIPlus.dllを使い続ける可能性があります.
このようにアプリケーションのインストール先に依存するDLLを同梱してしまう方法は,XCOPYインストールと呼ばれています.特に .NETアプリケーションで推奨されています.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/xcopywininst.asp
今回のセキュリティFIXはXCOPYインストールのデメリットについて考えてみるひとつの契機となるかもしれません.私も手軽さゆえにMDXのランタイムなどはXCOPYインストールで再配布したいと思うことがあります.DirectPlayやDirectMusicにセキュリティ上の不具合が発見された例もありますが,大抵の修正はアンマネージドなDirectX Runtimeの修正のみで完結しそうという楽観視していたり.そういえばC++でも静的リンクがメインのD3DXに不具合があればアプリケーション単位の対応にならざるを得ないのわけで,現状で既にいくつかのリスクは背負い込んでいるかもしれませんね.
ちなみにレジストリ嫌いを自称するような人にとってXCOPYインストールが推進されているのは明るい状況でしょう.Windowsアプリケーションがインストール時にレジストリを変更する理由の1つが,システムディレクトリにインストールするコンポーネントDLLの依存関係更新だったりします*3.しかし各アプリケーションの「自己責任」コンポーネント管理方式にも今回のような欠点があることはよくよく考慮に入れておく必要があるでしょう.XCOPYインストールに雪崩をうって移行した後に色々な運用上の問題が明らかになって,結局「レジストリというすばらしい集中管理方式」が「再発見」される,なんてことがあるかもしれません.

*1:完全には確認していませんが,WindowsXP SP2には既にこの更新が含まれているようです.

*2:追記:詳細な背景情報が「マイクロソフト セキュリティ情報 (MS04-028) : よく寄せられる質問」に解説されています.

*3:参照カウント方式なので,うっかり"Release"し忘れるとゾンビ化します.