Clamav est un antivirus qui permet de scanner des fichiers. Dans notre cas, nous allons l’utiliser pour vérifier le contenu des fichiers au moment de leur upload et empêcher leur téléchargement s’ils sont suspects.
Dans un premier temps nous allons installer Clamav
franck@INFRA01:~/Documents$ sudo apt install clamav clamav-daemon build-essential
Le service se lance automatiquement, nous le coupons afin de pouvoir le relancer avec les bonnes configurations
franck@INFRA01:~/Documents$ sudo systemctl stop clamav-freshclam.service
franck@INFRA01:~/Documents$ sudo freshclam
Sun Jul 17 11:01:31 2022 -> ClamAV update process started at Sun Jul 17 11:01:31 2022
Sun Jul 17 11:01:31 2022 -> daily.cvd database is up-to-date (version: 26604, sigs: 1990352, f-level: 90, builder: raynman)
Sun Jul 17 11:01:31 2022 -> main.cvd database is up-to-date (version: 62, sigs: 6647427, f-level: 90, builder: sigmgr)
Sun Jul 17 11:01:31 2022 -> bytecode.cvd database is up-to-date (version: 333, sigs: 92, f-level: 63, builder: awillia2)
franck@INFRA01:~/Documents$ sudo systemctl start clamav-freshclam.service
Vérifier que les configurations sont bonnes:
franck@INFRA01:~/Documents$ curl https://secure.eicar.org/eicar.com.txt | clamscan
-
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 68 100 68 0 0 123 0 --:--:-- --:--:-- --:--:-- 124
stdin: Win.Test.EICAR_HDB-1 FOUND
----------- SCAN SUMMARY -----------
Known viruses: 8622412
Engine version: 0.103.6
Scanned directories: 0
Scanned files: 1
Infected files: 1
Data scanned: 0.00 MB
Data read: 0.00 MB (ratio 0.00:1)
Time: 18.471 sec (0 m 18 s)
Start Date: 2022:07:17 11:02:23
End Date: 2022:07:17 11:02:42
Vous devez obtenir dans stdin :
stdin: Win.Test.EICAR_HDB-1 FOUND
Pour scanner nos fichiers actuellement uploadés, nous faisons :
franck@INFRA01:/var/www/html$ clamscan fichier_drop/
/var/www/html/fichier_drop/file_16580159835640.html: Empty file
/var/www/html/fichier_drop/file_16580196038945.html: OK
/var/www/html/fichier_drop/file_16580144228625.html: Empty file
/var/www/html/fichier_drop/file_16580144377250.html: Empty file
/var/www/html/fichier_drop/composer_16580228211477.json: OK
/var/www/html/fichier_drop/python_16580172358636.py: OK
/var/www/html/fichier_drop/file_16580148914759.html: Empty file
/var/www/html/fichier_drop/file_16580196295046.html: OK
/var/www/html/fichier_drop/file_16580161041315.html: OK
/var/www/html/fichier_drop/test_16580199663182.pdf: OK
/var/www/html/fichier_drop/ls_16580170519271: OK
/var/www/html/fichier_drop/file_16580195762619.html: OK
/var/www/html/fichier_drop/test_16580170688963.c: OK
/var/www/html/fichier_drop/ _16580170620541: Empty file
/var/www/html/fichier_drop/test_16580171158318.jpeg: OK
/var/www/html/fichier_drop/test_16580171426550.py: OK
/var/www/html/fichier_drop/agent_bis.php: OK
/var/www/html/fichier_drop/test_16580171798950.php: OK
/var/www/html/fichier_drop/linux.svg_16580458217612.png: OK
/var/www/html/fichier_drop/file_16580160694417.html: Empty file
/var/www/html/fichier_drop/ls_16580227458982: OK
/var/www/html/fichier_drop/file_1658014381073.9.html: Empty file
/var/www/html/fichier_drop/file_16580148863807.html: Empty file
/var/www/html/fichier_drop/file_16580144114170.html: Empty file
/var/www/html/fichier_drop/file_16580146979588.html: Empty file
/var/www/html/fichier_drop/test_16580175115380.pdf: OK
----------- SCAN SUMMARY -----------
Known viruses: 8622412
Engine version: 0.103.6
Scanned directories: 1
Scanned files: 16
Infected files: 0
Data scanned: 0.15 MB
Data read: 0.28 MB (ratio 0.54:1)
Time: 16.942 sec (0 m 16 s)
Start Date: 2022:07:17 11:05:03
End Date: 2022:07:17 11:05:20
Nous pouvons voir que actuellement aucun fichier ne contient de potentiel virus contenu dans la base de donnée de clamav.
Afin que chaque fichier soit testé au moment de l’upload, nous allons ajouter une partie au fichier test.php, juste au dessus de la section d’upload :
franck@INFRA01:/var/www/html$ sudo nano php_legit/test.php
[...]
#########################################################################################
# Verification avec clamav du contenu
######################################################################################
$safe_path = escapeshellarg($_FILES['userfile']['tmp_name']);
$command = 'clamscan ' . $safe_path;
$out = '';
$int = -1;
exec($command, $out, $int);
if ($int != 0)
{
upload_failure();
}
#########################################################################################
# On upload le fichier
######################################################################################
[...]
Le fichier complet est disponible ici : test.php
Le défaut de cette solution est que notre site est ralenti. Pour aller plus vite nous pourrions utiliser la daemon de clamav : clamd.
Cela nécessite néamoins de modifier les droits sur le dossier fichier_drop, ce qui peut amener d’autres failles et de laisser un processus tourner en fond constamment (qui pourrait aussi être une nouvelle faille).