Table of Contents

ClamAV, permessi e Apparmor

Con Debian 10 Buster il demone clamd viene installato con il pacchetto clamav-daemon. La configurazione predefinita nel file /etc/clamav/clamd.conf prevede:

LocalSocket /var/run/clamav/clamd.ctl
LocalSocketGroup clamav
LocalSocketMode 666
User clamav
...

Cioè il demone viene eseguito a nome dell'utente non privilegiato clamav, la comunicazione tra il client (ad esempio clamdscan) e il demone clamd avviene tramite il socket /var/run/clamav/clamd.ctl che ha mode 0666 e appartiene a clamav.clamav.

Esecuzione a nome di root

Una configurazione sconsigliata (e fondamentalmente inutile) potrebbe essere quella di eseguire il demone a nome dell'utente root; in passato questo era necessario per poter accedere ad ogni file del filesystem, ad esempio per oter controllare gli allegati di posta elettronica appartenenti ali utenti del sistema.

Questa configurazione (oltre che sconsigliata) non è di immediata realizzazione. Modificando la configurazione /etc/clamav/clamd.conf in questo modo:

User root

non ottiene il risultato desiderato. Dopo aver eseguito systemctl restart clamav-daemon.service si verifica che il servizio fallisce e syslog riporta:

kernel: audit: type=1400 audit(1592300396.191:22): apparmor="DENIED" operation="capable"
        profile="/usr/sbin/clamd" pid=9619 comm="clamd" capability=0  capname="chown"
clamd[9619]: Tue Jun 16 11:39:56 2020 -> !Failed to change socket ownership to group clamav

In pratica esiste una regola di apparmor che impedisce al programma eseguire il chown del scoket, nonostante i permessi di root (anzi, proprio per quello!).

ATTENZIONE: Avviare il servizio richiede più di un minuto su sitemi non troppo performanti.

ATTENZIONE: Il socket /var/run/clamav/clamd.ctl viene comunque creato appartenente a root e questo potrebbe compromettere l'avvio del demone in altre condizioni.

Il problema è causato dal fatto che Debian installa il pacchetto apparmor e il pacchetto clamav-daemon installa il profilo /etc/apparmor.d/usr.sbin.clamd. Con il comando aa-status si verifica che quel profilo è in enforce mode:

aa-status 
apparmor module is loaded.
18 profiles are loaded.
17 profiles are in enforce mode.
   ...
   /usr/sbin/clamd
   ...

Se si desidera mantenre l'infrastruttura apparmor attiva, è comunque possibile disabilitare il profilo clamd. È necessario installare il pacchetto apparmor-utils ed eseguire quanto segue (viene creato un link simbolico in /etc/apparmor.d/disable/):

aa-disable /etc/apparmor.d/usr.sbin.clamd

Il socket verrà creato con i seguenti permessi:

srw-rw-rw- 1 root clamav 0 Jun 16 12:08 /var/run/clamav/clamd.ctl

Per verificare che clamd stia girando con i permessi di root, è sufficiente richiamare clamdscan su un file che non sia world-readable:

chmod 600 /root/mail-test-eicar-antivirus.com 
clamdscan /root/mail-test-eicar-antivirus.com 
/root/mail-test-eicar-antivirus.com: Eicar-Signature FOUND

Il profilo clamd resta disabilitato anche dopo un reboot, viene eventualmente ripristinato in caso di rimozione e reinstallazione del pacchetto clamav-daemon oppure utilizzando il comando aa-enforce.

Esecuzione senza privilegi di root

Ovviamente la soluzione ottimale è lasciare che clamd venga eseguito senza privilegi di root. In queste condizioni un file non-world readable non è direttamente accessibile da clamd:

clamdscan /root/mail-test-eicar-antivirus.com 
/root/mail-test-eicar-antivirus.com: lstat() failed: Permission denied. ERROR

La soluzione è utilizzare il parametro --fdpass di clamdscan che consente (solo lavorando su Unix socket) di passare il file descriptor al demone:

clamdscan --fdpass /root/mail-test-eicar-antivirus.com 
/root/mail-test-eicar-antivirus.com: Eicar-Signature FOUND