MHVI#20040917:
『指定外の場所へファイルが展開されてしまう脆弱性』の問題について
7 月末の『窓の杜』でのNews記事等をきっかけとして, 広く一般に認知されるに至った『指定外の場所へファイルが展開されてしまう脆弱性』の問題ですが, ソフト側の対応もある程度進み, 対処方法の情報についても得られるようになってきたものの, 現在でも比較的多くの方から問い合わせがきています。
このページでは, UNLHA32.DLL, UNARJ32.DLL の対応状況と, LHMelt と LHMeltが利用している各アーカイバー DLL での対応状況について記述しています。 詳細については各ソフトのドキュメント等を参照してください。
●UNLHA32.DLL
Ver 1.91 で対応を行い, 危険性を伴うようなパスについてのチェックを行うようになっていますが, 別の問題 (そのチェックルーチンにバッファー溢れのバグ。) が存在するため, Ver 1.91f 以降を使用するようにしてください。 次の処理を行います:
- "../../file.bin" といったような基準ディレクトリーを越えて遡る不正なパス情報をもったメンバーについては, 警告表示が行われ, 「パスを指定して展開する」「当該ファイルの展開を行わない」「以降, 同様の問題のあるメンバーすべての展開を行わない」「エラー扱いとして処理を終了する」の選択が行えます。
- "/path/file.bin" といった絶対パスをもつメンバーについては, 警告表示が行われ, 「以降, 絶対パスを正常なものとして扱い, そのまま展開する」「以降, 相対パスに変換して展開する」「以降, 不正なパスとして扱い, 上記の不正パスの処理を行う」「エラー扱いとして処理を終了する」の選択が行えます。
- 拡張子の偽造が疑われる連続したスペース (既定では 8 文字以上。) を含むパス情報をもったメンバーについては, 上記の不正なパス情報をもったメンバーとして扱われます。 Ver 1.99c 以降で有効となります。
- (ユーザーがスイッチを指定した場合) 既定, もしくはユーザーが個別に指定した拡張子をもつメンバーについては, 実行可能ファイルとして警告表示が行われ, 「展開する」「当該ファイルの展開を行わない」「以降, 同様のメンバーすべてを展開する」「以降, 同様のメンバーすべての展開を行わない」「エラー扱いとして処理を終了する」の選択が行えます。 Ver 1.99c 以降で有効となります。
●UNARJ32.DLL
Ver 0.55 で対応を行い, 危険性を伴うようなパスについてのチェックを行うようになっていますが, 別の問題 (そのチェックルーチンにバッファー溢れのバグ。) が存在するため, Ver 0.55b 以降を使用するようにしてください。 次の処理を行います:
- "../../file.bin" といったような基準ディレクトリーを越えて遡る不正なパス情報をもったメンバーについては, 警告表示が行われ, 「パスを指定して展開する」「当該ファイルの展開を行わない」「以降, 同様の問題のあるメンバーすべての展開を行わない」「エラー扱いとして処理を終了する」の選択が行えます。
- "/path/file.bin" といった絶対パスをもつメンバーについては, 警告表示が行われ, 「以降, 絶対パスを正常なものとして扱い, そのまま展開する」「以降, 相対パスに変換して展開する」「以降, 不正なパスとして扱い, 上記の不正パスの処理を行う」「エラー扱いとして処理を終了する」の選択が行えます。
- 拡張子の偽造が疑われる連続したスペース (既定では 8 文字以上。) を含むパス情報をもったメンバーについては, 上記の不正なパス情報をもったメンバーとして扱われます。 Ver 0.60 以降で有効となります。
- (ユーザーがスイッチを指定した場合) 既定, もしくはユーザーが個別に指定した拡張子をもつメンバーについては, 実行可能ファイルとして警告表示が行われ, 「展開する」「当該ファイルの展開を行わない」「以降, 同様のメンバーすべてを展開する」「以降, 同様のメンバーすべての展開を行わない」「エラー扱いとして処理を終了する」の選択が行えます。 Ver 0.60 以降で有効となります。
●LHMelt
Ver 1.34a で対応を行い, 危険性を伴うようなパスについてのチェックを行うようになっています。 次の処理を行います:
- 書庫の一覧を取得する際に, "../../file.bin" "/path/file.bin" といった不正なパスや絶対パスをもつメンバーの有無についてのチェックを行い, そのようなメンバーが存在すれば, DLL 側のチェックの有無にかかわらず, 展開時に警告を行います。
- 即時展開時については, DLL 側でのチェックを行えない場合に限り, 一旦上記と同じチェックを行った上で, 実際の展開処理に移ります。 そのため, 書庫によっては処理時間の増大を招いてしまいます。
- 拡張子の偽造が疑われる連続したスペース (8 文字以上。) を含むパス情報をもったメンバーを関連付け実行しようとした場合に警告を行います。 Ver 1.44 以降で有効となります。
- 既定の拡張子をもつメンバーを関連付け実行しようとした場合に, 実行可能ファイルとして警告を行います。 Ver 1.44 以降で有効となります。
●LHMelt が利用する各アーカイバー DLL
UNLHA32.DLL:
- Ver 1.91 以降については UNLHA32.DLL の項目どおり。
- Ver 1.20 以降については, LHMelt Ver 1.34a 以降であれば, EnumMembersProc 系の API を使用することにより, UNLHA32.DLL の項目と同様のチェックが LHMelt 側で行われます。
- Ver 1.20 未満については DLL 側でのチェックは行われません。 LHMelt Ver 1.34a 以降であれば LHMelt 側で警告のみ行われます。
7-ZIP32.DLL:
- Ver 3.09.01.01 以降については DLL 側でチェックが行われ, 基準ディレクトリーの配下に展開されるよう変換が行われます。
- Ver 3.09.01.01 未満については DLL 側でのチェックが行われませんが, LHMelt が Ver 3.13.00.01 以降を要求するので, 使われることがありません。
- LHMelt Ver 1.36a 以降で使用することができます。
UNZIP32.DLL:
- Ver 5.41 以降については DLL 側でチェックが行われ, "../../file.bin" といったような基準ディレクトリーを越えて遡る不正なパス情報をもったものや, "/path/file.bin" といった絶対パスをもつメンバーについては警告表示を行い, 「展開する」「当該ファイルの展開を行わない」「エラー扱いとして処理を終了する」の選択が行えます。
- Ver 5.41 より前の版では, DLL 側でのチェックは行われません。 LHMelt Ver 1.34a 以降であれば LHMelt 側で警告のみ行われます。
- LHMelt Ver 1.36a 以降であれば, ZIP 書庫の操作を 7-ZIP32.DLL で行うように設定することが可能です。
UNZIP32.DLL + 偽UNZIP32.DLL:
- 偽 UNZIP32.DLL が 内部で 7-ZIP32.DLL を呼び出す方式を採っていることから, Ver 3.09.01.01 以降の 7-ZIP32.DLL を使用していないと意味がありません。
- Ver 3.09.01.01 未満の 7-ZIP32.DLL を使用している場合は, DLL 側でのチェックが行われない上に, (この場合の 7-ZIP32.DLL のバージョンチェックまでは行っていないことから) 即時展開時については LHMelt 側でのチェックも行われません。
偽 UNZIP32.DLL を使用する場合には必ず 7-ZIP32.DLL のバージョンについてのチェックを行ってください。
- LHMelt Ver 1.36a 以降であれば, ZIP 書庫の操作を 7-ZIP32.DLL で行うように設定することが可能です。
CAB32.DLL:
- DLL 側でのチェックは行われません。 LHMelt Ver 1.34a 以降であれば LHMelt 側で警告のみ行われます。
- 絶対パスについては相対パスに変換されます。
CAB32.DLL + DCAB32.DLL:
- DCAB32.DLL によるチェックが行われ, 基準ディレクトリーの配下に展開されるよう変換が行われます。
TAR32.DLL:
- Ver 2.24 以降については DLL 側でチェックが行われ, 基準ディレクトリーの配下に展開されるよう変換が行われます。
- Ver 2.24 未満については DLL 側でのチェックは行われません。 LHMelt Ver 1.34a 以降であれば LHMelt 側で警告のみ行われます。
BGA32.DLL:
- DLL 側でのチェックは行われません。 LHMelt Ver 1.34a 以降であれば LHMelt 側で警告のみ行われます。
- 絶対パスについては相対パスに変換されます。
BGA32.DLL + QBGA32.DLL:
- QBGA32.DLL によるチェックが行われ, 基準ディレクトリーの配下に展開されるよう変換が行われます。
ISH32.DLL:
- ISH32.DLL によるファイル変換では, 今回の問題は発生しません。
UNARJ32.DLL:
- Ver 0.55 以降については UNARJ32.DLL の項目どおり。
- Ver 0.55 未満については DLL 側でのチェックは行われません。 LHMelt Ver 1.34a 以降であれば LHMelt 側で警告のみ行われます。
UNGCA32.DLL:
- 確認できていません。 LHMelt Ver 1.34a 以降であれば LHMelt 側で警告のみ行われます。
UNRAR32.DLL:
- Ver 0.10 以降については DLL 側でチェックが行われ, 基準ディレクトリーの配下に展開されるよう変換が行われます。
- Ver 0.05 以降については, 絶対パスが相対パスに変換されます。 LHMelt Ver 1.34a 以降であれば LHMelt 側で不正パスについての警告のみ行われます。
- Ver 0.05 未満については DLL 側でのチェックが行われませんが, LHMelt が Ver 0.05 以降を要求するので, 使われることがありません。
|