2009-09-22 3 views
47

Ho appena letto su zip bombs, vale a dire file zip che contengono una grande quantità di dati altamente comprimibili (00000000000000000 ...).Come posso proteggermi da una bomba a zip?

All'apertura riempiono il disco del server.

Come posso rilevare un file zip è una bomba lampo prima di decomprimerlo?

UPDATE mi puoi dire come è questo fatto in Python o Java?

+1

Il rapporto di compressione può essere pari a 1000-1: non solo consuma molto spazio sul disco ma richiede anche molto tempo per scrivere l'output. – sharptooth

+1

[domanda relativa a gzip e bzip2] (http://stackoverflow.com/questions/13622706/how-to-protect-myself-from-a-gzip-or-bzip2-bomb). –

risposta

20

Prova questa in 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() 
+5

Almeno con gzip penso che le dimensioni non compresse potrebbero non essere nell'intestazione (quindi potrebbe funzionare con zip, ma non con .tar.gz) – tonfa

+0

@tonfa, grazie per aver menzionato che zipfile non funziona Gestisco il formato zip di gnu. –

+4

IIRC, standard Zip (e ammettiamolo, se si vuole causare un DoS, si seguiranno necessariamente gli standard) consente di eliminare determinate dimensioni dalla directory centrale e dalle intestazioni delle voci. –

4

Se il decompressore ZIP che si utilizza può fornire i dati sulla dimensione originale e compressa, è possibile utilizzare tali dati. Altrimenti, iniziare a decomprimere e monitorare le dimensioni dell'output, se si riduce eccessivamente.

5

controllare un colpo di testa zip prima :)

+2

controlla i commenti nella risposta di Nick Dandoulakis – n611x007

1

Assicurarsi non si utilizza l'unità di sistema per l'archiviazione temporanea. Non sono sicuro che un virusscanner lo verificherà se lo incontra.

Inoltre è possibile visualizzare le informazioni all'interno del file zip e recuperare un elenco dei contenuti. Come fare questo dipende l'utilità utilizzata per estrarre il file, quindi è necessario fornire maggiori informazioni qui

10

lettura sopra la descrizione su Wikipedia -

Nega qualsiasi file compresso che contiene file compressi.
        Usa ZipFile.entries() per recuperare un elenco di file, quindi ZipEntry.getName() per trovare l'estensione del file.
Rifiuta qualsiasi file compresso che contiene file su una dimensione impostata, oppure non è possibile determinare la dimensione all'avvio.
        Durante l'iterazione dei file utilizzare ZipEntry.getSize() per recuperare la dimensione del file.

4

Non consentire al processo di caricamento di scrivere dati sufficienti per riempire il disco, ovvero risolvere il problema, non solo una possibile causa del problema.

19

Zip è, erm, un formato "interessante". Una soluzione efficace consiste nello streaming dei dati e interrompersi quando ne hai abbastanza. In Java, utilizzare ZipInputStream anziché ZipFile. Quest'ultimo richiede anche di memorizzare i dati in un file temporaneo, che non è la più grande delle idee.