Проблемы с фильтрацией писем с исполняемыми вложениями в архивах или ссылками на них в Exim.

EXIM, sendmail, postfix, Dovecot и прочие. Решение проблем связанных с работой электронной почты

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
qursar
проходил мимо
Сообщения: 2
Зарегистрирован: 2016-02-11 9:14:55

Проблемы с фильтрацией писем с исполняемыми вложениями в архивах или ссылками на них в Exim.

Непрочитанное сообщение qursar » 2016-02-11 10:45:16

Доброго здоровья уважаемому обществу.

Имею почтовый домен на Exim`e 4.80, кол-во ящиков 500+. Поднимал его когда-то по мануалу http://www.lissyara.su/articles/freebsd ... tfixadmin/

Столкнулся с лютым потоком спама, содержащего во вложениях вредоносный код. Оппоненты коварно пакуют в архив какой-нибудь милый шифровальщик в формате, например .scr или .exe, придают письму вид сообщения из Ростелекома "о смене тарифа", уведомления из налоговой, ПФ, службы судебных приставов ... etc.
По классическому сценарию, далее всё происходит примерно так:
Пожилая (или молодая) дама (или господин) бухгалтер, сидящий за ПК в глубокой провинции видит "письмо из налоговой", пугается до мокрых штанишек, открывает вложение. После появления предложения заплатить 100500 денег за код расшифровки, следует звонок в нам в центральный офис с просьбой расшифровать всё, что было наработано непосильным трудом.

Почитал форум, добавил в exim проверку acl_check_mime, добавив чуть больше форматов по сравнению с оригиналом:

Код: Выделить всё

# ACL на блокировку исполняемых вложений а архивах
acl_smtp_mime = acl_check_mime

Код: Выделить всё

acl_check_mime:
# Проверка вложений на исполняемые файлы
deny 
    message = Error! Your message contains executible attachment(s) like: $mime_filename
    condition  = ${if match{$mime_filename}{\N\.(exe|com|vb|vbs|vbe|vba|wsf|bat|cmd|pif|scr|hta|js|jse|jsp|chm|cpl|reg|lnk|ocx|dll|sys|msi|msu|mst|apk|bin|cgi|ps1)$\N}}

###Проверка вложений-архивов zip-rar###
deny 
    message = Message contains executible files(s) in attachment $mime_filename
    condition = ${if match{$mime_filename}{\N(?i)\.(bz2|zip|rar|7z|cab|ace|7za|lah|lzo|lzx|gz|arj|bin|msi|cbr|deb|rpm|gzip|jar|pak|pkg|tar-gz|tgz|xar|zipx|wim|tb2|tar|paq|xz|iso|jar|lzh|lzma|pak|pk3|pk4|smzip|u3p|xpi|zipx|cpio|xar|lz|rk|zoo|img|ha)$\N}}
	      decode = default
       	     	condition = ${if match{${run{/usr/bin/7z l $mime_decoded_filename}}}{\N(?i)\.(exe|com|vb|vbs|vbe|vba|wsf|bat|cmd|pif|scr|hta|js|jse|jsp|chm|cpl|reg|lnk|ocx|dll|sys|msi|msu|mst|apk|bin|cgi|ps1)\n\N}}
        log_message = forbidden attachment: recipients=$recipients, content-type=$mime_content_type, attach_filename=$mime_filename
Все заработало, письма с вложениями в виде исполняемых файлов и архивов и исполняемыми файлами прекратились.
Но появились новые проблемы:

1. На днях в удаленном подразделении поймали шифровальщика, который имел расширение scr, и был упакован сначала в rar, затем в cab.
Фильтр mime, естественно, его пропустил. Попытался заблочить архивы, содержащие другие архивы - за пару дней пропустили несколько важных писем, пришлось отключить. Не вкурю, как проверять архивы с вложенностью. Напрашивается мысль об организации многоярусной конструкции из нескольких

Код: Выделить всё

${run{/usr/bin/7z l $mime_decoded_filename}}
с последующим deny, если вложенность архива превысит некий разумный предел, но как мне кажется, это :cz2: громоздко. Может кто-то предложить более изящное решение?

2. Вчера в другом удаленном подразделении поймали шифровальщика, на который в письме была дана ссылка. Вопрос к уважаемым коллегам: кто как с такой бедой борется? Антивирус с последними базами на самой машине и связка squid+clamav+blacklists на прокси всё это пропустили, ибо дрвэбы, касперские и прочие не могут своевременно реагировать на каждое творение вирусописателей. Права у пользователя - птичьи, обновления у браузера - последние. :st: Отключить интернет вообще? Разбирать письмо построчно и косить из него все "http://" или "www." Запилить на маршрутизаторе snort и дропать все пакеты, которые он посчитает исполняемым кодом? Так это не спасёт, если вирус в архиве, я правильно понимаю?

3. Пока игрался с фильтром, заметил, что Exim у меня пропускает исполняемые файлы, упакованные в bz2. С остальными - порядок. Озадачился. Вызвал ручками в bash

Код: Выделить всё

"run{/usr/bin/7z l $filename"
для 7z и для bz2. Вывод у команд идентичный. Недоумеваю...

3. Никак не могу приучить пользователей к тому, что почтовик не дает отправлять письма с архивами, в которых есть исполняемые файлы. В каждом отдельном случае приходится подключаться к пользователю, смотреть содержимое его архива и тыкать носом во вложенный sfx-архив, vb-скрипт и т.д. Хотелось бы добиться, чтобы в error-сообщении пользователю указывалось не только имя проблемного архива, но и запрещенного файла внутри архива.
За счет строки конфа

Код: Выделить всё

message = Message contains executible files(s) in attachment $mime_filename
при попытке отправки письма с запрещенным вложением, пользователю выдается error c указанием проблемного архива, но не более.
Попытался хотя бы для начала вывести имя проблемного файла из архива в лог в таким макаром:

Код: Выделить всё

     set acl_c_dangerous_file = ${run{/usr/bin/7z l $mime_decoded_filename}}
     	condition = ${if match{${run{/usr/bin/7z l $mime_decoded_filename}}}{\N(?i)\.(exe|com|vb|vbs|vbe|vba|wsf|bat|cmd|pif|scr|hta|js|jse|jsp|chm|cpl|reg|lnk|ocx|dll|sys|msi|msu|mst|apk|bin|cgi|ps1)\n\N}}
        log_message = forbidden attachment: recipients=$recipients, content-type=$mime_content_type, attach_filename=$mime_filename, mime_content_description=$mime_content_description, contain_dangerous_file=$acl_c_dangerous_file
- не отрабатывает, переменная $acl_c_dangerous_file - пуста. Ткните, пожалуйста носом, где я затупил...
4. Аналогично хотелось бы организовать рикошет внешним корреспондентам, типа "Ваше письмо не может быть доставлено, поскольку вложенный архив "$mime_filename" содержит исполняемый файл "$acl_c_dangerous_file"", ибо административные меры воздействия не помогают.
Буду благодарен за любые свежие идеи, поскольку моя фантазия уже иссякла.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Ged
проходил мимо

Проблемы с фильтрацией писем с исполняемыми вложениями в архивах или ссылками на них в Exim.

Непрочитанное сообщение Ged » 2016-08-11 17:04:30

"run{/usr/bin/7z l $filename"
для 7z и для bz2. Вывод у команд идентичный. Недоумеваю...
Дело в том, что bz, gz и прочие, похоже, в каких-то случаях отдают имя файла равное имя архиву без расширения.
А так как мы имеем архив для проверки вида: /var/spool/exim/scan/1bXqXS-000KZK-9b/1bXqXS-000KZK-9b-00002
Соответственно и вложение у нас такого же вида:

Код: Выделить всё

 # 7z l /var/spool/antivir/1bXq2A-000H4k-JM-00004

7-Zip [64] 15.09 beta : Copyright (c) 1999-2015 Igor Pavlov : 2015-10-16
p7zip Version 15.09 beta (locale=C,Utf16=off,HugeFiles=on,64 bits,5 CPUs x64)

Scanning the drive for archives:
1 file, 138784 bytes (136 KiB)

Listing archive: /var/spool/antivir/1bXq2A-000H4k-JM-00004

--
Path = /var/spool/antivir/1bXq2A-000H4k-JM-00004
Type = bzip2

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
                    .....                            1bXq2A-000H4k-JM-00004~
------------------- ----- ------------ ------------  ------------------------
                                             138784  1 files

Код: Выделить всё

 # 7z l /var/spool/antivir/1bXq2A-000H4k-JM-00004.src.gz

7-Zip [64] 15.09 beta : Copyright (c) 1999-2015 Igor Pavlov : 2015-10-16
p7zip Version 15.09 beta (locale=C,Utf16=off,HugeFiles=on,64 bits,5 CPUs x64)

Scanning the drive for archives:
1 file, 138784 bytes (136 KiB)

Listing archive: /var/spool/antivir/1bXq2A-000H4k-JM-00004.src.gz

--
Path = /var/spool/antivir/1bXq2A-000H4k-JM-00004.src.gz
Open WARNING: Can not open the file as [gzip] archive
Type = bzip2

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
                    .....                            1bXq2A-000H4k-JM-00004.src
------------------- ----- ------------ ------------  ------------------------
                                             138784  1 files

Вот такая беда. Сам так и не разобрался?

qursar
проходил мимо
Сообщения: 2
Зарегистрирован: 2016-02-11 9:14:55

Проблемы с фильтрацией писем с исполняемыми вложениями в архивах или ссылками на них в Exim.

Непрочитанное сообщение qursar » 2016-09-06 16:53:45

Ged писал(а): Дело в том, что bz, gz и прочие, похоже, в каких-то случаях отдают имя файла равное имя архиву без расширения.
Признаться, не обратил внимания, но, кажется, такого не было... Хотя не знаю. Обошел проблему использованием персонально для bz2 другого архиватора
Ged писал(а): Вот такая беда. Сам так и не разобрался?
Разобрался. но не сам :oops: . Мой коллега предложил использовать вызов deepfind в кондишине:

Код: Выделить всё

condition = ${if match{${run{/usr/bin/deepfind $mime_decoded_filename}}}{\N(?i)\.(exe|com|vb|vbs|vbe|vba|wsf|bat|cmd|pif|scr|hta|js|jse|jsp|chm|cpl|reg|ocx|dll|sys|msi|msu|mst|apk|cgi|ps1)\n\N}}
Сейчас многократно упакованные вложения корректно проверяются, своим при попытке отправки такого добра вылетает error в почтовом клиенте, чужим уходит рикошет с именем файла. Секция конфа, отвечающая за проверку архивов, теперь самая громоздкая во всем конфе.
Причем уже приходили вирусы в файлах docm, xlsx, в виде бинарных частей, форматы офиса тоже пришлось добавить в список проверяемых.
В результате, режется довольно много - за сутки по несколько сотен писем.

Лог читаю, умиляюсь, вот же творческие люди:

Код: Выделить всё

<письмо бла-бла-бла> rejected during MIME ACL checks: check.sh forbidden attachment: recipients=<бла-бла-бла>, content-type=application/x-zip-compressed, attach_filename=Скан-копия документов.zip, mime_content_description=, contain_dangerous_file=Скан-кoпия - 6 сентября 2016. Срочно сверяемся. Подписано главным бухгалтерoм. Экспортировано из 1С.js

lintech
рядовой
Сообщения: 19
Зарегистрирован: 2010-11-19 17:24:23

Проблемы с фильтрацией писем с исполняемыми вложениями в архивах или ссылками на них в Exim.

Непрочитанное сообщение lintech » 2016-12-21 23:10:20

qursar писал(а): Лог читаю, умиляюсь, вот же творческие люди:

Код: Выделить всё

<письмо бла-бла-бла> rejected during MIME ACL checks: check.sh forbidden attachment: recipients=<бла-бла-бла>, content-type=application/x-zip-compressed, attach_filename=Скан-копия документов.zip, mime_content_description=, contain_dangerous_file=Скан-кoпия - 6 сентября 2016. Срочно сверяемся. Подписано главным бухгалтерoм. Экспортировано из 1С.js
Подскажите как добились чтоб contain_dangerous_file выдавал в лог обнаруженный файл с запрещённым расширением ?


doker
сержант
Сообщения: 207
Зарегистрирован: 2008-11-18 16:20:26

Проблемы с фильтрацией писем с исполняемыми вложениями в архивах или ссылками на них в Exim.

Непрочитанное сообщение doker » 2016-12-25 13:56:52

чтобы не плодить темы я сюда напишу ,если не возражаете.
Exim version 4.80

проблема - фильтр не срабатывает для запакованного в zip файла с именем в кириллице когда exim в режиме демона
есть механизм фильтрации по вложениям

Код: Выделить всё

acl_check_mime:

  warn
       condition = ${if match{$mime_filename}{\N(?i)\.(zip|rar|tgz|tar|7z)$\N}}
       condition = ${if def:sender_host_address}
       decode = default
       condition = ${if or{{match{${run{/usr/bin/unzip -l $mime_decoded_filename}}}{\N(?i)\.(jse|wsf|zip|rar|tgz|tar|7z|exe|com|vbs|bat|pif|scr|hta|js|cmd|chm|cpl|jsp|reg|vbe|lnk|dll|sys|jar)\n\N}}\
                           {match{${run{/usr/bin/unrar l $mime_decoded_filename}}}{\N(?i)\.(jse|wsf|zip|rar|tgz|tar|7z|exe|com|vbs|bat|pif|scr|hta|js|cmd|chm|cpl|jsp|reg|vbe|lnk|dll|sys|jar)\n\N}}\
                           {match{${run{/bin/tar -tf $mime_decoded_filename}}}{\N(?i)\.(jse|wsf|zip|rar|tgz|tar|7z|exe|com|vbs|bat|pif|scr|hta|js|cmd|chm|cpl|jsp|reg|vbe|lnk|dll|sys|jar)\n\N}}\
                           {match{${run{/usr/bin/7z l $mime_decoded_filename}}}{\N(?i)\.(jse|wsf|zip|rar|tgz|tar|7z|exe|com|vbs|bat|pif|scr|hta|js|cmd|chm|cpl|jsp|reg|vbe|lnk|dll|sys|jar)\n\N}}\
                            }}
        set acl_m0 = 33
         set acl_m1 =  A arhive attachment contains a Windows-executable file - blocked because we are afraid of new viruses not recognized [yet] by antiviruses.
        set acl_m2= $sender_address
        set acl_m3 = 1 #не посылаь в архив

  warn
       condition = ${if def:sender_host_address}
       log_message = forbidden attachment: filename=$mime_filename, content-type=$mime_content_type, recipients=$recipients
       condition = ${if or{{match{$mime_content_type}{(?i)executable}}{match{$mime_filename}{\N(?i)\.(jse|wsf|exe|com|vbs|bat|pif|scr|hta|js|cmd|chm|cpl|jsp|reg|vbe|lnk|dll|sys|jar)$\N}}}}
        set acl_m0 = 33
         set acl_m1 =  A arhive attachment contains a Windows-executable file - blocked because we are afraid of new viruses not recognized [yet] by antiviruses.
        set acl_m2= $sender_address
        set acl_m3 = 1 #не посылаь в архив


  accept
вроде работает , пользователям отлупы приходят . но сегодня фильтром пропускается письмо с архивом. в архиве 2 файла, pdf и js. имена кириллицей в win 1251 (вместе с точкой, вельми подозрительно ) . А вот теперь самое интересное - в отладочном режиме exim -d+all -bd (и от рута и sudo -u Debian-exim) всё ок и письмо фильтруется , а в штатном режиме - демоном, пропускает.
вложенные файлы :
Акт сверки от 14 марта 2016 года. Реестр первичной документации. Составлено в 1С Бухгалтерия.8c04_tхt .js
Структурная схема.pdf

cat /etc/default/locale
# File generated by update-locale
LANG="ru_RU.UTF-8"

латинскими и в режиме демона всё ок

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

Отправлено спустя 7 минут 50 секунд:
sudo -u Debian-exim unzip -l /var/spool/exim4/scan/1.zip
Archive: /var/spool/exim4/scan/1.zip
Length Date Time Name
--------- ---------- ----- ----
57580 2015-05-28 10:29 Акт сверки от 14 марта 2016 года. Реестр первичной документации. Составлено в 1С Бухгалтерия.8c04_tхt .js
53817 2014-10-07 13:17 Структурная схема.pdf
--------- -------
111397 2 files

doker
сержант
Сообщения: 207
Зарегистрирован: 2008-11-18 16:20:26

Проблемы с фильтрацией писем с исполняемыми вложениями в архивах или ссылками на них в Exim.

Непрочитанное сообщение doker » 2016-12-26 10:04:15

удалил unzip распаковку и передвинул на первое место 7z, заработал... шайтан

doker
сержант
Сообщения: 207
Зарегистрирован: 2008-11-18 16:20:26

Проблемы с фильтрацией писем с исполняемыми вложениями в архивах или ссылками на них в Exim.

Непрочитанное сообщение doker » 2017-01-10 15:10:51

не, нифига не заработало, если в архиве файл с кири лицей он его пропускает.. продолжаю копать

Отправлено спустя 46 секунд:
накопал ,
{match{${run{/usr/bin/unzip -v -O WIN-1251 $mime_decoded_filename}}}{\N(?i)\.(APP)\n\N}}
ай эм хаппи ))



Аватара пользователя
xM
ст. лейтенант
Сообщения: 1316
Зарегистрирован: 2009-01-15 23:57:41
Откуда: Königsberg
Контактная информация:

Проблемы с фильтрацией писем с исполняемыми вложениями в архивах или ссылками на них в Exim.

Непрочитанное сообщение xM » 2017-01-11 23:02:20

doker писал(а): 7z замечательно отрабатывает
У вас в строкe unzip с прямым указанием кодировки, а не 7z
IT voodoo blog https://kostikov.co

doker
сержант
Сообщения: 207
Зарегистрирован: 2008-11-18 16:20:26

Проблемы с фильтрацией писем с исполняемыми вложениями в архивах или ссылками на них в Exim.

Непрочитанное сообщение doker » 2017-01-12 9:37:35

xM писал(а): У вас в строкe unzip с прямым указанием кодировки, а не 7z
именно )))

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Проблемы с фильтрацией писем с исполняемыми вложениями в архивах или ссылками на них в Exim.

Непрочитанное сообщение Alex Keda » 2017-04-04 17:49:00

я чего-то недогоняю - всех прёт чтоли одни и те же шаблоны по сто раз копировать?

сегодня обновил один из серверов, отлетела часть старого конфига =)
приятной неожиданностью оказалось что все ссылки гуглов/яндексов ведут сюда, на форум =)

в первом приближении вышло так, пока тестирую, наверное чегнить выкину и допишу.
deepfind - это из пакета deskutils/strigiutils

Код: Выделить всё

mx# grep -A 3 макросы /usr/local/etc/exim/configure
# макросы
EXE_PATTERNS = apk|cgi|js|jse|jsp|wsf|exe|com|vb|vba|vbs|vbe|bat|pif|ps1|scr|hta|cmd|chm|cpl|reg|lnk|dll|sys|jar|ocx|msi|msu|mst
ARCH_PATTERNS = bz2|zip|rar|7z|cab|ace|7za|lah|lzo|lzx|gz|arj|bin|msi|cbr|deb|rpm|gzip|jar|pak|pkg|tar-gz|tgz|xar|zipx|wim|tb2|tar|paq|xz|iso|jar|lzh|lzma|pak|pk3|pk4|smzip|u3p|xpi|zipx|cpio|xar|lz|rk|zoo|img|ha

Код: Выделить всё

mx# cat  /usr/local/etc/exim/includes/450.acl_check_mime.conf
#

# Проверка вложений на исполняемые файлы
deny    message                 = We do not accept attachments like: $mime_filename
        condition               = ${if or{{match{$mime_content_type}{(?i)executable}}{match{$mime_filename}{\N(?i)\.(EXE_PATTERNS)$\N}}}}
        log_message             = Rejected mail with executable attachement: filename=$mime_filename, content-type=$mime_content_type, recipients=$recipients

deny    message                 = We do not accept attachments/deepfind like: $mime_filename
        condition               = ${if match{$mime_filename}{\N(?i)\.(ARCH_PATTERNS)$\N}}
        decode                  = default
        condition               = ${if match{${run{/usr/local/bin/deepfind $mime_decoded_filename}}}{\N(?i)\.(EXE_PATTERNS)\n\N}}
        log_message             = Rejected mail with executable/deepfind attachement: filename=$mime_filename, content-type=$mime_content_type, recipients=$recipients


deny    message                 = A arhive attachment contains a Windows-executable file - blocked because we are afraid of new viruses not recognized [yet] by antiviruses.
        condition               = ${if match{$mime_filename}{\N(?i)\.(zip|rar|tgz|tar|gz|7z)$\N}}
        condition               = ${if def:sender_host_address}
        decode                  = default
        condition               = ${if or{\
                                        {match{${run{/usr/local/bin/unzip -l $mime_decoded_filename}}}{\N(?i)\.(EXE_PATTERNS)\n\N}}\
                                        {match{${run{/usr/local/bin/unrar l $mime_decoded_filename}}}{\N(?i)\.(EXE_PATTERNS)\n\N}}\
                                        {match{${run{/usr/bin/tar -tf $mime_decoded_filename}}}{\N(?i)\.(EXE_PATTERNS)\n\N}}\
                                        {match{${run{/usr/local/bin/7z l $mime_decoded_filename}}}{\N(?i)\.(EXE_PATTERNS)\n\N}}}}
        log_message             = forbidden arhive attachment: filename=$mime_filename, content-type=$mime_content_type, recipients=$recipients


accept
Убей их всех! Бог потом рассортирует...