Блог ИТ склеротика. Exim: если спамеры указывают "Return-path" один (MAIL FROM), а заголовок "From" - другой

Страницы

Расширенный поиск в статьях блога

16 марта 2012 г.

Exim: если спамеры указывают "Return-path" один (MAIL FROM), а заголовок "From" - другой

На своей шкуре я прочуствовал одну хитрость спамеров: когда они в сессии SMTP принимающему серверу в команде "MAIL FROM" заявляют один обратный адрес (например, реальный), а в теле письма, в заголовке "From" указывают обратный адрес тот-же, на который отправляют письмо (или просто из Вашего домена).


Получается, что:
а) Сам сервер SMTP, принимающий почту (любой, не обязательно Exim) - видит, что письмо пришло не с его внутренного домена (по записи MAIL FROM), SMTP-авторизацию при этом не требует и принимает письмо.
б) А демон SpamAssassin потом, разбирая письмо, видит заголовок "From = адрес из Вашего домена" и, т.к. у большинства админов в SpamAssassin их собственный же домен находится в белом списке (т.е. почта, у которой домен From - это почтовый домен организации), то SpamAssasin эту почту пропускает.
Вот пример. Для примера домен Вашей организации: myfirm.ru. В SpamAssassin прописано, что вся почта из домена myfirm.ru - белая, т.е. ее даже проверять не надо.
Приходит спам на почту manager@myfirm.ru. И выглядит все примерно так:
1) Приходит письмо с
SMTP "MAIL FROM: <yablinspamervashe@kakoitodomen.ru>";
Header "From: <manager@myfirm.ru>";
2) Т.к. домен "kakoitodomen.ru" не принадлежит к тем доменам, которые обслуживает сам сервер (т.е. это не "myfirm.ru"), и т.к. сервер в этот момент еще не видит тела письма, то он пропускает все это без SMTP-авторизации как обычное входящее письмо откуда-то.
3) Получив письмо, сервер передает его в SpamAssassin для проверки.
4) SpamAssassin, увидев в заголовке "From = manager@myfirm.ru" - сверяет его с белым списком и видит, что письма от "*@myfirm.ru" - даже проверять не надо. На то, что при этом письмо на самом деле пришло с ящика, указанного в заголовке "From" - SpamAssassin внимания не обращает.
5) SpamAssassin говорит, что письмо не спам (основываясь на данных From) и сервер SMTP это письмо успешно ложит в папку входящих для manager@myfirm.ru.
В остатке имеем: письмо является спамом, спамер обманул как сервер SMTP, так и SpamAssassin, и письмо успешно доставлено во входящие человеку. Даже не проверясь!
Давайте научим сервер Exim (я тут привожу конфиг именно для него) сравнивать эти значения и отвергать письмо в случае, если:
а) Письмо пришло с домена, обслуживаемого сервером (внутренного домена);
б) В теле письмо домены полей From и Return-path неравны:
в секцию acl_check_data добавляем такую запись:

# Обламываем приход письма, если Return-Path (MAIL-FROM) домен !=
# домену заголовка From
deny  message = SPAM!  <Return-path> domain is not equals to <From> domain
# Сравниваем домены From и Return-path
      condition = ${if eq{${uc:${domain:$sender_address}}} \
                   {${uc:${domain:$rh_From:}}} {no}{yes}}
# Поле From не должно быть пустым
      condition = ${if eq{$rh_From:}{} {no}{yes}}
# Сравниваем, что сервер обслуживает этот домен
      condition = ${lookup mysql{SELECT domain FROM domains \
                   WHERE domain='${domain:$rh_From:}' \
                   AND active='1'}{yes}{no}}

В этом куске кода видно, что последнее сравнение основывается на MySQL запросе. Это справедливо для Exim, настроенного с использованием MySQL базы данных для хранения информации о пользователях и обслуживаемых доменах.
В конкретно данном случае, условие срабатывает, если MySQL в базе данных, в таблице "domains", в столбце "domain" находит имя домена, совпадающее с доменом из заголовка "From", при этом столбец "Active" должен содержать "1" - т.е. работа с этим доменом не заблокирована.
Для Вашей конкретной конфигурации, конечно, последнее условие может слегка отличаться. Его суть - это проверить, что домен из заголовка "From" обслуживается данным сервером.
Например, если сервер обслуживает всего один домен и не настроен на хранение информации о доменах в MySQL, весь блок может выглядеть так:

# Обламываем приход письма, если Return-Path (MAIL-FROM) домен !=
# домену заголовка From
deny  message = SPAM!  <Return-path> domain is not equals to <From> domain
# Сравниваем домены From и Return-path
      condition = ${if eq{${uc:${domain:$sender_address}}} \
                   {${uc:${domain:$rh_From:}}} {no}{yes}}
# Поле From не должно быть пустым
      condition = ${if eq{$rh_From:}{} {no}{yes}}
# Сравниваем, что сервер обслуживает этот домен
      condition = ${if eq{${uc:${domain:$rh_From:}}}{myfirm.ru}{yes}{no} }

Вот таким образом мы обломим у спамеров возможность обманывать наши сервера и присылать свой мусор.

.

Счетчик тИЦ и PR Яндекс.Метрика Msn bot last visit powered by MyPagerank.NetYahoo bot last visit powered by MyPagerank.Net ping fast  my blog, website, or RSS feed for Free