### Micco's Home Page ### Welcome to Micco's page!!
Sorry, but this web page is written in Japanese.
<English>
■ 更新情報
■ このWebページについて
■ お知らせ
■ ダウンロード
■ DLL のインストール方法
■ SFX の設定例
■ いろいろ
対応ブラウザー
[Internet Explorer] [Firefox] [Opera] [Sleipnir] [Safari] [Google Chrome]
連絡先:Micco
[e-mail]
[→Home]

<公開:Apr.25,2010 最終更新:Sep.5,2010>

MHVI#20100425:
LZH 書庫のヘッダー処理における脆弱性について (2010 年版)

 このページでは, 『LZH 書庫のヘッダー処理における脆弱性について』 (MHVI#20061019) で述べた LZH 書庫等のヘッダー処理における脆弱性について, 2010 年 4 月現在での, 各種ソフト及び UNLHA32.DLL, UNARJ32.DLL, LHMelt (LMLzh32.dll) の対応状況について記述しています。 修正情報等の詳細については各ソフトのドキュメント等を参照してください。


●LZH 書庫のヘッダー処理における脆弱性について

 LZH 書庫のヘッダー処理における脆弱性については, LHA for UNIX 1.14 における CVE-2004-0234 を始めとして, 多くのソフトについて同様の情報が公開され修正が行われているところです。 この脆弱性は, ID 0x01 (ファイル名) や 0x02 (パス名) の拡張ヘッダーに比較的長い名前が格納されていると, スタックやヒープ領域のバッファーオーバーフローが発生してしまうというものです。

 実は, LZH 書庫のヘッダー処理については, ソフトによってはヘッダー読込用バッファーのオーバーフローという同様の古典的で大きな問題が存在します。

 LZH 書庫のヘッダーは, 『基本ヘッダー + 拡張ヘッダー』という構造になっています。 このようなヘッダーに対しての読込処理には, 大きく分けて次の 2 つのタイプが存在します:

  • 比較的最近のソフトに多いもので, それぞれのヘッダーのサイズを事前にチェックした上で, それが収まるサイズのバッファーを動的に確保して読込処理を行う。
  • オリジナルのソースを利用したものなど古いソフトに多いもので, 一定のサイズのバッファーを用意しておいて, そのバッファーにヘッダー全体 (基本ヘッダー + 拡張ヘッダー) を一括して読み込む。

 ここで問題となるのは後者のタイプです。 少し考えれば解りますが, このタイプの処理を行う場合, 用意されているバッファーに収まるサイズのヘッダーであるかどうかの確認が必要となります。 そのチェックを行わなかった場合は CVE-2004-0234 と同様の問題が容易に発生してしまい, たとえ CVE-2004-0234 に対応していたとしても無駄になってしまいます。 過去には CVE-2004-0234 への対応を謳っているソフトの中にも, そのようなものが存在しましたが, 現在では殆どのソフトが修正済みとなっています。

 ところが, このバッファーオーバーフローの問題に対応していたとしても, 後者の処理を採用しているソフトでは, それが新たな問題を発生させる場合があります。 問題が発生するのは『ウイルス対策ソフト』等の場合です。

 多くの対応ソフトでは, バッファーが溢れてしまう大きなサイズのヘッダーが存在した場合, そこで書庫全体に対する処理を打ち切るか, 当該メンバーを無視して次のメンバーの処理に移ります。 通常のソフトであれば, これは別段問題のない無難な処理と言えます。

 それに対して, ウイルス対策ソフト等の場合では この点が大きな問題となります。 対策ソフトが同様の処理を行った場合, 無視されるようなメンバーについては, どのようなファイルが格納されていたとしても検疫等が一切行われないことになります。 もちろん, 展開等を行ってファイルとして作成された時点で検疫・削除等が行われるわけですが, プリビュー等, メモリー上に展開イメージが作成されるような処理の場合には, そのまま当該メンバーが扱われてしまいます。 つまり検疫をすり抜けてしまうわけです。 ゲートウェイ的な言わば防御壁を設置したシステムを採用している場合や, 資産管理などで漏洩等を防ぐために検閲している場合は, 検閲・検疫されずに すり抜けてしまえば それまでです。

 7-Zip や WinRAR 等, 海外起源の比較的メジャーなものを始めとした一部のソフトは, ヘッダー読込については前者の方法を採っているため, サイズにかかわらず正常にヘッダーの読込が可能となっています。 それだけなら良かったのですが, 困ったことに, 書庫への対応が限定的となっていることから, 特に h2 形式ヘッダーについて, サイズ情報と実際に読み込んだヘッダー全体のサイズとの整合性, ヘッダーの CRC, といった改竄等に関する重要なチェック処理が行われません。 なぜか, この 2 つの傾向のセットで存在するソフトが多いのですが, このようなソフトは, ウイルス対策ソフト等でのチェックが行われない場合には, 非常に危険な状況に陥ってしまいます。

 また, (ヘッダー読込に対して) 前者の処理を行っている場合でも, ウイルス対策ソフトの場合は, ヘッダー全体のサイズについてのチェックを行ってほしいところなのですが, 実際には行われないことが多いようです。 例えば, McAfee のアンチウイルス プラス 2010 等では, CVE-2004-0234 系の脆弱性利用が疑われるヘッダーが存在した場合には, Exploit-LHA に類する書庫として検疫・削除を行いますが, ID 0x01, 0x02 の拡張ヘッダーに対してのチェックしか行っていないため, 比較的小さなサイズの拡張ヘッダーを多数用意したような書庫が検疫をすり抜けてしまいます。 CVE-2004-0234 系のものを検疫対象とするのであれば, このような書庫についても同様のものとして扱ってほしいところです。

 上記の例を組み合わせるだけでも, 『多くの対策ソフトの検疫をすり抜ける, バッファーオーバーフローと格納ファイルによる二通りの攻略方法を施した書庫』が出来上がってしまいます。 LZH 書庫を扱う場合については, 名前だけではなく, 大きなサイズのヘッダーを無条件に拒否するようにしたほうが良いのかもしれません。

 各ソフトが採用しているヘッダーの処理方法によって, それぞれ検疫すり抜けパターンが存在しますので, 一覧しておきます:

すり抜けパターン 該当 (代表) ソフト 説    明
7-Zip 型 Microsoft Security Essentials 1.0.1961.0,
F-Secure Anti-Virus 2010 10.00,
AVG Anti-Virus Free 9.0.716

 このタイプでは, 基本, 拡張, それぞれのヘッダー毎に必要な大きさのバッファーを動的確保した上で読込が行われます。 従って, 基本的にサイズによる制限が存在しないことから, 格納ファイルが検疫をすり抜けてしまうこともありません。 このタイプであれば安全と言えます。

 余談ながら, このタイプの場合, 自身に制限が存在しない分『ヘッダー全体のサイズに疎い』という弊害の出てしまう場合があります。
 例えば, VirusScan Enterprise 8.0i では, 上で書いたように CVE-2004-0234 に類するヘッダーが見つかった場合に Exploit-LHA として検疫・削除を行いますが, 『比較的小さめのヘッダーを多数用意して全体として巨大なヘッダーを構築』したようなヘッダーは検疫対象とはなりません。
 しかし, ヘッダー処理でのバッファーオーバーフローの脆弱性をもつソフトに対しては, このような書庫でも CVE-2004-0234 を利用した場合と殆ど同じ手法で攻撃が可能となりますので, 一部抜けがあることになります。
 ただ, これは『CVE-2004-0234 型のヘッダーを検疫対象とするのであれば, もう一方のタイプも検疫対象とすべきなのでは?』といった程度の問題でしかありません。 他のソフトは, そもそも検疫対象とはしていませんので。 反対に, Enterprise 8.0i が検疫対象としているのは, 自身に CVE-2004-0234 方面の脆弱性が存在した経緯が影響しているのでしょう。

LHA for UNIX 型 ESET NOD32 Antivirus 4 4.0.474.9  ここで言う LHA for UNIX は autoconf 版を指します。
 このタイプでは, 基本ヘッダーと拡張ヘッダーそれぞれに 4KB の固定バッファーが用意されていて, ヘッダー毎に, そこへ読込を行います。 4KB を超えるような拡張ヘッダーが存在した場合は, 当該メンバーについての処理を打ち切ります。 基本ヘッダーが 4KB を超えることはありません。
 従って, 4KB を超える拡張ヘッダーの付加された格納ファイルが, 検疫をすり抜けてしまうことになります。
オリジナル型 Norton Internet Security 2011 18.1.0.37,
Norton Internet Security 2010 17.6.0.32,
ウイルスバスター 2011 クラウド 3.0.1303-JPS3001.0275,
ウイルスバスター 2010 17.50.1647.0000,
McAfee アンチウイルス プラス 2010 13.15.117,
Virus Security ZERO 10.0.0058,
avast! Free Antivirus 5.0.507
 『オリジナル』とは LHA.EXE を指します。
 このタイプでは, 4KB の単一固定バッファーが用意されていて, そこへヘッダー全体を一括して読み込みます。 その後, 処理を行う中でヘッダーが 4KB を超えていると判断できた時点で, 当該メンバーの処理を打ち切ります。
 従って, ヘッダーの構造にかかわらず, 全体が 4KB を超えるヘッダーの付加された格納ファイルが, 検疫をすり抜けてしまうことになります。
ヘッダー CRC チェック型 ウイルスバスター 2011 クラウド 3.0.1303-JPS3001.0275,
ウイルスバスター 2010 17.50.1647.0000,
McAfee アンチウイルス プラス 2010 13.15.117,
CA Anti-Virus r8.1 8.1.660.0
 ここに一覧されている製品については, ご丁寧にヘッダー CRC のチェックを行い, 合わないものについては書庫として扱わず, 検疫が行われません。 攻撃書庫は CRC の合っていないことが多いことから, 半分無力となってしまっています。 なにしろ, ここで取り上げた Lhaz, Lhaplus, 7-Zip, WinRAR を始めとして, 意外と多くのソフトが CRC のチェックを行わないのですから…。
例外型 CA Anti-Virus r8.1 8.1.660.0,
 CA Anti-Virus は 7-Zip 型です。 しかし, 冗談のような話ですが, h2 形式に対応していませんので, 昨今の LZH 書庫には無力です。(泣)

一覧されている対策ソフトが, 振り分けられているタイプの処理を行っているとは限りません。 あくまでも『そのタイプの処理を行った場合と同様の挙動を示している』に過ぎません。 例えば, LHA for UNIX 型の処理を行っていたとしても, 十分なサイズのバッファー (ヘッダー単体であれば上限値が存在します。) が確保されていれば, 挙動は 7-Zip 型と同じになります。

●ARJ 書庫のヘッダー処理における脆弱性について

 実は LZH 書庫の場合と同様の問題が ARJ 書庫にも存在します。 むしろ, ヘッダーのサイズに限って言えば形式に限らない問題なのかもしれません。 それはともかく, ARJ 書庫ではファイル名等の情報が基本ヘッダーに SZ 形式で記録されていることから, こと名前に関しては, こちらのほうが深刻と言えます。

 まず, ヘッダー読込に関してですが, LZH 書庫と異なり, ARJ 書庫の場合は動的バッファーを採用した場合でもバッファーオーバーフローの危険があります。 というのも, 上述したように, ファイル名などの名前やコメント情報が SZ 形式で記録されているからです。 もしヘッダーの CRC を確認しなかった場合, 名前を扱おうとした段階で容易にバッファーオーバーフローが発生してしまいます。 幸い, LZH 書庫に対して CRC チェックを全く行っていなかった 7-Zip や WinRAR でも ARJ 書庫に対してはチェックを行うようになっていますので, 問題は発生しません。

 次に, 名前に関してですが, (拡張ヘッダーの) サイズ情報と SZ 形式という違いはあれども CVE-2004-0234 と同様の問題が発生する可能性があり, 実際この部分でバッファーオーバーフローの発生してしまうソフトが存在します。

 さらに, ここでも多くの対策ソフトが検疫を行ってくれません。 後述する ZIP 書庫については, 最近ようやく CVE-2010-0098 が公開されるなどして, 殆どのソフトが対応済みですが, ARJ 書庫については未だに多くのソフトが未対策のままです。 面白いことに, CVE-2010-0098 の脆弱性に該当し対応を行ったソフトについては, ARJ 書庫についても しっかり修正されています。

 ARJ 書庫についても, 各ソフトのバッファーサイズの違いにより, LZH 書庫と同様の問題が発生しますので, 一覧しておきます。 総じて小さめのヘッダーしか扱えないことから, テストデーター自体がオリジナルの限界サイズとの差が小さい点に注意してください:

すり抜けパターン 該当 (代表) ソフト 説    明
動的確保型 ESET NOD32 Antivirus 4 4.0.474.9,
Virus Security ZERO 10.0.0058,
CA Anti-Virus r8.1 8.1.660.0,
avast! Free Antivirus 5.0.507
 LZH 書庫の場合と同様, 動的にバッファーを確保して読込を行っていると考えられますが, テストデーター自体が比較的小さなヘッダー (それでもメジャーどころのアーカイバー等が全滅する程度の大きさ。) となってしまっているため, 大きめのバッファーを採用しているソフトが, ここに該当してしまっている恐れがあります。
 ここに該当するソフトは, 他に比べて, より安全と言えます。
7-Zip 型 McAfee アンチウイルス プラス 2010 13.15.117  このタイプでは, オリジナルより僅かに大きい 2.5KB 超の固定バッファーが用意されていて, そこへ基本ヘッダーを読み込みます。 拡張ヘッダーについては, バッファーへの読込を行わず単純にスキップしていると思われますが, Win 環境で作成された書庫には拡張ヘッダーが存在しないため, 詳細は判りません。
 従って, 基本ヘッダーが約 2.5KB を超えるヘッダーの付加された格納ファイルが, 検疫をすり抜けてしまうことになりますが, 多くのソフトと同等のバッファーであることから, 比較的安全と言えるかもしれません。
オリジナル型 Microsoft Security Essentials 1.0.1961.0,
ウイルスバスター 2011 クラウド 3.0.1303-JPS3001.0275,
ウイルスバスター 2010 17.50.1647.0000,
F-Secure Anti-Virus 2010 10.00,
AVG Anti-Virus Free 9.0.716
 『オリジナル』とは UNARJ.EXE を指します。
 このタイプでは, 2.3KB 前後の固定バッファーが用意されていて, そこへ基本ヘッダーを読み込みます。 拡張ヘッダーについては, バッファーへの読込を行わず単純にスキップします。
 従って, 基本ヘッダーが 2.3KB を超えるヘッダーの付加された格納ファイルが, 検疫をすり抜けてしまうことになります。 7-Zip 型と僅かな違いではありますが, 7-Zip を始めとした一部のソフトが扱える書庫の検疫が出来ないため, 少々安全性に劣ります。
オリジナル未満型 Norton Internet Security 2011 18.1.0.37,
Norton Internet Security 2010 17.6.0.32
 『オリジナル』とは UNARJ.EXE を指します。
 このタイプでは 2.3KB 未満の固定バッファーしか用意されていず, オリジナルを含む多くのソフトが扱える書庫の検疫が出来ないなど, 影響が相当大きいものとなっています。
ヘッダー CRC チェック型 Microsoft Security Essentials 1.0.1961.0,
ウイルスバスター 2011 クラウド 3.0.1303-JPS3001.0275,
ウイルスバスター 2010 17.50.1647.0000,
F-Secure Anti-Virus 2010 10.00,
AVG Anti-Virus Free 9.0.716
 ここに一覧されている製品については, ヘッダー CRC のチェックを行い, 合わないものについては書庫として扱わず, 検疫が行われません。 LZH 書庫と異なり ARJ 書庫では殆どのソフトがヘッダーの CRC チェックを行いますが, ソフトの性格上, CRC の合わないメンバーについても検疫してほしいところです。
固定項目長型 F-Secure Anti-Virus 2010 10.00  F-Secure Anti-Virus 2010 は, ヘッダーがバッファーのサイズに収まったとしても, 長いファイル名の記録されていた場合には検疫が行われません。 (オリジナルを始めとして, ARJ 書庫対応ソフトでは, そのような場合にファイル名を指定して展開出来るものが意外と多い。)

●ZIP 書庫のヘッダー処理における脆弱性について

 ZIP 書庫においても, ファイル名等の名前が 64KB まで記録できる仕様となっていますので, LZH や ARJ 書庫と同様, 問題の発生が考えられます。 こちらについては, 最近ようやく CVE-2010-0098 が公開されるなどして, 殆どのソフトが対応済みとなっています:

すり抜けパターン 該当 (代表) ソフト 説    明
直接取得型 Microsoft Security Essentials 1.0.1961.0,
Norton Internet Security 2011 18.1.0.37,
Norton Internet Security 2010 17.6.0.32,
ウイルスバスター 2011 クラウド 3.0.1303-JPS3001.0275,
ウイルスバスター 2010 17.50.1647.0000,
McAfee アンチウイルス プラス 2010 13.15.117,
ESET NOD32 Antivirus 4 4.0.474.9,
Virus Security ZERO 10.0.0058,
F-Secure Anti-Virus 2010 10.00,
CA Anti-Virus r8.1 8.1.660.0,
AVG Anti-Virus Free 9.0.716,
avast! Free Antivirus 5.0.507
 このタイプでは, (単一) ヘッダー全体ではなく, ヘッダー内の項目毎にバッファーへ読み込むか, 直接情報を取得します。 バッファーは動的, 若しくは仕様上最大となる 64KB (+ α) 固定のものが使用されることから, 基本的にサイズの制限が存在しませんので, 格納ファイルが検疫をすり抜けてしまうこともありません。 このタイプであれば安全と言えます。
固定項目長型 該当なし  このタイプでは, バッファー等については動的確保を行っているなど, すり抜けに繋がる処理とはなっていませんが, 当該ソフトの既定値を超えた長さの名前が記録されているなどの場合に, 処理を打ち切ってしまいます。 そういった意味では, 『ヘッダーのサイズ』ではなく『項目のサイズ』に制限のあるタイプといえます。
 従って, メンバー名の偽装を行ったものなど (ヘッダーの CRC が存在しませんので容易に行えます。), 簡単に格納ファイルの検疫すり抜けが発生してしまいます。

●UNLHA32.DLL

 巨大なヘッダーによるバッファーオーバーフロー発生の脆弱性については対応が行われており, 次のような処理を行います:

  • 4KB を超えるヘッダーを扱えない (当該メンバーを無視する) ウイルス対策ソフトが存在したことから, 構造に関わりなく全体が 4KB を超えるヘッダーについては, 破損ヘッダー (Exploit LHA) として扱われます。 ちなみに, 4KB というのはオリジナルの LHA が用意していたバッファーのサイズで, 比較的多くのソフトが, このサイズを, そのまま採用しています。
  • ID 0x01, 0x02 等の拡張ヘッダーについては, 512 文字を超えた名前が記録されていた場合には, 破損ヘッダー (Exploit LHA) として扱われます。
  • メンバー名の改竄や隠蔽を意図したと思われるヘッダーサイズとデーターサイズの不整合については, 破損ヘッダー (Exploit LHA) として扱われます。

●UNARJ32.DLL

 巨大なヘッダーによるバッファーオーバーフロー発生の脆弱性については, 元々 UNARJ.EXE が既定のバッファーサイズを超えるものをヘッダーとして扱わないようになっていることから対応済みといえ, 次のような処理を行います:

  • 既定のサイズ (3KB 弱) を超えるヘッダーについては, ヘッダーとして扱われません。
  • CVE-2004-0234 と同様の名前情報に関する脆弱性は対応が行われています。
  • LZH 書庫と異なり, 特にメンバー名の改竄や隠蔽を想定した特殊なチェック処理は行っていません。 UNARJ32.DLL は該当しませんが, CRC チェックを行わないようなソフトの場合は, この方面の危険性が存在すると思われます。

●LHMelt (LMLzh32.DLL)

 巨大なヘッダーによるバッファーオーバーフロー発生の脆弱性については対応が行われており, 次のような処理を行います:

  • 4KB を超えるヘッダーを扱えない (当該メンバーを無視する) ウイルス対策ソフトが存在したことから, 構造に関わりなく全体が 4KB を超えるヘッダーについては, 破損ヘッダー (Exploit LHA) として扱われます。 ちなみに, 4KB というのはオリジナルの LHA が用意していたバッファーのサイズで, 比較的多くのソフトが, このサイズを, そのまま採用しています。
  • ID 0x01, 0x02 等の拡張ヘッダーについては, 512 文字を超えた名前が記録されていた場合には, 破損ヘッダー (Exploit LHA) として扱われます。
  • メンバー名の改竄や隠蔽を意図したと思われるヘッダーサイズとデーターサイズの不整合については, 破損ヘッダー (Exploit LHA) として扱われます。

更新履歴

  • 脆弱性情報の公開 [Apr.25,2010]
  • Norton Internet Security 2011 の情報を追加 [Aug.29,2010]
  • ウイルスバスター 2011 クラウドの情報を追加 [Sep.5,2010]
[→Page top] [→Home]