修正されたOperaのバイナリ・プランティング問題みなさん、こんにちは。先日のことですが、Operaブラウザのバージョン11.01がリリースされました。このバージョンではいくつかのセキュリティ問題が修正されているのですが、今回はその中の一つ、Windows版Operaのバイナリ・プランティング問題についてお話しましょう。http://www.opera.com/support/kb/view/985/バイナリ・プランティング問題とは、ソフトウェアの不具合により開発者の想定するものとは異なるDLLやEXEファイルを読み込んでしまう脆弱性のことを指します。バイナリ・プランティングの脆弱性は攻撃者に利用されることで、マルウェア感染を引き起こす危険性があるため注意が必要とされます。昨年後半頃から、さまざまなソフトウェアにバイナリ・プランティングの脆弱性が存在することが確認されており、IPAではこの問題に関する注意喚起を行っています。http://www.ipa.go.jp/about/press/20101111.htmlソフトウェアが必要に応じて外部のDLLファイルをロードしたり、他のソフトウェアを起動するためにEXEファイルを実行したりすることは一般によく行われます。その際に、プログラム中で読み込むDLLファイルやEXEファイルをファイル名だけで指定していた場合、どのディレクトリにそのファイルが存在するのかわかりませんので、Windowsは一定の検索ルールに基づいてそのファイルを探し出し読み込みます。検索対象となるディレクトリと順序は使用するAPI(関数)や環境によって変化しますが、例えばDLLを読み込む際に使用されるLoadLibrary関数は基本的に以下の順序でDLLを検索します。PATH環境変数に設定されているディレクトリ正規のDLLファイルはソフトウェアのインストールディレクトリ(上記1)もしくはWindowsのシステム関連ディレクトリ(上記2,3,4)に存在するため、通常は正しいDLLファイルが読み込まれます。正規のDLLファイルが存在せず、かつカレントディレクトリに同一名称の偽のDLLファイルがあった場合、Windowsはカレントディレクトリ(上記5)まで検索してそれを探し出し、読み込んでしまいます。これがバイナリ・プランティングによる偽DLLファイル読み込みの仕組みです。今回修正されたWindows版Operaのバイナリ・プランティング問題は、カレントディレクトリに存在する偽のEXEファイル「explorer.exe」を実行してしまうというものです。Operaには「メニュー」→「ダウンロード」でダウンロードしたファイルの一覧を表示し、ダウンロードファイルの右クリックで表示されるコンテキストメニューから「フォルダを開く」を選択することで、そのダウンロードファイルのフォルダを表示する機能があります。その際にOperaの中では、次のような関数呼び出しが行われます。...)つまりShellExecute関数を使ってexplorer.exe(エクスプローラ)を起動し、フォルダを表示しているわけですが、このようにShellExecute関数で別のプログラムを起動する場合も前述のDLLと同様にEXEファイルの検索が行われます。ShellExecute関数の検索順序は以下の通りです。PATH環境変数に設定されているディレクトリご覧いただければおわかりでしょうが、ShellExecute関数を使用した場合、Windowsは本来explorer.exeが存在するWindowsディレクトリ(上記4)よりも先に、カレントディレクトリ(上記1)を探します。そのため正規のexplorer.exeがあろうが無かろうが(普通はありますが)、カレントディレクトリにある偽のexplorer.exeを優先してしまいます。OperaはHTMLファイルをダブルクリックして起動した場合、そのHTMLファイルの存在するディレクトリがカレントディレクトリとなりますので、HTMLファイルと同じディレクトリに偽のexplorer.exeが仕掛けられていると、Operaで前述の操作を行ったとたんにその偽explorer.exeが実行することになります。ちなみに最新版のOperaでは、ShellExecute関数を呼び出す直前にカレントディレクトリをOperaのインストールディレクトリに変更することで対策しています。今回ご紹介したようなバイナリ・プランティングの脆弱性は、他の多くのソフトウェアにおいても見受けられます。昨年修正されたLhaplus、Lhasa、XacRettといったアーカイブソフトにも同様の脆弱性が存在しましたし、いまだに修正されていないものも少なからずあります。XP以降の標準機能として導入された「ソフトウェア制限ポリシー(SRP)」です。SRPを使用すれば、設定した標準的なディレクトリ(Windowsのシステム関連ディレクトリやソフトウェアのインストールディレクトリ)以外の場所に存在するDLLのロードやEXEの実行を制限することができます。一度、SRPの有効活用をご検討いただければと思います。http://www.st.rim.or.jp/~shio/winsec/srp/それではみなさん、またお会いしましょう。それぞれ各社・各団体の商標または登録商標です。