This is already fixed in the latest CVS, though I'm not sure of the production version:

[EMAIL PROTECTED] tmp]$ clamscan --block-max test.zip
zip.zip: Archive.ExceededRecursionLimit FOUND

----------- SCAN SUMMARY -----------
Known viruses: 60743
Engine version: devel-20060701
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Time: 1.843 sec (0 m 1 s)
[EMAIL PROTECTED] tmp]$

[EMAIL PROTECTED] wrote:
This zip file (see http://iki.fi/v/tmp/test.zip) created with the below
script (see http://iki.fi/v/tmp/test.create) is treated worse than it could
be by ClamAV.

It doesn't cause ClamAV to run out of memory (applause), but ClamAV would
probably use infinite time inspecting it and doesn't seem to find the virii
(Eicar test virus) buried in it.

It seems ClamAV uses breadth-first search to extract the recursive zip,
rather than depth-first.

F-Prot seems to do depth-first and immediately begins reporting virus
infections.

I suggest the following to treat this sort of malicious .zip's better:
  - use depth-first search (will not help, of course, if the virus is _only_
    in the last leaf of the zip tree)
  - (optionally) bail out on first infection. This zip contains millions of
virii (depending on which parameters you choose in the script), no point in finding them all
  - limit recursion depth / cpu time somehow and decide the zip is malicious
if these limits are met. Searching through all of this zip would possibly take millions of years. Imagine someone sending a few hundred of these to a mail gateway using virus filtering.

Of, course this is not limited to .zip but all archive formats potentially
have the same problem.


---------------------------------------------------------------
# Create test.zip

  f=foo
  mkdir $f
  for i in $(seq 1 10); do
       # create 10 files full of zero
       touch $f/$f-$i;
       perl -e 'truncate "'$f/$f-$i'", 1024**2';
  done
  # add a test virus
  wget http://www.eicar.org/download/eicar_com.zip -O foo/foo.zip
# recursively create a "tree" of zips
  for j in $(seq 1 30); do
      mkdir $j
      zip -9 $j/$j-1.zip $f/$f*
      for i in $(seq 2 20); do ln $j/$j-1.zip $j/$j-$i.zip; done
      f=$j
  done
  zip -9 test.zip $f/$f*
---------------------------------------------------------------



_______________________________________________
http://lurker.clamav.net/list/clamav-devel.html

Reply via email to