
Tengo la siguiente regla para enviar todos los correos electrónicos con archivos adjuntos sospechosos a una carpeta dedicada:
# Emails with attachments
:0
* ^Content-Type: multipart/
{
:0 B
* ^Content-Type: application/(zip|x-zip-compressed)|\
^Content-Type:.*name=.*\.(zip|exe|rar|rtf|docm)|\
^Content-.*attachment.*name=.*\.(zip|exe|rar|rtf|docm)|\
^Content-.*application.octet-stream.*name=.*\.(zip|exe|rar|rtf|docm)
$L/.3_my._quarantine/
}
Sin embargo, me acabo de dar cuenta de que se me escapó un correo electrónico con un archivo adjunto zip y no puedo entender por qué (mi@correo electrónico y micorreo electrónico contenían mi correo electrónico y mi host, que ofusqué):
X-Priority: 3 (Normal)
From: [email protected]
To: "[email protected]"
<[email protected]>
Subject: Attached File
Date:Mon, 16 May 2016 17:16:47 +0530
Message-Id: <272843899191709486.0001.scannerTxNo.0051@scannerF04EF6.myemail.com>
Mime-Version: 1.0
Content-Type: multipart/mixed;
boundary="53594271E1EBE7BBDAF4BBA9"
--53594271E1EBE7BBDAF4BBA9
Content-Type: application/x-compressed;
name="[email protected]_3602848_97891076672132.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="[email protected]_3602848_97891076672132.zip"
¿AFAICS ^Content-Type:.*name=.*\.(zip|exe|rar|rtf|docm)
debería coincidir? ¿Es por las comillas?
Respuesta1
La publicación a la que vinculas efectivamente indica que se plegó.encabezadosse manejan correctamente, pero esta receta examina el cuerpo, no el encabezado.
Es un error de Procmail que no reconoce las estructuras MIME correctamente; ésta sería una adición importante a un filtro de correo moderno; pero, por desgracia, el desarrollo de Procmail cesó ya a principios de la década de 2000 (y ya una vez antes, cuando el desarrollador original lo dejó ir).
Como solución burda, podría dividir temporalmente un mensaje MIME de varias partes en el límite MIME y alimentar cada parte a una receta Procmail separada, pero esto rápidamente se vuelve frágil y complejo (en teoría, los mensajes MIME podrían anidarse arbitrariamente profundamente, aunque para la mayoría Para fines prácticos, sólo necesita recurrir uno o dos niveles hacia abajo; cualquier cosa más allá de eso probablemente sea un rebote o algo así, no directamente una característica del mensaje que está examinando).
Debido a que su expresión regular tiene solo unos pocos puntos de división posibles (¡realistas!), puede refactorizarla para tener en cuenta posibles saltos de línea:
:0
* ^Content-type: multipart/
{
:0B
* ^Content-Type: application/(zip|x-zip-compressed)|\
^Content-Type:.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)|\
^Content-.*attachment.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)|\
^Content-.*application.octet-stream.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)
$L/.3_my._quarantine/
}
Notarás la (($)[ ].*)*
adición en algunos lugares. Esto tiene en cuenta una posible nueva línea ( ($)
) seguida de un carácter de espacio en blanco (tabulación o espacio [ ]
) seguido de cualquier cosa, repetido cero o más veces.
(Aparte, esto quizás sería un poco más fácil de depurar con puntuación:
:0 B
* 1^1 ^Content-Type: application/(zip|x-zip-compressed)
* 1^1 ^Content-Type:.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)
* 1^1 ^Content-.*attachment.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)
* 1^1 ^Content-.*application.octet-stream.*(($)[ ].*)*name=.*\.(zip|exe|rar|rtf|docm)
...
Con esto, puede ver en el VERBOSE=yes
registro el resultado de cada expresión regular individual en esta compleja receta de múltiples expresiones regulares).
Si necesita una receta completamente hermética, tal vez escriba un script simple en Python o Perl (o Ruby o... lo que sea) para normalizar la estructura MIME. Recuerdo que hace mucho tiempo hubo una herramienta emil
que hacía algo como esto, pero nunca estuvo muy bien establecida, y mucho menos bien documentada. (De hecho, IIRC fue diseñado específicamente para conectarse a pre-MIME sendmail
y era casi imposible usarlo para cualquier otra cosa).