SPN通信 2011年1月31日

修正されたOperaのバイナリ・プランティング問題


みなさん、こんにちは。 SPNの塩月です。

つい先日のことですが、Operaブラウザのバージョン11.01がリリースされました。このバージョンではいくつかのセキュリティ問題が修正されているのですが、今回はその中の一つ、Windows版Operaのバイナリ・プランティング問題についてお話しましょう。

  Advisory: The wrong executable may be used to display a downloaded file in its folder
  http://www.opera.com/support/kb/view/985/
バイナリ・プランティング問題とは、ソフトウェアの不具合により開発者の想定するものとは異なるDLLやEXEファイルを読み込んでしまう脆弱性のことを指します。バイナリ・プランティングの脆弱性は攻撃者に利用されることで、マルウェア感染を引き起こす危険性があるため注意が必要とされます。昨年後半頃から、さまざまなソフトウェアにバイナリ・プランティングの脆弱性が存在することが確認されており、IPAではこの問題に関する注意喚起を行っています。
  任意のDLL/実行ファイル読み込みに関する脆弱性の注意喚起
  http://www.ipa.go.jp/about/press/20101111.html
ソフトウェアが必要に応じて外部のDLLファイルをロードしたり、他のソフトウェアを起動するためにEXEファイルを実行したりすることは一般によく行われます。その際に、プログラム中で読み込むDLLファイルやEXEファイルをファイル名だけで指定していた場合、どのディレクトリにそのファイルが存在するのかわかりませんので、Windowsは一定の検索ルールに基づいてそのファイルを探し出し読み込みます。

検索対象となるディレクトリと順序は使用するAPI(関数)や環境によって変化しますが、例えばDLLを読み込む際に使用されるLoadLibrary関数は基本的に以下の順序でDLLを検索します。

  LoadLibrary関数の検索順序
  -------------------------------------------
  1. ソフトウェアの起動元ディレクトリ
  2. Windows\System32ディレクトリ
  3. Windows\Systemディレクトリ
  4. Windowsディレクトリ
  5. カレントディレクトリ
  6. PATH環境変数に設定されているディレクトリ
正規のDLLファイルはソフトウェアのインストールディレクトリ(上記1)もしくはWindowsのシステム関連ディレクトリ(上記2,3,4)に存在するため、通常は正しいDLLファイルが読み込まれます。しかし正規のDLLファイルが存在せず、かつカレントディレクトリに同一名称の偽のDLLファイルがあった場合、Windowsはカレントディレクトリ(上記5)まで検索してそれを探し出し、読み込んでしまいます。これがバイナリ・プランティングによる偽DLLファイル読み込みの仕組みです。

一方、今回修正されたWindows版Operaのバイナリ・プランティング問題は、カレントディレクトリに存在する偽のEXEファイル「explorer.exe」を実行してしまうというものです。

Operaには「メニュー」→「ダウンロード」でダウンロードしたファイルの一覧を表示し、ダウンロードファイルの右クリックで表示されるコンテキストメニューから「フォルダを開く」を選択することで、そのダウンロードファイルのフォルダを表示する機能があります。その際にOperaの中では、次のような関数呼び出しが行われます。

  ShellExecute(NULL, NULL, "explorer.exe", "ダウンロードファイル", ...)
つまりShellExecute関数を使ってexplorer.exe(エクスプローラ)を起動し、フォルダを表示しているわけですが、このようにShellExecute関数で別のプログラムを起動する場合も前述のDLLと同様にEXEファイルの検索が行われます。ShellExecute関数の検索順序は以下の通りです。
  ShellExecute関数の検索順序
  -------------------------------------------
  1. カレントディレクトリ
  2. Windows\System32ディレクトリ
  3. Windows\Systemディレクトリ
  4. Windowsディレクトリ
  5. 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といったアーカイブソフトにも同様の脆弱性が存在しましたし、いまだに修正されていないものも少なからずあります。

  複数のアーカイブソフトにおけるバイナリ・プランティング問題
  http://www.st.rim.or.jp/~shio/advisories/binary_planting/bp_archiver.txt
それではどうやってこのような脆弱性によるマルウェア感染を防げばよいのでしょうか?

防御策の一つとして非常に有効であると考えられるのが、Windows XP以降の標準機能として導入された「ソフトウェア制限ポリシー(SRP)」です。SRPを使用すれば、設定した標準的なディレクトリ(Windowsのシステム関連ディレクトリやソフトウェアのインストールディレクトリ)以外の場所に存在するDLLのロードやEXEの実行を制限することができます。ぜひ一度、SRPの有効活用をご検討いただければと思います。

  Windowsセキュリティ・ワンポイントレッスン
  第3回 ソフトウェア制限ポリシーによるマルウェア対策
  http://www.st.rim.or.jp/~shio/winsec/srp/
それではみなさん、またお会いしましょう。

合同会社セキュリティ・プロフェッショナルズ・ネットワーク
代表社員 塩月誠人