Actually this topic was covered a while back when there were RAR files masquerading as zip files.

Here's a function I call from filter_bad_filename. I've modified my filter to handle a return of 1 as a bad file and 2 as a really bad file which outright blocks the email.

sub filter_bad_filename ($) {

....


# Look inside ZIP files
 if (re_match($entity, '\.zip$') and $Features{"Archive::Zip"}) {
   my $bh = $entity->bodyhandle();
   if (defined($bh)) {
     my $path = $bh->path();
     if (defined($path)) {
       #CORRUPTED ZIPS ARE DANGEROUS - RETURN A REALLY BAD FILENAME
return 2 if (&check_for_corrupt_zip($path, $entity->head->recommended_filename()));
       return re_match_in_zip_directory($path, $re);
     }
   }
 }
 return 0;
}

sub check_for_corrupt_zip {
 my ($path, $recommended_filename) = @_;

 my ($filehandle, $header);

 #OPEN THE FILE, GRAB THE HEADER AND TEST
 $filehandle = new IO::File("< $path");
 if (defined $filehandle) {
   read($filehandle,$header,4);
   close ($filehandle);

   #IS IT A RAR FILE DISGUISED AS A ZIP?
   if ($header =~ /^Rar!/i) {
md_syslog('warning', "$QueueID: Discarding because of RAR file disguised as ZIP File: $recommended_filename");
     return 1;
   }

#IS IT A ZIP FILE WITH A VALID MAGICK NUMBER? - IDEA From Tomasz Ostrowski
   if ($header !~ /^PK\003\004/i) {
md_syslog('warning', "$QueueID: ZIP file has an invalid ZIP Magic Number: $recommended_filename");
     return 1;
   }
 }

 return 0;
}


----- Original Message ----- From: "Dave O'Neill" <[email protected]>
To: <[email protected]>
Sent: Thursday, January 14, 2010 12:09 PM
Subject: Re: [Mimedefang] exe in defective zip attachments gettingthrough mimedefang


On Thu, Jan 14, 2010 at 10:54:14AM -0600, Cliff Hayes wrote:
if Archive::Zip doesn't return an AZ_OK then mimedefang lets the attachment through. From what I could find out, if Archive::Zip doesn't return AZ_OK then there is a problem with the zip file. I'd rather block defective zip files then let them through. In the code below, I substituted "return 0;" with "else { return 1; }" and that solved my problem. Now good zips still go through, zips with exe's get replaced with warning, and defective (hacked I'm assuming) get replaced with warnings too. I'm surprised that standard
procedure is to let defective zips through.  Or am I understanding this
wrong?

What value is ->read() returning? It might be nice to check the status value and determine if it's failing due to a corrupt zip file, or simply due to a zip format that Archive::Zip doesn't recognize.

If you can grab a sample of the zip in question and send it to me offlist, I'll take a look.

Cheers,
Dave
--
Dave O'Neill <[email protected]>    Roaring Penguin Software Inc.
+1 (613) 231-6599                        http://www.roaringpenguin.com/
For CanIt technical support, please mail: [email protected]
_______________________________________________
NOTE: If there is a disclaimer or other legal boilerplate in the above
message, it is NULL AND VOID.  You may ignore it.

Visit http://www.mimedefang.org and http://www.roaringpenguin.com
MIMEDefang mailing list [email protected]
http://lists.roaringpenguin.com/mailman/listinfo/mimedefang


_______________________________________________
NOTE: If there is a disclaimer or other legal boilerplate in the above
message, it is NULL AND VOID.  You may ignore it.

Visit http://www.mimedefang.org and http://www.roaringpenguin.com
MIMEDefang mailing list [email protected]
http://lists.roaringpenguin.com/mailman/listinfo/mimedefang

Reply via email to