2002年7月,筆者はDCOMの危険性を検証するツール「IE'en」を公開した。このツールは任意のユーザーのログオン情報(ユーザー名とパスワード)を知っていれば,そのユーザーが使っているPCで動作しているInternet Explorer(IE)にネットワーク経由で接続し,そのIEが現在表示しているWebページのURLや,Webサイトに対して送信したパスワードなどの情報が取得できることを明らかにした。

 英国の有名なコンピュータ関連ニュースサイトThe RegisterがIE'enを取り上げたこともあり,ツールを公開した直後からこのツールを実現するためのテクニックについての問い合わせが殺到した。今回,IE'enが利用しているテクニックを,ソースコードを交えて解説したいと思う。

 この解説は,悪意のあるプログラムの作成を支援することを意図していない。実際,IE'enで利用しているテクニックは何ら特別なものではない。米Microsoft社が公開しているDCOMとIEに関する技術情報を参照するだけで,このようなツールを簡単に作成することができることを示し,改めてパスワードの重要性を訴えたいと考えている。

 なお,DCOMを利用してリモートから操作できるプログラムはIEだけではない。筆者は2003年2月に米国シアトルで開かれたセキュリティ・カンファレンスBlack Hat Windows Securityにおいて,Microsoft Officeもまたリモートから操作可能であることを実演し,DCOMの両刃の剣的なマイナス面を訴えた。本記事では,Officeに対するリモートからの呼び出しについても,簡単に紹介しようと思う。

 IE'enはhttp://www.securityfriday.com/ToolDownload/IEen/ieen_doc.htmlからダウンロードできる。IE'enの最新バージョンはVer0.5である(2003年3月現在)。2002年7月に初めて公開したIE'enは,いくつかのアンチウイルス・ベンダにより危険なプログラムの指定を受けた。最新バージョンのIE'enは,今のところウイルス定義ファイルに登録されていないようだが,ダウンロードして実験する際は注意が必要である。

リスト1 IDLの例
図1 COMモデル
図2 DCOMの基本モデル

DCOMとは

 最初に,DCOMとは何かについて簡単に説明しておく。DCOM(Distributed COM)とは,Microsoftが提唱するネットワーク分散型アプリケーションを実現するためのアプリケーション・プロトコルである。DCOMはDCE-RPCをベースに開発され,COMプログラミング・モデルにより作成されたプログラムをネットワーク経由で呼び出す機能を提供する。

 COMとは,Componet Object Modelの略で,Microsoftが提唱するコンポーネント・オリエンテッドなアプリケーション開発を実現するためのプログラミング・モデルである。

 オブジェクト指向において,プログラム・コードの再利用は最も重大な目標の一つである。COMでは,再利用可能なコードをCOMコンポーネントとして管理する。COMコンポーネントは,IDLにより定義されたプログラミング・インタフェースを実装する。IDLはInterface Definition Languageの略で,コンポーネントが実装するメソッドを,プログラミング言語に依存しない形で表現する(リスト1[拡大表示])。

 COMコンポーネントが実装するインタフェースは,COMインタフェースと呼ばれる。COMコンポーネントを利用するアプリケーションは,このインタフェースを介して同じPC上にインストールされたCOMコンポーネントを呼び出す(図1[拡大表示])。COMコンポーネントに実装されたコードを修正する場合,このコンポーネントを利用するアプリケーション全体をアップデートする必要はない。コンポーネントだけをアップデートすれば対応できる。

写真1 レジストリに登録されているCOMコンポーネント
写真2 分散COM構成ユーティリティからDCOMを有効にする。「このコンピュータ上で分散COMを有効にする」をチェックする
写真3 DCOMで使用できるアプリケーションのリスト。写真2と同じツールを使って閲覧できる
 ネットワーク分散型アプリケーションを実現するため,MicrosoftはCOMプログラミング・モデルを拡張した。それがDCOMである。DCOMは,あるPC上のアプリケーションが,別のPCにインストールされたCOMコンポーネントをネットワーク経由で呼び出す機能を提供する。このときアプリケーションはネットワーク上のCOMコンポーネントと通信するための特別なコードを必要としない。アプリケーションはそのCOMコンポーネントがローカルにインストールされているのと同じように呼び出すことができる(図2[拡大表示])。

 各COMコンポーネントは,レジストリ「¥HKEY_CLASSES_ROOT¥CLSID」の配下に登録されている。Regedit.exeなどでこのキーを開いてみると,たくさんのCOMコンポーネントが登録されていることが分かる(写真1[拡大表示])。Windowsシステムは,これら無数のCOMコンポーネントから構成されていると言っても過言ではない。

DCOMで使用可能なアプリケーション

 DCOMはWindows 98以降のすべてのWindowsで,デフォルトでサポートされている。Windows NT 4.0もDCOMをサポートしているが,デフォルトのNTに搭載されているDCOMは正常に動作しないようだ。Service Pack 3以降をインストールすると,正常に動作するようになる。Windows 2000やXPではDCOMがデフォルトで有効になっているが,98やMeでは有効になっていない。DCOMを利用するためには,分散COM構成ユーティリティを使用して手動で有効にする必要がある。

 分散COM構成ユーティリティは,DCOMの機能を設定するためのツールである。コマンドプロンプトからDCOMCNFG.exeと入力することで起動できる。Windows 2000以前のOSの場合は,「規定のプロパティ」タブにある「このコンピュータで分散COMを使う」チェック・ボックスをオンにするとDCOMが有効になる(写真2[拡大表示])。Windows XPでは,このツールのGUIが大きく変更された。左ペインから「マイコンピュータ」を選択し,マウスを右クリックして現れるメニューから「プロパティ」を選ぶと,「規定のプロパティ」タブが表示される。

 このツールを使用すると,DCOMで使用できるアプリケーションのリストを表示できる(写真3[拡大表示])。表示されたリストを眺めると,IEが存在するのが分かる。そのほか,サウンドレコーダーやワードパッドなどあまりネットワーク経由で呼び出して利用するとは思えないプログラムもリストに存在する。Microsoft Officeがインストールされているなら,WordやExcelもリストに現れる。IEもOfficeもCOMコンポーネントであり,呼び出し元のプログラムと別のプロセスで動作することが可能なコンポーネントとして構成されている。これらのコンポーネントはDCOMを使用して,ネットワーク経由で呼び出すことができる。

【おわびと訂正】
記事掲載当初,「COMとは,Component Oriented programming Modelの略で」としましたが,正しくは「Componet Object Modelの略」です。おわびして訂正します。