User Tools

Site Tools


doc:appunti:linux:sa:procmail_sanitizer_clamav

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
doc:appunti:linux:sa:procmail_sanitizer_clamav [2020/06/18 09:30] – [Scansione antivirus con procmail, sanitizer e clamav] niccolodoc:appunti:linux:sa:procmail_sanitizer_clamav [2022/04/11 18:13] (current) – [Content-Type ed estensioni per Sanitizer] niccolo
Line 3: Line 3:
 ===== Procmail ===== ===== Procmail =====
  
-Se si utilizza **procmail** come //local delivery agent//, è sufficiente aggiungere questa regola in **$HOME/.procmailrc** per abilitare il filtro antivirus con il programma **sanitizer**:+Se si utilizza **procmail** come //local delivery agent//, è sufficiente aggiungere questa regola in **$HOME/.procmailrc** per abilitare il filtro antivirus tramite il programma **sanitizer**:
  
 <file> <file>
 +#-------------------------------------------------------------------------
 +# $HOME/.procmailrc
 +#-------------------------------------------------------------------------
 PATH=/usr/local/bin:/usr/bin:/bin PATH=/usr/local/bin:/usr/bin:/bin
 SHELL=/bin/bash SHELL=/bin/bash
Line 22: Line 25:
 ===== Sanitizer ===== ===== Sanitizer =====
  
-Il programma sanitizer si configura tramite **/etc/sanitizer.cfg**:+Il programma sanitizer funziona come filtro sui messaggi di posta, analizzando gli allegati secondo la configurazione indicata in  **/etc/sanitizer.cfg**:
  
 <file> <file>
Line 64: Line 67:
 # #
 #    $P - This process's PID, in hex. #    $P - This process's PID, in hex.
-#    $T - The current Unix time, in hex. 
 #    $T - The current Unix time, in hex. #    $T - The current Unix time, in hex.
 #    $F - A safe version of the original file name. #    $F - A safe version of the original file name.
Line 115: Line 117:
 # Virus scanner command line. The three exit codes represent the # Virus scanner command line. The three exit codes represent the
 # following scan conditions: clean, disinfected, infected. # following scan conditions: clean, disinfected, infected.
-file_list_1_scanner = 0:1:1:/usr/bin/clamdscan --fdpass --quiet %FILENAME+# NOTICE: clamdscan does not have the "disinfected" condition. 
 +file_list_1_scanner = 0:99:1:/usr/bin/clamdscan --fdpass --quiet %FILENAME
  
 # What policy to apply for each exit code, plus a catch-all default. # What policy to apply for each exit code, plus a catch-all default.
-file_list_1_policy  = unknown:save:save:unknown+file_list_1_policy  = unknown:unknown:save:unknown
  
  
Line 143: Line 146:
 msg_defanged = ANTIVIRUS msg_defanged = ANTIVIRUS
 </file> </file>
 +
 +Con la direttiva **file_list_1_scanner** si indica il programma filtro da chiamare - nel notro caso **clamdscan** con l'opzione **%%--fdpass%%** - e quali sono i codici di uscita per tre possibili esiti della scansione: **clean** (l'allegato è pulito), **disinfected** (l'allegato era infetto, ma è stato ripulito), **infected** (l'allegato è infetto). Nel caso di clamdscan vale solo l'**exit code 0** per un file **pulito** e l'**exit code 1** per un file **infetto**; non esistendo il caso **disinfected** si è indicato l'inesistente **exit code 99**.
 +
 +La politica da applicare a seguito della scansione è determinata da **file_list_1_policy**. Si devono indicare **quattro possibili azioni** di cui le prime tre corrispondo ai tre esiti della scansione (//clean//, //disinfected// e //infected//) e la quarta è l'azione predefinita.
 +
 +Ricapitolando questa è la politica applicata ai file compresi nella **file_list_1**:
 +
 +^ Esito scansione  ^ Clamdscan Exit Code  ^ Sanitizer Policy  ^
 +| Clean          |    0 | **unknown** (check the next policy).  |
 +| Disinfected    |  N/A | **unknown** (check the next policy).  |
 +| Infected          1 | **save** (remove the attachment from the message).  |
 +| Generic error  |    2 | **unknown** (check the next policy).  |
 +
 +==== Content-Type ed estensioni per Sanitizer ====
 +
 +Nella **file_list_2** vengono indicate delle estensioni per cui l'allegato passa intalterato, cioè non viene //neutralizzato// cambiandogli nome. In realtà Sanitizer applica la whitelist sia che corrisponda l'**estensione** del file, sia che corrisponda il **Content-Type**.
 +
 +Non è del tutto chiaro come avere la corrispondenza tra i due, ad esempio (empiricamente) si è determinato che il Content-Type **application/octet-stream** corrisponde all'estensione **bin**.
 +
 +Il riconoscimento del tipo di file viene fatto dalla funzione **check_file_type** del modulo **Anomy::Sanitizer::FileTypes**.
 +
 +Un problema comune con Sanitizer sono le parti del messaggio con MIME type **text/html**: se il contenuto non è un HTML ben formato, esse subiscono il **defang**, cioè il il MIME type viene modificato in **application/DEFANGED** (la stringa DEFANGED può essere personalizzata configurando l'opzione **msg_defanged**). Questo di solito impedisce la corretta visualizzazione //inline// di quella parte del messaggio nel client di posta.
 +
 +Nel sorgente Perl del modulo **FileTypes** si vede che la classificazione di una parte come oggetto di tipo HTML richiede la presenza di una espressione regolare nella parte stessa (la verifica riguarda solo i primi 512 bytes):
 +
 +<code perl>
 +my $HTML = {
 +    id         => "html",
 +    risk       => $low,
 +    name       => "HTML text file",
 +    extensions => [ "html", "htm", "shtml" ],
 +    mime_types => [ 'text/html' ],
 +    magic      => [ ],
 +    regexp     => '<html|<body|<p>|<b>|<i>|<br>|</a>',
 +};
 +</code>
 +
 +È possibile personalizzare il modulo **FileTypes** definito in **/usr/share/perl5/Anomy/Sanitizer/FileTypes.pm** facendone una copia in **/etc/perl/Anomy/Sanitizer/FileTypes.pm**. Rimuovendo l'elemento **regexp** dal dictionary, Sanitizer riconoscerà una parte HTML considerando solo l'estensione o il MIME type, senza analizzare il contenuto.
  
 ===== Cosa succede se clamd è fermo ===== ===== Cosa succede se clamd è fermo =====
Line 152: Line 193:
 ^ 2  | Could not connect to clamd on LocalSocket.  | ^ 2  | Could not connect to clamd on LocalSocket.  |
  
-Quindi se il demone non risponde si ottiene un codice di uscita 2, quindi non si applicano le tre possibili condizioni (clean, disinfected, infected)verrà applicata la policy //catch-all//che nell'esempio sopra è **save** (rimozione del file salvataggio in quarantena).+Se il demone **clamd** non risponde, il programma **clamdscan** restituisce un exit code 2, quindi non si applicano le tre possibili condizioni (clean, disinfected, infected)verrà applicata la policy //catch-all// che nell'esempio sopra è **unknown**,  cioè l'applicazione delle regole successive. 
 + 
 +Nella configurazione mostrata sopra la regola successiva prevede di accettare tali quali gli allegati che corrispondono a **file_list_2** (in pratica documenti allegati non pericolosi), per tutti gli altri viene applicata la **file_default_policy** che consiste nel **defang**, cioè alterare il nome dell'allegato in modo che non sia più pericoloso (ad esempio la rimozione dell'estensione .exe oppure .com).
  
-FIXME: Forse questa non è la condizione ottimale, altrimenti una interruzione dell'antivirus porta alla perdita di tutti gli allegati.+Una configurazione più stringente potrebbe essere quella di applicare la policy **save** (rimozione dell'allegato) anche nel caso //catch-all// (**esito della scansione anomalo** e non previsto). Questa configurazione ha una controindicazione grave: se il demone clamd è fermo per qualche motivo, tutti gli allegati verrebbero eliminati dalla mail, anche quelli puliti ed essenziali come il testo HTML.
doc/appunti/linux/sa/procmail_sanitizer_clamav.1592465448.txt.gz · Last modified: 2020/06/18 09:30 by niccolo