------------------------------------------------------------------------
       複数のアーカイブソフトにおけるバイナリ・プランティング問題

                               2010.10.18

                     塩月 誠人 <shio@st.rim.or.jp>

------
 概要
------

以下のアーカイブソフトにはバイナリ・プランティングの脆弱性が存在します。

  - Lhaplus 1.57 およびそれ以前 [1]
  - Lhasa 0.19 およびそれ以前 [2]
  - XacRett #49 およびそれ以前 [3]

この脆弱性により、攻撃者が用意した不正なバイナリファイルを実行してしまう
危険性があるため、これらのソフトウェアの利用者は最新版にアップデートする
ことが推奨されます。

------------------------------
 バイナリ・プランティングとは
------------------------------

プログラムがDLLファイルをロードまたは他のEXEファイルを実行する際に、その
ファイルをパス名なしで指定していた場合、プログラムは使用するAPIの仕様に
基づき特定のディレクトリ(Windowsのシステムディレクトリや当該プログラムが
存在するディレクトリなど)を特定の順序で検索して一致するファイル名のDLLや
EXEを探し出します。その検索箇所には通常、カレントディレクトリも含まれま
す。そのため、システムディレクトリやプログラムのインストールディレクトリ
等の標準的な場所にそのファイルがなかったり、APIの仕様上カレントディレク
トリが先に検索されたりした場合、プログラムはカレントディレクトリに存在す
る同一名称のDLLやEXEをロードあるいは実行してしまいます。

この性質を利用して不正なDLLやEXEファイルを実行させる攻撃手法のことを「バ
イナリ・プランティング(バイナリの植え付け)」といいます(DLLプリローディン
グ、DLLハイジャッキングともいう)。バイナリ・プランティングは決して新しい
攻撃手法ではなく、古くからその問題点は指摘されてきたのですが、今年の8月
頃から多くのソフトウェアにこの脆弱性が存在することが取りざたされ話題に
なっています[4]。

--------------
 脆弱性の詳細
--------------

今回発覚した一連のアーカイブソフトの脆弱性は、カレントディレクトリに存在
する「explorer.exe」を実行してしまうというものです。バイナリ・プランティ
ングというとDLLファイルが対象となる場合が多いのですが、EXEファイルについ
ても同様の問題が発生するので注意が必要とされます。例えばLhaplusやLhasaは、
圧縮ファイルを特定のディレクトリに展開すると同時にエクスプローラでその内
容を表示しますが、その際に、

  WinExec("explorer フォルダ名", ..)

という関数呼び出しを行います。WinExecはコマンドラインに指定されたプログ
ラム「explorer」を探すときに、仕様にしたがって、

  1. アプリケーションがロードされたディレクトリ
  2. カレントディレクトリ
  3. Windowsのシステムディレクトリ
  4. Windowsディレクトリ
  5. 環境変数PATHに記述されている各ディレクトリ

の順に探します[5]。つまり本来explorer.exeが存在するWindowsディレクトリよ
りも先にカレントディレクトリを探してしまうわけですね。ですので、カレント
ディレクトリに攻撃者が用意した不正なexplorer.exeがあった場合、それが代わ
りに起動してしまいます。

実際の攻撃としては、ZIPファイルの中に不正なexplorer.exeとZIPファイルを入
れておき、それをメール添付で送りつける方法などが考えられます。

  A.ZIP --+-- B.ZIP
          |
          +-- explorer.exe

被害者は、まず外側のA.ZIPを解凍します。すると中にあるB.ZIPと不正な 
explorer.exeが同じディレクトリに展開されます。LhaplusやLhasaはZIPファイ
ルをダブルクリックして解凍する場合、ZIPファイルが存在するフォルダがカレ
ントディレクトリになりますので、次にB.ZIPを解凍すると同時にカレントディ
レクトリにある不正なexplorer.exeが自動実行することになります。

XacRettの場合も同様にWinExecでexplorerを起動するのですが、XacRettは展開
先のディレクトリをカレントディレクトリに設定してからWinExecを呼び出して
いるため、A.ZIPを解凍した直後にその中にあるexplorer.exeを実行します。

----------
 対策状況
----------

本件については今年9月にIPAに対し「ソフトウェア製品脆弱性関連情報」として
届出を行い、各ソフトウェアの開発者から以下の修正版がリリースされています。

  - Lhaplus 1.58 [6]
  - Lhasa 0.20 [7]
  - XacRett #50 [8]

LhaplusとLhasaは今回の修正で、explorer.exeをフルパスで起動するように変更
されました(Lhaplusには不正なDLLをロードしてしまう問題もありましたが、そ
れについても修正されています)。またXacRettは、カレントディレクトリをイン
ストールフォルダに設定してからWinExecを呼び出すように修正されました。い
ずれも修正後の最新バージョンではこの問題は発生しませんので、もしこれらの
アーカイブソフトを使用している場合は早急に最新版にアップデートすることが
推奨されます。

ちなみにこのように不正なEXEを実行するタイプのバイナリ・プランティングは、
DLLの場合とは異なり、マイクロソフトが回避策の一つとして提供している
「CWDIllegalInDllSearch」の設定[9]では回避できませんので注意が必要です。

また同様の脆弱性は他のアーカイブソフトでも発生する可能性があります。自動
的にエクスプローラを起動するタイプのアーカイブソフトは特に危険性が高いた
め、お使いの製品について一度確認されることをお勧めします。

------
 参考
------

[1]  JVN#18774708
     Lhaplusにおける実行ファイル読み込みに関する脆弱性
     http://jvn.jp/jp/JVN18774708/index.html

[2]  JVN#88850043
     Lhasaにおける実行ファイル読み込みに関する脆弱性
     http://jvn.jp/jp/JVN88850043/index.html

[3]  JVN#04665167
     XacRettにおける実行ファイル読み込みに関する脆弱性
     http://jvn.jp/jp/JVN04665167/index.html

[4]  JVNTA10-238A
     Microsoft WindowsにおけるDLL読み込みに関する脆弱性
     http://jvn.jp/cert/JVNTA10-238A/index.html

[5]  WinExec
     http://msdn.microsoft.com/ja-jp/library/cc429435.aspx

[6]  Lhaplus
     http://www7a.biglobe.ne.jp/~schezo/

[7]  Lhasa
     http://www.digitalpad.co.jp/~takechin/download.html#lhasa

[8]  XacRett
     http://www.kmonos.net/lib/xacrett.ja.html

[9]  A new CWDIllegalInDllSearch registry entry is available to control
     the DLL search path algorithm
     http://support.microsoft.com/kb/2264107
------------------------------------------------------------------------