Динамический запуск clamscan от ClamAV при загрузке файлов с помощью PHP

#php #security #file-upload

#php #Безопасность #загрузка файлов

Вопрос:

Стек,

Я хочу сканировать каждый файл, который загружается с помощью моего скрипта загрузки php, с помощью clamscan от clam anti-virus. Я думаю, что у меня написан хороший скрипт, но я хотел запустить его мимо вас, ребята.

Итак, предполагая, что файл, который я отправляю в этот скрипт загрузки php, называется «uploadedfile», имеет ли смысл следующий код?

 <?php

$safe_path = escapeshellarg('/tmp/' . $_FILES['uploadedfile']['tmp_name']);
$command = 'clamscan ' . $safe_path;
$out = '';
$int = -1;
exec($command, $out, $int);

if ($int == 0) {
   // all good, code goes here uploads file as normal IE move to
permanent directory etc;
} else {
   unlink('/tmp/' . $_FILES['uploadedfile']['tmp_name']);
header(Location: http://www.domain.com/uploadform.php?error=your-file-was-infected-pal);
}

?>
  

Кроме того, будет ли clamscan находить php-оболочки, а также традиционные старые добрые вредоносные программы?

Спасибо!

Обновление — найден ответ

Я ответил на свой собственный вопрос, но у меня нет репутации, чтобы официально это сделать. Вот ответ:

Для тех, кто придет после. Я протестировал этот скрипт, используя тестовый вирусный файл EICAR http://eicar.org/86-0-Intended-use.html и после нескольких настроек это работает. Возвращаемая переменная $int — это то, что сообщает вам, является ли файл безопасным или нет. Если значение $int равно 0, вирус не найден, если значение $int равно 1, вирус найден. Однако есть некоторые изменения, которые мне пришлось внести, чтобы заставить скрипт работать (я обновил переменную $safe_path, чтобы она была правильной), вот рабочий скрипт:

 <?php

$safe_path = escapeshellarg($_FILES['uploadedfile']['tmp_name']);
$command = 'clamscan ' . $safe_path;
$out = '';
$int = -1;
exec($command, $out, $int);

if ($int == 0) {
   // all good, code goes here uploads file as normal IE move to
permanent directory etc;
} else {
  //whatever you need to do if a virus is found.
}

?>
  

Комментарии:

1. Спасибо, что поделились этим!

2. Специальный голос за escapeshellarg . Многие разработчики забывают об этом, и это чрезвычайно важно — разработчики с учетом безопасности должны исключать возможность выполнения произвольного кода с помощью таких вещей, как exec .

Ответ №1:

Обратите внимание, что если на вашем сервере запущен демон clamav (clamd), возможно, можно использовать clamdscan вместо clamscan, как предлагается, это использование быстрее, поскольку использует сигнатуры вирусов, уже загруженные clamd.

Комментарии:

1. Этот ответ был бомбой замедленного действия 😉 Да, это на самом деле то, что я в итоге использовал. запуск clamscan занял около 5-6 секунд, clamdscan работает практически мгновенно.

2. Кроме того, я обнаружил, что прямое открытие сокет-соединения с clamd приводило к несогласованному выводу (ClamAV v0.98.4 на Solaris Sparc) при рекурсивном сканировании каталогов. Использование двоичного файла clamdscan срабатывало каждый раз.

3. Спасибо!! серьезно полезно 🙂

4. Примечание: если вы используете clamd , у пользователя, который запускает clamd , должно быть разрешение на файл, который вы хотите сканировать.

Ответ №2:

Просто будьте осторожны. Если ваш clamscan устареет, вы получите обратную связь в выходных данных:

Это будет выглядеть так:

 LibClamAV Warning: ***********************************************************
LibClamAV Warning: ***  This version of the ClamAV engine is outdated.     ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
  

Также в зависимости от версии clamscan «результат» может выглядеть следующим образом (и вам нужно будет проанализировать его соответствующим образом):

 [filename]: OK

----------- SCAN SUMMARY -----------
Known viruses: x
Engine version: x.x.x
Scanned directories: 0
Scanned files: 1
Infected files: 0
Data scanned: x.xx MB
Data read: x.xx MB (ratio 0.00:1)
Time: x.xx sec (0 m x s)
  

Комментарии:

1. Я запустил скрипт, используя обычный image.jpg файл и файл eicar test virus, а также возвращаемое значение $int будут возвращены как 0, если файл безопасен, и 1, если файл заражен. На этом я основываю остальные действия скрипта.

2. В этом случае это выглядит хорошо. Просто не забывайте обновлять свои определения. Если вы хотите протестировать какой-либо код оболочки, просто загрузите пару отсюда exploit-db.com/search /…

Ответ №3:

У меня было много проблем с разрешениями при попытке запустить это с помощью clamdscan. Я нашел решение проблемы с разрешениями здесь: https://wiki .archlinux.org/index.php/ClamAV

Это изменило эту строку:

 $command = 'clamscan ' . $safe_path;
  

Для:

 $command = 'clamdscan  --fdpass ' . $safe_path;
  

Похоже, успешно передал хороший файл и пометил файл EICAR.