1

У меня есть следующее правило для отправки всех писем с подозрительными вложениями в отдельную папку:

# 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/
}

Однако я только что заметил, что электронное письмо с вложенным zip-файлом проскользнуло через него, и я не могу понять, почему (мой @ email и myemail содержали мою электронную почту и мой хост, который я запутал):

X-Priority: 3 (Normal)
From: scanner47578858@myemail.com
To: "my@email.com"
 <my@email.com>
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="my@email.com_3602848_97891076672132.zip"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="my@email.com_3602848_97891076672132.zip"

AFAICS ^ Content-Type:. * Name =.*\.(zip | exe | rar | rtf | docm) должно совпадать? Это из-за кавычек?

1 ответ1

1

В публикации, на которую вы ссылаетесь, действительно говорится, что сложенные заголовки обрабатываются правильно, но этот рецепт проверяет тело, а не заголовок.

Procmail ошибочно считает, что он неправильно распознает структуры MIME; это было бы важным дополнением к современному почтовому фильтру; но, увы, разработка Procmail прекратилась уже в начале 2000-х годов (и уже однажды, когда первоначальный разработчик отпустил).

В качестве грубого обходного пути можно временно разделить составное сообщение MIME на границе MIME и передать каждую часть в отдельный рецепт Procmail, но это быстро становится хрупким и сложным (в теории сообщения MIME могут быть произвольно глубоко вложены, хотя для большинства В практических целях вам нужно всего лишь вернуться на один или два уровня вниз - что-либо, кроме того, что, вероятно, является отскоком или чем-то в этом роде, а не непосредственно особенностью сообщения, которое вы изучаете).

Потому что у вашего регулярного выражения есть только несколько возможных (реалистично!) точки разделения, вы можете изменить его, чтобы учесть возможные разрывы строк:

: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/
}

Вы заметите дополнение (($)[ ].*)* В нескольких местах. Это учитывает возможную новую строку (($)), за которой следует символ пробела (табуляция или пробел, [ ]), за которым следует что-либо, повторяемое ноль или более раз.

(Кроме того, это может быть немного легче отладить с помощью скоринга:

  :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)
  ...

При этом вы можете увидеть в VERBOSE=yes запись результатов каждого отдельного регулярного выражения в этом сложном рецепте с несколькими регулярными выражениями.)

Если вам нужен полностью водонепроницаемый рецепт, возможно, напишите простой скрипт на Python или Perl (или Ruby или ... что у вас есть) для нормализации структуры MIME. Я помню, что давным- давно был инструмент под названием emil который делал что-то подобное, но он никогда не был очень устоявшимся, не говоря уже о хорошо документированных. (Фактически, IIRC был разработан специально для подключения к sendmail до MIME, и его было практически невозможно использовать для чего-либо еще.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .