web-dev-qa-db-ja.com

どうすればZip爆弾から身を守ることができますか?

Zip bombs 、つまり非常に大量の高圧縮性データ(00000000000000000 ...)を含むZipファイルについて読んだばかりです。

開くと、サーバーのディスクがいっぱいになります。

ZipファイルがZip爆弾であることを検出するにはどうすればよいですかbefore解凍しますか?

[〜#〜] update [〜#〜]これがPythonまたはJavaでどのように行われるか教えていただけますか?

51
flybywire

Pythonでこれを試してください:

import zipfile
z = zipfile.ZipFile('c:/a_Zip_file')
print 'total files size=', sum(e.file_size for e in z.infolist())
z.close()
22

Zipは、えーと、「興味深い」フォーマットです。堅牢なソリューションは、データをストリーミングして、十分な量になったら停止することです。 Javaでは、ZipInputStreamではなくZipFileを使用します。後者では、データを一時ファイルに保存する必要もありますが、これも最高のアイデアではありません。

19

ウィキペディアの説明を読む-

圧縮ファイルを含む圧縮ファイルをすべて拒否します。
ZipFile.entries() を使用してファイルのリストを取得し、次に ZipEntry.getName() を使用してファイル拡張子を検索します。
設定されたサイズを超えるファイルを含む圧縮ファイルを拒否するか、起動時にサイズを決定できません。
ファイルを反復処理するときに、 ZipEntry.getSize() を使用してファイルサイズを取得します。

11

最初にZipヘッダーを確認してください:)

5

アップロードプロセスがディスクをいっぱいにするのに十分なデータを書き込むことを許可しないでください。つまり、問題の考えられる原因の1つだけでなく、問題を解決してください。

5
Pete Kirkham

使用するZipデコンプレッサが元のサイズと圧縮サイズのデータ​​を提供できる場合は、そのデータを使用できます。それ以外の場合は、解凍を開始し、出力サイズを監視します-大きくなりすぎる場合は、緩めます。

4
sharptooth

システムドライブを一時ストレージに使用していないことを確認してください。ウイルススキャナーが検出した場合にチェックするかどうかはわかりません。

また、Zipファイル内の情報を確認して、コンテンツのリストを取得することもできます。これを行う方法は、ファイルの抽出に使用されるユーティリティによって異なるため、ここで詳細情報を提供する必要があります

1
Heiko Hatzfeld