にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2016/09/24. 12:36:45.

圧縮ファイルの中の圧縮ファイルの扱い

あらゆるデジタルデータは圧縮可能です。画像や動画のような特定の用途に限った圧縮形式はともかく、汎用的な圧縮形式はアーカイブ機能(複数のファイルを1つのファイルにまとめる機能)も同時に有しています。つまり、複数のファイルを圧縮して、1つの「圧縮ファイル」に格納できるわけです。

ということは、圧縮ファイルの中に圧縮ファイルを含めることもできます。具体的にいえば、ZIP形式のファイルの中に別のZIPファイルを含めることも可能だと。

ZIPの中にZIPを含む圧縮を複数回重ねても、サイズは小さくならない(むしろヘッダの分大きくなる?)ので意味はありません。でも、「アーカイブ」という用途もあることを考えれば、圧縮ファイルの中に圧縮ファイルが含まれる可能性は十分あります。

要するに、3つのZIPファイルを配布するのは手間だから、3つのZIPファイルを再度ZIP形式に圧縮して、1つのZIPファイルとして配布しよう…という考え。これは、よくあると思います。私もたまにします。

さて、代表的なアンチウイルスソフトは、圧縮ファイルの中に含まれているウイルスも検知して駆除してくれます。要するに、ファイルを走査するときに、圧縮ファイルを一時的に展開して調べてくれるんですが。ここで1つ疑問が浮かびます。果たして、何段階まで調べてくれるのか?(^^;) 圧縮ファイルの中の圧縮ファイルの中の圧縮ファイルの中の圧縮ファイル…とかでもちゃんと調べてくれるのか?^^;

まあ、こういうのは再帰的に展開するんだろうと思うので、ZIP形式の制約(があるのかどうかは知らないけど)とか、ファイルシステムの制約に当たるまで、無限に展開するようにプログラムは書かれてるんだろうなーと思った………んですけど、なんかそういうわけでもない可能性もあるようです。

メールサーバ上で添付ファイルのウイルスを駆除してくれるASPの説明によると...

いずれも20段階の圧縮までサポートしています。

…だそうです。(from メールセキュリティASP よくあるご質問 Q2:圧縮ファイルのウイルスを検出できますか?(@ニフティ) via アンチウイルスベンダーがWinnyのCacheフォルダ内のウイルスを駆除しない理由(@高木浩光@自宅の日記)

つまり、21段階目以降の圧縮ファイルの中身は調べませんよ、ということですよね?すると、意図的にウイルスを送りつけたい場合、21段階以上圧縮を重ねれば、サーバのアンチウイルス機能はすり抜けられることになるんじゃ…?

まあ、サーバでブロックできなくても、クライアントPCにアンチウイルスソフトが導入されていれば、直前で(ウイルスの)実行はブロックできるかも知れませんけど。

ZIPはWindowsXPでは圧縮フォルダWindows XP以降のWindowsでは、ZIP形式の圧縮ファイルが標準でサポートされてます。圧縮・展開が楽にできます。ZIPファイルは、ファイルシステム上は他のファイルと同じ「ただのファイル」ですけども、Windowsは「圧縮フォルダ」というような扱いでZIPファイルを表示し、圧縮ファイルに含まれるファイルの情報(名称・サイズ・更新時刻など)を展開することなく参照できるようになってます。

ZIPファイル全体を展開することなく、特定のファイルの中身を直接参照することもできます。(もちろん、裏でWindowsが個別に展開してくれてるわけですが。)

このとき、ZIPファイルの中にZIPファイルが含まれる場合、どういう扱いになるのかな?とちょっと疑問に思ったので実験してみました。
期待した圧縮フォルダ構造(実際は異なる)Windowsが「ZIPファイル」を「圧縮フォルダ」として扱っていることを考えれば、「ZIPファイルの中のZIPファイル」は、「圧縮フォルダの中の圧縮フォルダ」つまり「圧縮フォルダの中のサブフォルダ」という感じで見えるのかなー?と思ったんですよね。(右図のようなイメージ)

ところが、そうではないようでした。^^;

ZIPファイルの中身は、確かに「フォルダの中身を参照する」のと同じように見えるのですが、その中に含まれるZIPファイル(つまり、ZIPファイルの中のZIPファイル。=2段階目以降の圧縮ファイル)の中身を参照しようと思うと、「サブフォルダを開く」ように「階層構造」で表現されるような扱いにはなりませんでした。(下図)

ZIPの中のZIPは、階層構造にはならない。

一時的に(ZIPファイルの中に含まれる特定のファイルだけを)展開させたときと同じ扱いですね。一時的に確保した領域に、選択したZIPファイルを展開して、その中身を表示している感じです。2段階目の圧縮ファイルでも3段階目の圧縮ファイルでも、それぞれ個別に一時領域に展開され、階層構造のようには見えません。

まあ、中身を参照するためには展開する必要があるわけだから、当たり前といえば当たり前のような気もしますけどね。

つまり、エクスプローラからフォルダ階層を開いて(いくような感じで圧縮フォルダを開いて)いって、ダイレクトに奥深くのフォルダにアクセスする…というようなことはできないのですね。

逆に言うと、必ず1段階ずつHDD上に展開されることになるので、その都度アンチウイルスソフトは中身をチェックできるわけだから、安全といえば安全?なのかな?(^^;)
まあ、それ以前に、クライアントに導入されているアンチウイルスソフトが、階層の制限なく圧縮ファイルの中身を走査してくれればいいのかも知れないけど。

※ただ、ZIPの中にZIPが含まれるような複雑な圧縮ファイルの場合、その内部に含まれるファイルは大量である可能性が考えられるので、たとえ1カ所にウイルスが発見されたからといって、大元のZIPファイルをいきなり削除してしまうのは、(必要なデータも一緒に消してしまうという点で)危険な気がします。だから、やっぱり必要最低限の削除で済まそうと思うと、1階層ずつローカルに展開するような展開方法である必要があるのかも知れませんね。

コメント

ウィルスソフトによっては12段までの圧縮にしか対応していない場合もあるそうです。

投稿者 そら : 2006年06月09日 17:37

そらさん、どうもです。
なんで無限に対応できないんですかね? 再帰的に中を読んでいけばいいんだから、むしろ途中で止める方が余計なコードが必要な気がするんですが。^^;;;

投稿者 にしし : 2006年06月09日 23:55

ウイルスチェックのために展開する場合はストレージではなくメモリに展開しているはずなので、無制限だとメモリを使い潰してしまうのでは?
原理的に難しいというより「そこまでしか保証しないよ」というアピールだと思います

投稿者 こひな : 2016年09月22日 13:50

コメント数: 3件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※投稿内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---