Почтовый шлюз: задание со звёздочкой (Донастройка антиспама на примере конкретных писем)

И в завершение хочу показать несколько примеров писем, и разбор "на что смотреть" и "как ловить". Из заголовков ничего не удалял, оно конечно несколько раздувает примеры, зато даёт реальное представление о типовом письме.

Пример #1

Образец с тупой vps-спамилки:

Envelope-to: atv@example.com
Delivery-date: Mon, 22 Feb 2016 07:51:44 +1000
Received: from s18200321.onlinehome-server.info ([212.227.95.64])
  by relay.example.com with esmtp (Exim 4.86)
  (envelope-from <krylov.408@mail.ru>)
  id 1aXbup-00062J-8c
  for atv@example.com; Mon, 22 Feb 2016 07:51:44 +1000
Received: by s18200321.onlinehome-server.info (Postfix, from userid 10006)
  id 047B939C0923C; Sun, 21 Feb 2016 15:14:20 -0600 (CST)
To: atv@example.com
Subject: =?utf-8?B?0J3QsNGB0YfQtdGCINGB0LXRgNGC0LjRhNC40LrQsNGC0LAg0L3QsCDQktCw0YjRgyDQv9GA0L7QtNGD0LrRhtC40Lg=?=
X-PHP-Originating-Script: 10006:hostdata111.php
From: =?utf-8?B?0JDQu9C10LrRgdCw0L3QtNGAICjQodC10YDQstC40YEg0YHQtdGA0YLQuNGE0LjQutCw0YbQuNC4KQ==?= <krylov.408@mail.ru>
Subject: =?utf-8?B?0J3QsNGB0YfQtdGCINGB0LXRgNGC0LjRhNC40LrQsNGC0LAg0L3QsCDQktCw0YjRgyDQv9GA0L7QtNGD0LrRhtC40Lg=?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8;
Content-Transfer-Encoding: base64
Message-Id: <20160221211420.047B939C0923C@s18200321.onlinehome-server.info>
Date: Sun, 21 Feb 2016 15:14:20 -0600 (CST)
X-ACL-Warn: "SPF softfail, greylisted"
X-Spam-Status: Yes
X-Spam-Score: 10.9 (++++++++++)
X-Spam-Report: Action: add header
 Symbol: IP_SCORE(0.18)
 Symbol: BROKEN_HEADERS(1.00)
 Symbol: MIME_GOOD(-0.10)
 Symbol: HEADER_FORGED_MAILRU_FROM(5.00)
 Symbol: HEADER_MAILER_PHP_GENERIC(2.00)
 Symbol: RBL_MAILSPIKE_BAD(1.00)
 Symbol: BAYES_SPAM(1.82)
 Message-ID: 20160221211420.047B939C0923C@s18200321.onlinehome-server.info

Здесь всё просто:

  • характерное helo. Такое или регистрируется пачками или ломается готовое на вордпрессе. Рассчитано на "разослать побольше и побыстрее, пока не грохнули по абузе"
  • характерные заголовки от php
  • с доменом отправителя сильно не заморачиваются: берётся популярный mail.ru, нет админа который будет его банить.

Решение простое: шаблон s[0-9]+\.onlinehome-server\.info -- в баню. Если владелец vps'а планирует с него рассылать почту - то не обломится сменить. Вообще, там уже есть шаблоны, которые дают отлуп на типовые комбинации типа vps[0-9]+ в helo, но здесь оно не сработало.

HEADER_FORGED_MAILRU_FROM -- собственная разработка.

Пример #2

Ниже приведены 2 образца писем: спам, прикидывающийся яндексом и нормальное письмо с яндекса.

Envelope-to: user@example.com
Delivery-date: Tue, 16 Feb 2016 21:35:14 +1000
Received: from [193.124.178.2] (helo=worldcrisis.ru)
  by relay.example.com with smtp (Exim 4.86)
  (envelope-from <ot-ingeneer@yandex.ru>)
  id 1aVduS-000DlE-Qp
  for user@example.com; Tue, 16 Feb 2016 21:35:14 +1000
Message-ID: <ED1759DABC685B18C4C1883074CE5361@yandex.ru>
Reply-To: =?windows-1251?B?0O7x8uX17eDk5+7w?= <ot-ingeneer@yandex.ru>
From: =?windows-1251?B?0O7x8uX17eDk5+7w?= <ot-ingeneer@yandex.ru>
To: <user@example.com>
Subject: =?windows-1251?B?3erx7+Xw8ujn4CDv8O7s4eXn7u/g8e3u8fLo?=
Date: Tue, 16 Feb 2016 14:35:06 +0300
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="0028a225f2c90e0631e74e42f2bf"
Disposition-Notification-To: <ot-ingeneer@yandex.ru>
X-ACL-Warn: "Bad rev hostname (missing)"
X-ACL-Warn: "SPF softfail, greylisted"
X-Spam-Status: Yes
X-Spam-Score: 10.5 (++++++++++)
X-Spam-Report: Action: add header
 Symbol: ONCE_RECEIVED(3.00)
 Symbol: HFILTER_HOSTNAME_UNKNOWN(4.00)
 Symbol: BROKEN_HEADERS(1.00)
 Symbol: MIME_GOOD(-0.10)
 Symbol: RBL_SORBS_RECENT(1.50)
 Symbol: DMARC_POLICY_SOFTFAIL(1.10)
 Symbol: IP_SCORE(0.00)
 Message-ID: ED1759DABC685B18C4C1883074CE5361@yandex.ru

На что можно обратить внимание:

  • этому письму не хватает одного балла для отлупа (проходной балл: ниже 11.5, сейчас - 10.5)
  • домен зарегистрирован недавно (RBL_SORBS_RECENT)
  • не признаков пересылки (ONCE_RECEIVED)
  • нет dns-ptr для хоста (HFILTER_HOSTNAME_UNKNOWN)
  • в helo нет никакого намёка на яндекс
  • присутствует запрос уведомления (Disposition-Notification-To)
  • "Кому" выглядит подозрительно (нет описательной части, в этом случае адрес пишется без <>)
  • DMARC яндекса намекает, что это не его письмо (DMARC_POLICY_SOFTFAIL)

Далее, валидное письмо от яндекса:

Envelope-to: user@example.com
Delivery-date: Tue, 16 Feb 2016 18:43:13 +1000
Received: from forward10o.cmail.yandex.net ([37.9.109.60])
  by relay.example.com with esmtp (Exim 4.86)
  (envelope-from <a3315882@yandex.ru>)
  id 1aVbE0-0008zp-My
  for user@example.com; Tue, 16 Feb 2016 18:43:13 +1000
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail;
  t=1455612184; bh=xnE5qv8t++sZTBq4cdaUHABDW5pRpnDipt7Ya4T8YCI=;
  h=From:To:Subject:Date;
  b=ImXxDJBNMet63EPHoq+N2sUWkLwO443b307O0PLvQODSoTbtXJDRINksUQqW94JIc
   EYjJ1lxVpznRJAqiEqiYcg3F7ia4NK410kNDnXqdMYZ/SAM0p/D1WRBF7J9IUJDe9s
   xAfPSOBA42x3BcBGXivmKXhTo1uUDgIyXtbfUS0Y=
Received: by web24o.yandex.ru with HTTP;
  Tue, 16 Feb 2016 11:42:59 +0300
From: =?koi8-r?B?8MHSyM/Nxc7LzyDhzsHT1MHTydE=?= <a3315882@yandex.ru>
Envelope-From: a3315882@yandex.ru
To: =?koi8-r?B?8c4g88XNxc7P18neIOHMxcvTwc7E0s/X08vJyg==?= <admin@intermost.ru>,
Subject: =?koi8-r?B?8/T87PM6INDP18XT1MvB?=
MIME-Version: 1.0
Message-Id: <2356061455612179@web24o.yandex.ru>
X-Mailer: Yamail [ http://yandex.ru ] 5.0
Date: Tue, 16 Feb 2016 11:42:59 +0300
Content-Type: multipart/mixed;
  boundary="----==--bound.235607.web24o.yandex.ru"
X-Spam-Status: Yes
X-Spam-Score: 6.3 (++++++)
X-Spam-Report: Action: add header
 Symbol: DMARC_POLICY_ALLOW(-0.50)
 Symbol: MIME_GOOD(-0.10)
 Symbol: R_SPF_ALLOW(0.00)
 Symbol: R_DKIM_ALLOW(0.00)
 Symbol: RCVD_IN_DNSWL_LOW(0.00)
 Symbol: BROKEN_HEADERS(1.00)
 Symbol: IP_SCORE(0.00)
 Symbol: MIME_HTML_ONLY(1.00)
 Symbol: BAYES_SPAM(4.92)
 Symbol: RWL_MAILSPIKE_VERYGOOD(0.00)
 Message: (SPF): spf allow
 Message-ID: 2356061455612179@web24o.yandex.ru

Что здесь можно отметить:

  • есть DKIM (DKIM-Signature), но на его наличие/отсутствие нельзя полагаться
  • есть специфичный X-Mailer, но это ничего не даёт (в данном случае письмо написано через браузер)
  • в helo/dns-ptr есть "yandex". Это уже серьёзно, можно использовать.

К сожалению мы не можем полагаться на softfail dmarc'а. Так уж сложилось, что админы очкуют включать строгий режим spf и всего остального.

Что можно сделать на основе отмеченного выше:

Вариант первый - учитывать наличие "yandex" в helo/ptr. Это будет работать, но: яндекс может переделать dns в любой момент, а helo подделывается без проблем.

Вариант второй - считать softfail - fail'ом. Нарушает стандарт, и кроме того яндекс тоже может налажать с настройкой у себя. Пример - timeweb, где в spf сейчас упомянуты 4 из 8 его /24 блоков.

Вариант третий - смотреть на наличие нескольких признаков. Причём постараться сделать так, чтоб применялось не только к яндексу, но и всем остальным доменам.

Для этого можно использовать композиты из rspamd. Правило будет выглядеть примерно так:

composite {
  name = "CMP_ZOMBIE_HOST";
  expression = "ONCE_RECEIVED & (HFILTER_HOSTNAME_UNKNOWN | RBL_SORBS_RECENT)";
}

Учтите, что при совпадении из итогового score убираются баллы для всех "символов", используемых в композите, а вместо них добавляется score самого композита. По этой причине не имеет смысла ставить score для композита меньше, чем сумма score компонентов, используемых в нём. Разбивка по символам из первого примера после добавления композита.

X-Spam-Score: 12.0 (++++++++++)
X-Spam-Report: Action: reject
 Symbol: CMP_ZOMBIE_HOST(10.0)
 Symbol: BROKEN_HEADERS(1.00)
 Symbol: MIME_GOOD(-0.10)
 Symbol: DMARC_POLICY_SOFTFAIL(1.10)
 Symbol: IP_SCORE(0.00)

Пример #3

Envelope-to: andrey@example.com
Delivery-date: Wed, 24 Feb 2016 16:52:17 +1000
Received: from webmail.jaivalores.com ([190.99.97.33])
  by relay.example.com with esmtp (Exim 4.86)
  (envelope-from <mrv@e-kontakti.fi>)
  id 1aYTIz-000NEU-PN
  for andrey@example.com; Wed, 24 Feb 2016 16:52:17 +1000
Received: from localhost (localhost [127.0.0.1])
  by webmail.jaivalores.com (Postfix) with ESMTP id A32AB1008B1B4;
  Wed, 24 Feb 2016 03:46:19 -0300 (ART)
Received: from webmail.jaivalores.com ([127.0.0.1])
  by localhost (webmail.jaivalores.com [127.0.0.1]) (amavisd-new, port 10032)
  with ESMTP id a_uAdk3M_wcO; Wed, 24 Feb 2016 03:46:18 -0300 (ART)
Received: from localhost (localhost [127.0.0.1])
  by webmail.jaivalores.com (Postfix) with ESMTP id 205CD10067F7A;
  Wed, 24 Feb 2016 03:46:18 -0300 (ART)
X-Virus-Scanned: amavisd-new at jaivalores.com
Received: from webmail.jaivalores.com ([127.0.0.1])
  by localhost (webmail.jaivalores.com [127.0.0.1]) (amavisd-new, port 10026)
  with ESMTP id S7yoVxtnqn1O; Wed, 24 Feb 2016 03:46:17 -0300 (ART)
Received: from fuzik-i (unknown [172.16.210.2])
  by webmail.jaivalores.com (Postfix) with SMTP id 836B310067F4D;
  Wed, 24 Feb 2016 03:45:12 -0300 (ART)
Message-ID: <888D3B6863B7981BC7C28B36126DFDB6@e-kontakti.fi>
From: =?windows-1251?B?yu7x8ujtINHl8OPl6Q==?= <mrv@e-kontakti.fi>
To: =?windows-1251?B?wOvr4CDC6Ory7vDu4u3g?= <igla@rock.ru>
Subject: =?windows-1251?B?zeDr7uPu7uHr7ubl7ejlICDw7vHx6Onx6uj1?=
  =?windows-1251?B?ICAsICDo7e7x8vDg7e379SDv5fDl4u7n9+jq?=
  =?windows-1251?B?7uIg6CDy8ODt8e/u8PLt7i396vHv5eTo9uju?=
  =?windows-1251?B?7e379SAg?=
Date: Wed, 24 Feb 2016 09:44:37 +0300
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="3fba5f4ee74af078ab79c87b5149"
X-Spam-Status: Yes
X-Spam-Score: 9.5 (+++++++++)
X-Spam-Report: Action: add header
 Symbol: FORGED_RECIPIENTS(4.00)
 Symbol: BROKEN_HEADERS(1.00)
 Symbol: MIME_GOOD(-0.10)
 Symbol: BAYES_SPAM(4.56)
 Message-ID: 888D3B6863B7981BC7C28B36126DFDB6@e-kontakti.fi

This is a multi-part message in MIME format.

--3fba5f4ee74af078ab79c87b5149
Content-Type: multipart/alternative; boundary="5dc500c2a88f3b25fa6fd09178ed"


--5dc500c2a88f3b25fa6fd09178ed
Content-Type: text/plain; charset="windows-1251"
Content-Transfer-Encoding: quoted-printable

=C8=ED=F4=EE=F0=EC=E0=F6=E8=FF =E2=EE =E2=EB=EE=E6=E5=ED=ED=EE=EC =F4=E0=E9=
=EB=E5

--5dc500c2a88f3b25fa6fd09178ed
Content-Type: text/html; charset="windows-1251"
Content-Transfer-Encoding: quoted-printable

<HTML><HEAD>
<META http-equiv=3D"Content-Type" content=3D"text/html; charset=3Dwindows=
-1251">
</HEAD>
<BODY bgColor=3D#ffffff>
<DIV align=3Dleft><FONT size=3D2 face=3DArial>=C8=ED=F4=EE=F0=EC=E0=F6=E8=
=FF =E2=EE =E2=EB=EE=E6=E5=ED=ED=EE=EC=20
=F4=E0=E9=EB=E5</FONT></DIV></BODY></HTML>

--5dc500c2a88f3b25fa6fd09178ed--

--3fba5f4ee74af078ab79c87b5149
Content-Type: application/msword; name="=?windows-1251?B?wu3l+O3l/eru7e7s6Pfl8erg/yDk5f/y5ev8?=
  =?windows-1251?B?7e7x8vwsIMLg6/7y7e7lIPDl4/Pr6PDu4uDt?=
  =?windows-1251?B?6OUsIMHz9fP35fIuZG9j?="
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="=?windows-1251?B?wu3l+O3l/eru7e7s6Pfl8erg/yDk5f/y5ev8?=
  =?windows-1251?B?7e7x8vwsIMLg6/7y7e7lIPDl4/Pr6PDu4uDt?=
  =?windows-1251?B?6OUsIMHz9fP35fIuZG9j?="

Здесь мы видим вполне валидный хост, который сам принял письмо от какого-то явного пидараса Received: from fuzik-i (unknown [172.16.210.2]), а теперь пытается его переслать нам.

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

В теле письма минимум текста "Информация во вложенном файле", и одно вложение со скучным названием "Внешнеэкономическая деятельность, Валютное регулирование, Бухучет.doc". Такое шлют десятками в день и больше по работе.

Однако, мы точно знаем, что это спам. Поэтому по вложению мы и сможем дать отлуп. Здесь сработает механизм fuzzy-хешей, которые умеет считать rspamd. Добавляется оно примерно так:

HOST="127.0.0.1"
PASS="123456789"
rspamc -h "$HOST" -P "$PASS" -f 1 -w 5 fuzzy_add "/path/to/file/with/attachment"

Нужное значение -f берётся из конфига: FUZZY_DENIED { max_score = 20.0; >>> flag = 1; <<< }

К оглавлению