
Ich habe die folgende Regel, um alle E-Mails mit verdächtigen Anhängen in einen dedizierten Ordner zu senden:
# 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/
}
Mir ist jedoch gerade aufgefallen, dass eine E-Mail mit einem ZIP-Anhang durchgerutscht ist, und ich kann nicht herausfinden, warum (my@email und myemail enthielten meine E-Mail und meinen Host, die ich verschleiert hatte):
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"
Sollte es meines Wissens ^Content-Type:.*name=.*\.(zip|exe|rar|rtf|docm)
nach übereinstimmen? Liegt es an den Anführungszeichen?
Antwort1
Der Beitrag, auf den Sie verweisen, besagt tatsächlich, dass gefaltetÜberschriftenwerden korrekt behandelt, aber dieses Rezept untersucht den Textkörper und nicht einen Header.
Ein Fehler von Procmail besteht darin, dass es MIME-Strukturen nicht richtig erkennt. Dies wäre eine wichtige Ergänzung für einen modernen Mailfilter. Leider wurde die Entwicklung von Procmail jedoch bereits Anfang der 2000er Jahre eingestellt (und schon einmal zuvor, als der ursprüngliche Entwickler kündigte).
Als einfache Problemumgehung können Sie eine mehrteilige MIME-Nachricht vorübergehend an der MIME-Grenze aufteilen und jeden Teil einem separaten Procmail-Rezept zuführen. Dies wird jedoch schnell instabil und komplex (theoretisch können MIME-Nachrichten beliebig tief verschachtelt werden, für die meisten praktischen Zwecke müssen Sie jedoch nur eine oder zwei Ebenen nach unten rekursieren – alles darüber hinaus ist wahrscheinlich ein Bounce oder etwas Ähnliches und nicht direkt ein Merkmal der Nachricht, die Sie untersuchen).
Da Ihr regulärer Ausdruck nur wenige mögliche (realistische!) Teilungspunkte hat, können Sie ihn umgestalten, um mögliche Zeilenumbrüche zu berücksichtigen:
: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/
}
(($)[ ].*)*
Sie werden die Ergänzung an einigen Stellen bemerken . Dies gilt für einen möglichen Zeilenumbruch ( ($)
), gefolgt von einem Leerzeichen (Tabulator oder Leerzeichen, [ ]
), gefolgt von irgendetwas, das null oder mehrmals wiederholt wird.
(Nebenbei bemerkt wäre dies vielleicht etwas einfacher zu debuggen, wenn man es mit Scoring ausstatten würde:
: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)
...
Damit können Sie im VERBOSE=yes
Protokoll das Ergebnis jedes einzelnen regulären Ausdrucks in diesem komplexen Rezept mit mehreren regulären Ausdrücken sehen.)
Wenn Sie ein absolut wasserdichtes Rezept benötigen, schreiben Sie vielleicht ein einfaches Skript in Python oder Perl (oder Ruby oder ... was auch immer), um die MIME-Struktur zu normalisieren. Ich erinnere mich, dass es emil
vor langer Zeit ein Tool namens gab, das so etwas gemacht hat, aber es war nie sehr etabliert, geschweige denn gut dokumentiert. (Tatsächlich wurde es, wenn ich mich recht entsinne, speziell für den Einsatz in Pre-MIME entwickelt sendmail
und war für fast nichts anderes zu verwenden.)