image Привет, GT! Я прочитал пост MikhailNsk, и мой мозг перенес меня в 2016 год, где я случайно наткнулся на проблему с подменой адресов у Яндекс.Почты. Сама угроза заключается в том, что письма, с точки зрения, DMARC и SPF являются полностью валидными. Этому подвержены не только пользователи Почты, но и организации, которые используют в качестве почтовика со своим доменом Яндекс.ПДД и Яндекс.Коннект (для примера, это всем известный и везде рекламируемый «майловский» GeekBrains), а это уже куда серьезнее. Уязвимость на данный момент работает, письмо проходит все проверки и доставляется куда-угодно (включая GMAIL). Реализация и реакция Яндекса под катом.

Внимание! Приведенный ниже алгоритм воспроизведения уязвимости предоставлен исключительно в образовательных целях!

Реализация уязвимости


Сама суть очень проста, Яндекс позволяет авторизоваться под одним адресом, а отправлять с любого другого, где прописаны DMARC и SPF правила Яндекса, а еще письмо подписывается валидной DKIM подписью yandex.ru.

Для реализации нам потребуется почтовый ящик на Яндексе и сторонний почтовый клиент (мой выбор пал на открытый и функциональный Thunderbird).

К последнему мы прикручиваем свой почтовый ящик от Яндекса, открываем окно отправки письма



Меняем адрес отправителя на нужный нам (в нашем случае на i@yandex.ru)



И отправляем письмо куда-нибудь



На гуглопочту (как и на любую другую) письмо пришло нормально. Гугл показывает карточку, что все гуд:



Исходник письма
Delivered-To: @gmail.com
Received: by 10.31.164.6 with SMTP id n6csp2248696vke;
Thu, 10 Aug 2017 09:17:13 -0700 (PDT)
X-Received: by 10.46.33.9 with SMTP id h9mr3821349ljh.52.1502381833140;
Thu, 10 Aug 2017 09:17:13 -0700 (PDT)
ARC-Seal: i=1; a=rsa-sha256; t=1502381833; cv=none;
d=google.com; s=arc-20160816;
b=CM0dF4giYDl9jToC/17FjHIeiQNsfFaDUxcYErv/RAHKrX+8PIdx0QabF/kUMVelug
ESNfNVYYv09sIrZsYSgqnmKlVdPbQYkmr0mSE+oZ2cjIhebKQcfQjKARk+6LLFOrtNSb
M1O014IAXh+y+ykx2EEyhyWir1y+SWItjS2ukNN19t9GwY91hjFtd+0T2OQDvC44qjpW
ztHKTCTNne0+NhMRYg2iSL0uQZkkpeUNNKgkRavCJRKgnjtMOuLqtx0uNLfZex34XcBl
vtZTfThoUeuzBPmHVVnnE+W8lcLoqTG2/jr4C4E4VNDHrjUCsDecNNfGYf5/BajX45n0
BdsQ==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816;
h=content-language:content-transfer-encoding:mime-version:user-agent
:date:message-id:subject:from:to:dkim-signature:dkim-signature
:arc-authentication-results;
bh=AOjHaT+yDXpmJsW3LSDugt7u95YQzsSxsGi10r66W3Y=;
b=Edjq07PU+c0nie1ia60SrVoI219rb8q/OnUJMtf0tJrFPktG29Pqs4fx7E3DsNvH6l
PPdsJVsvHDl3nIWqVSASAXaTPELSAXYETQ/zuluD+wrR2n7MXNt8QQ8cUqt7Zae8Wkq2
Yr3cW+9Ty3VZEi2TzqRzOU3UNNhds+UHa8o6/LK3N7NN91INYevsNnrfMBSUvqm6HmMi
AJ7dHkkwqqKX7XNkIvKNVjyq8FhnVfMiow8N/PCsVqtTly+q825p5kOl3hxqbLMsi3ix
AL3MGC84U/m8+dvivNege5yDby/Dfp6uY6jHJL/hOVmmUwT1/y2F+5SD/ifuS4EX2gI7
geLg==
ARC-Authentication-Results: i=1; mx.google.com;
dkim=pass header.i=@yandex.ru header.s=mail header.b=T2n/cJmZ;
dkim=pass header.i=@yandex.ru header.s=mail header.b=T2n/cJmZ;
spf=pass (google.com: domain of 42@yandex.ru designates 37.140.190.181 as permitted sender) smtp.mailfrom=42@yandex.ru;
dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=yandex.ru
Return-Path: <42@yandex.ru>
Received: from forward101o.mail.yandex.net (forward101o.mail.yandex.net. [37.140.190.181])
by mx.google.com with ESMTPS id 128si582786lfz.671.2017.08.10.09.17.12
for <@gmail.com>
(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
Thu, 10 Aug 2017 09:17:13 -0700 (PDT)
Received-SPF: pass (google.com: domain of 42@yandex.ru designates 37.140.190.181 as permitted sender) client-ip=37.140.190.181;
Authentication-Results: mx.google.com;
dkim=pass header.i=@yandex.ru header.s=mail header.b=T2n/cJmZ;
dkim=pass header.i=@yandex.ru header.s=mail header.b=T2n/cJmZ;
spf=pass (google.com: domain of 42@yandex.ru designates 37.140.190.181 as permitted sender) smtp.mailfrom=42@yandex.ru;
dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=yandex.ru
Received: from mxback1o.mail.yandex.net (mxback1o.mail.yandex.net [IPv6:2a02:6b8:0:1a2d::1b])
by forward101o.mail.yandex.net (Yandex) with ESMTP id 919D813416EA
for <@gmail.com>; Thu, 10 Aug 2017 19:17:12 +0300 (MSK)
Received: from smtp1o.mail.yandex.net (smtp1o.mail.yandex.net [2a02:6b8:0:1a2d::25])
by mxback1o.mail.yandex.net (nwsmtp/Yandex) with ESMTP id 3IjaA941Wl-HCe4hwWw;
Thu, 10 Aug 2017 19:17:12 +0300
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1502381832;
bh=AOjHaT+yDXpmJsW3LSDugt7u95YQzsSxsGi10r66W3Y=;
h=To:From:Subject:Message-ID:Date;
b=T2n/cJmZ2jEcX5rX5exetDc2VfT1lhVgPkMXfbIFAmw8PE6iLFkdddO7f67IRKfrb
KNV7U5whs9PUhGRd0S2x5OULF8VC3QXMSEvXJiM5gSxZdbNNNq2GRDpTkxbJiDASDT
A2DYgoRtpFzN64wX4EnSEmya/D24mP43VOi2TlAc=
Received: by smtp1o.mail.yandex.net (nwsmtp/Yandex) with ESMTPSA id i5ALruo2pE-HC4WKA0l;
Thu, 10 Aug 2017 19:17:12 +0300
(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))
(Client certificate not present)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yandex.ru; s=mail; t=1502381832;
bh=AOjHaT+yDXpmJsW3LSDugt7u95YQzsSxsGi10r66W3Y=;
h=To:From:Subject:Message-ID:Date;
b=T2n/cJmZ2jEcX5rX5exetDc2VfT1lhVgPkMXfbIFAmw8PE6iLFkdddO7f67IRKfrb
KNV7U5whs9PUhGRd0S2x5OULF8VC3QXMSEvXJiM5gSxZdbNNNq2GRDpTkxbJiDASDT
A2DYgoRtpFzN64wX4EnSEmya/D24mP43VOi2TlAc=
Authentication-Results: smtp1o.mail.yandex.net; dkim=pass header.i=@yandex.ru
To: @gmail.com
From: Habratest <i@yandex.ru>
Subject: Test fot Habr
Message-ID: <48942373-b6c4-d019-a15f-6aeaeeda39df@yandex.ru>
Date: Thu, 10 Aug 2017 21:17:10 +0500
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101
Thunderbird/52.2.1
MIME-Version: 1.0
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit
Content-Language: en-US

Hbrahabrahabrahabrahabrahabrahabrahabrahabrahabrahabrahabrahabra

Адрес получателя был заменен на @gmail.com, настоящий адрес на 42@yandex.ru

Мораль и ответ Яндекса


Данная уязвимость создает огромные возможности для соц.инжиниринга. Таким образом можно использовать адреса, например, GeekBrains, который использует для почты ПДД (или Коннект).
DKIM проверка отдает pass, но домен указывается Яндекса (даже использовать другой почтовый домен).

Естественно, я сразу же отписал об этом в багхантер Яндекса еше летом прошлого года и
получил ответ:



До меня уязвимость им отправили 27 июня 2016 года. Т.е. Яндекс за год не смог исправить достаточно серьезную (по моему мнению) уязвимость, которая может затронуть безопасность партнеров Яндекса, которые используют их почтовик.

UPD: есть способ замаскировать адрес отправителя. Для этого достаточно купить более или менее похожий домен, прикрутить к нему ПДД и отправлять письма с него. Адрес подменяется так же, все проверки валидны, а DKIM подпись и адрес отправителя будет от нового домена.

Кстати, mail.ru и gmail этому не подвержены. GeekBrains, простите, но я знаю лишь вас, среди тех кто использует сервисы Яндекс, ведь вы спалились аватаркой.

Комментарии (15)


  1. timelle
    10.08.2017 21:43
    -3

    — Не волнуйтесь! Утонуть в нашем бассейне практически невозможно. А потому что каждые полчаса мы обшариваем дно баграми!


  1. dark_snow
    11.08.2017 00:04
    +2

    ИМХО пока массовая эпидемия не грянет — они не перекрестятся даже.


  1. raid
    11.08.2017 01:29
    +2

    Если смотреть исходник письма, то там несколько раз фигурирует настоящий адрес отправителя. То есть он так или иначе попадает в заголовки. Почему тогда почта получателя (в данном случае gmail) на это полностью забивает и просто смотрит на From?


    1. freejoins
      11.08.2017 08:25

      У Exim точно такое же поведение. Очень часто встречаются письма с доверенными доменами в поле From, но с левым ящиком в заголовках. Пытался сделать фильтрацию типа: если From из тела не совпадает с from из заголовка отбрасывать. Но тогда пользователи жаловались на невозможность получать рассылки.


    1. tech42 Автор
      11.08.2017 08:28
      +1

      Потому что это From. Вопрос в другом: почему сервер Яндекса на это забивает? Если же такую штуку провернуть с gmail, то вот оно как раз и подставляет во From принудительно адрес, под которым ты авторизовался.


      1. raid
        11.08.2017 17:14

        Так, ещё раз. Почему за правильный адрес отправителя должен отвечать сервер отправителя, а не получателя? При том что и у того, и у другого есть техническая возможность.


        1. tech42 Автор
          11.08.2017 17:26
          +1

          Само по себе это иногда необходимо. Например, у меня есть почтовый сервер и приличное кол-во адресов. Мне удобнее авторизоваться под одним и отправлять письма с нескольких. И я не хочу, чтобы именно принимающая сторона решала, нужно ли отклонять или нет. А вот в случае Яндекса — это публичный сервис. Здесь каждому человеку/организации дается один или несколько адресов, и тут уже критично, отправил ли он сообщения со своих или чужих адресов. И решать это нужно, естественно, отправляющей стороне.


    1. saboteur_kiev
      11.08.2017 18:12
      +1

      Например есть внутренний почтовый сервер в виде кластера, распределенный на несколько локаций (может даже в разных странах). И внешний почтовый сервер, через который идет коммуникация с миром.

      Внутри все адреса что-то типа user1@office.example.com, или даже user1@officeUA.example.com
      Наружу оно проксируется через внешний сервер и может уходить как user1@example.com, имея в reference заголовках оригинальный «внутренний» сервер.

      Казалось бы, зачем так? Но так могут жить крупные компании (десятки тысяч сотрудников), на Lotus Notes или Exchange. Смена всей инфраструктуры — вещь затратная, и никаких конкретных предпосылок нет.

      Кроме того, крайне удобны варианты, когда Vasily Pupkin from support team отправляет от имени support_team@example.com, а не с личного емайла.

      Таким образом это не только не бага, но и фича, которая активно используется.


  1. hssergey
    11.08.2017 08:49
    -1

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


    1. tech42 Автор
      11.08.2017 08:54
      +1

      Если правильно сделать — не отвалится. У Яндекса есть все ресурсы, чтобы грамотно реализовать изоляцию между каждой организацией (кабинетом ПДД или Коннекта) и обычной Почтой.


  1. SerHitman
    11.08.2017 09:30

    Это я так понимаю ответка за mail.ru https://geektimes.ru/post/291929/
    кто следующий? давайте за gmail


    1. tech42 Автор
      11.08.2017 09:31
      +1

      скорее слишком расширенный комментарий.
      Про Gmail, увы. написать не могу. Но есть баг из Яндекс.Денег. Он не критичен, но способен создать юридичиские трудности. Ибо связан с идентификацией несовершеннолетних.


  1. snovazabilparol
    11.08.2017 13:45
    -1

    Либо уже фикс, либо автор подключается к Яндексу через особый SMTP шлюз.

    image


    1. tech42 Автор
      11.08.2017 13:47

      Не фикс. Перепроверил.


  1. kirillaristov
    11.08.2017 17:11
    +1

    Вполне логичное поведение принимающего почтовика:
    dmarc для yandex.ru = none (mxtoolbox.com/archive/?actionstring=dmarc:_dmarc.yandex.ru)

    Поэтому что бы gmail не увидел бы в заголовках письма от яндекса, он в любом случае положит это письмо во входящие, ибо доменом yandex.ru не установлено правило отклонять такие письма.

    Кстати, у gmail правило идентификации тоже установлено в none, а у mail.ru сервера имён отдают разную инфу: либо none, либо reject, либо синтаксис некорректный.