
Tenho a seguinte regra para enviar todos os emails com anexos suspeitos para uma pasta 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/
}
No entanto, acabei de notar que um email com um anexo zip passou por ele e não consigo entender o porquê (my@email e myemail continham meu email e meu host que eu ofusquei):
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)
deve corresponder? É por causa das aspas?
Responder1
A postagem para a qual você vincula realmente afirma que foi dobradocabeçalhossão tratados corretamente, mas esta receita examina o corpo, não o cabeçalho.
É uma característica incorreta do Procmail não reconhecer estruturas MIME corretamente; esta seria uma adição importante a um filtro de correio moderno; mas, infelizmente, o desenvolvimento do Procmail já cessou no início dos anos 2000 (e já uma vez antes disso, quando o desenvolvedor original o dispensou).
Como uma solução alternativa grosseira, você poderia dividir temporariamente uma mensagem MIME multipart no limite MIME e alimentar cada parte em uma receita Procmail separada, mas isso rapidamente se torna frágil e complexo (em teoria, as mensagens MIME podem ser aninhadas arbitrariamente profundamente, embora para a maioria Para fins práticos, você só precisa recorrer um ou dois níveis abaixo - qualquer coisa além disso é provavelmente uma rejeição ou algo parecido, não diretamente um recurso da mensagem que você está examinando).
Como sua regex tem apenas alguns pontos de divisão possíveis (realistas!), você pode refatorá-la para levar em conta possíveis quebras de linha:
: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/
}
Você notará a (($)[ ].*)*
adição em alguns lugares. Isso explica uma possível nova linha ( ($)
) seguida por um caractere de espaço em branco (tabulação ou espaço, [ ]
) seguido por qualquer coisa, repetido zero ou mais vezes.
(Além disso, talvez fosse um pouco mais fácil depurar com pontuação:
: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)
...
Com isso, você pode ver no VERBOSE=yes
log o resultado de cada regex individual nesta complexa receita multi-regex.)
Se você precisar de uma receita completamente estanque, talvez escreva um script simples em Python ou Perl (ou Ruby ou ... o que quer que seja) para normalizar a estrutura MIME. Lembro que existia uma ferramenta chamada emil
há muito tempo que fazia algo assim, mas nunca foi muito bem estabelecida, muito menos bem documentada. (Na verdade, o IIRC foi projetado especificamente para ser conectado ao pré-MIME sendmail
e era quase impossível de usar para qualquer outra coisa.)