Abbiamo un'applicazione web per la quale mi è stato chiesto di aggiungere la possibilità di consentire agli utenti di caricare documenti che saranno poi visibili e scaricabili da altri utenti. Questi documenti saranno in genere immagini e documenti di revisione che saranno inizialmente in formato PDF ma che in futuro potrebbero estendersi ad altri formati di ufficio. Ogni utente che può caricare o scaricare i file dovrà prima autenticarsi. I server eseguono Debian.
Per come la vedo io, con questa funzionalità, il nostro server può potenzialmente diventare un vettore di distribuzione per i virus attraverso il seguente scenario:
- L'utente 1 carica un file che contiene un virus,
- Server rende il file disponibile per il download,
- L'utente 2 scarica il file infetto e propaga il virus.
Per mitigare questa minaccia, stavo pensando di implementare un meccanismo di quarantena in cui ogni file è caricato sul nostro server in una cartella sicura, controllato e reso disponibile per il download solo dopo aver superato tutti i controlli. I controlli di sicurezza che avevo in mente sono:
- Avere una lista bianca di tipi di file accettiamo e rifiutiamo qualsiasi file non di quel tipo,
- Verifica che il tipo del file attuale sia uguale a quello pubblicizzato nella richiesta POST e respinga qualsiasi file in cui vi è una mancata corrispondenza,
- Avvia l'antivirus sul file.
Potremmo anche includere filtri specifici per determinati tipi di file. Ad esempio, potremmo avere immagini passate attraverso ImageMagick per memorizzare una versione "sterilizzata". Allo stesso modo, dovremmo essere in grado di analizzare parzialmente i file di documento per estrarre alcune informazioni da loro ed eseguire ulteriori controlli.
Le mie idee attuali per l'implementazione di tali controlli sono:
- Verifica il tipo di file utilizzando
file -i
, - Utilizza ClamAV come antivirus.
Ci sono altri vettori di attacco che dovrei pensare o altri controlli che dovrei implementare?
ClamAV è lo strumento corretto per verificare la presenza di virus nei file?