Unfortunatly, Github BT doesn't allow attachment of patches in issues, so, I'm posting it here. Here's a simple patch to scan uploads using ClamAV. It's quite minimal for now
- it's limited to grant uploads (but it's easy to also add it for tickets) - if a virus is found, the interface will display the generic internal error message. Would be better to tell the user a virus was found, but I don't know how to propagate the info in uploadErrorStr (sorry, I'm not a PHP guru ;-)) - I've only tested on a local clamd process using a UNIX socket. It might work with a TCP socket (in which case clamd could also run on a separate machine) Comments are welcom :-) Regards, Daniel -- Daniel Berteaud FIREWALL-SERVICES SARL. Société de Services en Logiciels Libres Technopôle Montesquieu 33650 MARTILLAC Tel : 05 56 64 15 32 Fax : 05 56 64 15 32 Web : http://www.firewall-services.com
diff -Nur -x '*.orig' -x '*.rej' dl-0.11/htdocs/include/config.php.dist mezzanine_patched_dl-0.11/htdocs/include/config.php.dist --- dl-0.11/htdocs/include/config.php.dist 2013-07-05 19:09:30.000000000 +0200 +++ mezzanine_patched_dl-0.11/htdocs/include/config.php.dist 2013-11-19 22:55:22.618030012 +0100 @@ -77,4 +77,13 @@ // gcLimit: Maximum number of tickets to remove at every expiration. // If 0 is used, all expired tickets are removed at once. //$gcLimit = 0; + +// clamdSocket: define the path of clamd UNIX socket if you want +// files uploaded through grants to be scanned +// Leave it undefined to disable this functionnality +//$clamdScan = 'unix:///var/clamav/clamd.socket'; + +// scanMax: define the maximum file size to be scan (in bytes). Files above this +// limit won't be scanned. Should be under StreamMaxLength in clamd.conf +//$scanMax = 20 * 1024 *1024; ?> diff -Nur -x '*.orig' -x '*.rej' dl-0.11/htdocs/include/funcs.php mezzanine_patched_dl-0.11/htdocs/include/funcs.php --- dl-0.11/htdocs/include/funcs.php 2013-07-04 14:44:22.000000000 +0200 +++ mezzanine_patched_dl-0.11/htdocs/include/funcs.php 2013-11-19 22:50:48.372360158 +0100 @@ -344,4 +344,21 @@ return array("user" => $user, "pass" => $pass); } +function clamdScan($file) +{ + global $clamdSocket; + $return = null; + + $socket = fsockopen($clamdSocket); + fwrite($socket, "zINSTREAM\0"); + $fh = fopen($file, 'r'); + $size = filesize($file); + fwrite($socket,pack("N", $size)); + stream_copy_to_stream($fh, $socket); + fwrite($socket, pack("N", 0)); + $return = fread($socket,8192); + $return = str_replace(' FOUND', '', $return); + return trim(str_replace('stream: ', '', $return)); +} + ?> diff -Nur -x '*.orig' -x '*.rej' dl-0.11/htdocs/include/grant.php mezzanine_patched_dl-0.11/htdocs/include/grant.php --- dl-0.11/htdocs/include/grant.php 2013-05-29 21:02:30.000000000 +0200 +++ mezzanine_patched_dl-0.11/htdocs/include/grant.php 2013-11-19 22:50:06.909256069 +0100 @@ -45,10 +45,20 @@ function handleUpload($GRANT, $FILE) { - global $dataDir, $db; + global $dataDir, $db, $clamdSocket, $scanMax; // generate new unique id/file name list($id, $tmpFile) = genTicketId($FILE["name"]); + $size = filesize($FILE["tmp_name"]); + // stream the file to clamd if $clamdSocket is configured + if (isset($clamdSocket) && !empty($clamdSocket)){ + if ($size > 0 && $size <= $scanMax){ + $res = clamdScan($FILE["tmp_name"]); + if ($res != 'OK'){ + return failUpload($tmpFile); + } + } + } if(!move_uploaded_file($FILE["tmp_name"], $tmpFile)) return failUpload($tmpFile);