Добрый день. Меня зовут Алексей. Я занимаюсь написанием ботов и реверсом Android приложений с поиском в них уязвимостей.
Мне попало в руки приложение Рамблер/почта для Android. Цель была автоматизировать отправку почты средствами API мобильного приложения. Был запущен эмулятор MEmu и Charles, однако SSL отказывался показать свои запросы. В ход пошел реверс. В файле smali_classes2\okhttp3\OkHttpClient.smali были сделаны изменения, дабы убрать шифрование.
Далее начат был поиск запросов отвечающих за авторизацию и отправку сообщений. Меня удивило, что авторы приложения при их уровне никак не пытаются себя обезопасить хотя-бы простейшими сигнатурами. Запрос логина выглядит обычно. А вот запрос на отправку крайне любопытен.
action=send¶ms={"to":{"hrthrtjrt12@mail.ru":"hrthrtjrt12@mail.ru"},"body":"<div><br><\/div>erherh<br>---<br>.","is_html":"1","subject":"ergerg","action":"send","bcc":{},"from":{"eherhregerg@rambler.ru":""},"uploads":[],"cc":{}}
Нам интересен параметр from. Вместо него можно подставить абсолютно любой адрес почты с Рамблера. Вот что приходит на Яндекс:
К счастью у Mail.ru и Yandex есть такая функция как «Служебные заголовки» и в них мы увидим:
Delivered-To: hrthrtjrt12@mail.ru
Return-path: <eherhregerg@rambler.ru>
Да. Технически мы видим реального отправителя, однако для рядового пользователя это скрыто и может стать средством фишинга.
Дальше больше. 1 аккаунт удалось загнать в бан с других аккаунтов просто добавив его адрес в поле from при отправке, письма от него не приходили. Однако если при отправке с этого «забаненного» аккаунта в поле From подставить любое другое мыло, то письма пойдут. Таким образом, мы понимаем, что Rambler считает отправителем юзера из поля from, а не реального.
В данный момент техническая поддержка Рамблера уже оповещена об уязвимости. Однако они ее таковой не считают. Цитирую:
Подобные попытки подмены и мобильных приложений Yandex и Mail.ru не сработали. К счастью, эти компании не такие «креативные». В их мобильных приложениях тоже есть уязвимости, но об этом в следующей статье. Надо же сперва оповестить разработчиков.
Данная статья — попытка исправить ситуацию и все таки признать это багом. Благодарю за внимание.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Комментарии (26)
neenik
15.03.2017 21:09+3Вы очень непонятно объяснили проблему в статье. Думаю, и техподдержка не поняла проблему.
Возможность указания поля from пользователем — это совсем не уязвимость.
«Rambler считает отправителем юзера из поля from» — это тоже не уязвимость, а баг.gurux13
16.03.2017 13:26-1С помощью этого дела можно забанить рандомного пользователя, хотя он ни в чём не виноват? Да. Значит, уязвимость.
С помощью этого дела можно отправить письмо забаненным пользователем? Да. Значит, уязвимость.
pr3dat0r
20.03.2017 09:56Когда писал, я больше опирался на то «как это выглядит в глазах рядового пользователя». Если отослать письма с других почтовиков, так же с пересылкой, то они там отображаются по другому и не вводят получателя в заблуждение.
ebragim
20.03.2017 22:48Многие сервисы используют емейлы с определённого адреса для подтверждения операций. Из последнего — у корпоративной связи мтс есть сервис техподдержки, однозначно идентифицирующий вас именно по отправителю заявки.
Akuma
15.03.2017 21:29+3И что?
Я могу простым скриптом на том же PHP отправлять письма от имени любого отправителя.
Вот только все нормальные почтовики будут ругаться на такого отправителя или как минимум на несоответствие хоста.
from — это лишь обратный адрес и ничего более. А уж письмо может быть отправлено откуда угодно.
Вы точно так же можете бумажные письма отправлять с обратным адресом Рамблера.DaMaNic
15.03.2017 22:54Тут я бы добавил, что можно попытаться сделать вброс писем с правильными записями DKIM и SPF, если сам домен отправителя находится в доверенных. Но скорее всего такой сервер скоро заблокируют, поэтому такие вбросы дорого стоят именно из за сложности и одноразовости действия.
DaMaNic
15.03.2017 22:34Мне кажется это для почты нормально. Функция есть у большей части почтовых служб, называется «перенаправить». Я например скачивал письма на компьютер, текстовым редактором редактировал заголовки писем, забрасывал по IMAP на сервер обратно и делал «перенаправить». Письма от Путина ко мне доходили.
redfs
15.03.2017 22:34+2Если речь идет о том, что в поле From можно подставить любой email адрес, то техподдержка Рамблер абсолютно права, не считая это багом.
Это суровая реальность протокола.
И этим часто пользуются спамеры. А антиспамеры придумали DKIM и SPF. И далее по кругу.dmitrmax
16.03.2017 00:54+1Не совсем. В данном случае у письма будет всё в порядке с DKIM и SPF. Безусловно сервер-помойка позволит отправить с любым адресом в поле from даже с другим доменом — протокол здесь не нарушен, а вот политика антипомойности — да.
redfs
16.03.2017 08:17Любой smtp сервер должен позволить отправлять письма с любым адресом в поле From — и это не признак плохой «политики антипомойности».
Если у отправителя есть права на отправку (например, успешный SMTP AUTH или отправка из доверенных сетей) то сервер обязан принять и отправить письмо вне зависимости от того, какой email подставлен в поле From. Все пляски с бубном делегируются принимающей стороне. Это нормально, так как соответствует RFC. Собственно это я и имел в виду.
А помойка — это какой-нибудь open relay или ненастроенный MSA.
barker
15.03.2017 22:42+21Новую статью напишите о том, что в http-запросе можно вставлять любой referer)
lgXenos
16.03.2017 07:37Лично с моей, не протокольной ай-мап версии мозга, кажется логичным отправлять письма только от того, кем ты авторизовался. Я встречал такое решение во времена диал-апов. Исходя из прочитанного — это было верным решением, с их стороны.
flekst
20.03.2017 22:48Простейший пример, ломающий вашу версию:
Сбор нескольких ящиков в один.Ответ от имени того ящика, на который пришло письмо, используя вебморду центрального ящика.
В этой же вебморде отправка от имени проверенных ящиков.
Лично я собираю письма из нескольких источников и не парюсь.
Тот же гугл в поле отправителя указывает мой рабочий ящик и не светит личный.lgXenos
20.03.2017 22:54А в чем взлом? Чет я не понял, если честно.
Отправка от ящика от ящика, к которому введен логин-пароль. Т.е. куда веб-морда может залогинится от вашего имени. Т.е. все по тому, как я описал
Не будет же мейл ру отправлять из своего сервера письмо, от имени на рамблере или гмайле
Pakos
16.03.2017 10:00Недавно пришёл какой-то спам «Рамблер-знакомства» от ящика типа admin@rambler.ru. После статьи даже не знаю — сам Рамблер спамит, т.к. от меня дождался тыкания по их рекламе или кто-то подделывает по описанному принципу адрес…
Соответствие RFC — это хорошо, но уязвимость, соответствующая стандарту, всё равно остаётся уязвимостью(by design). Я Иванов, хочу от имени Петрова отправить бомбу. Вижу что Иванов, отправляйте, а что бить с большой вероятностью придут Петрова, так не наши проблемы. Хорошо если вторая сторона банит спамеров по Return-path, а не по From, чтобы Петров страдал меньше.redfs
16.03.2017 10:58уязвимость, соответствующая стандарту, всё равно остаётся уязвимостью
Опять про уязвимость… Друзья, давайте все-таки правильно выбирать термины. Нет в описываемом случае никакой уязвимости.если вторая сторона банит спамеров по Return-path, а не по From
Нормальные спаморезки не банят только по полю From, больше скажу — и по Return-path тоже. Комплексный анализ заголовков состоит из сотен разных критериев с разными весами на основании которых и принимается решение — спам или нет.Pakos
16.03.2017 13:44Хорошо, не уязвимость, а просто дыра в стандарте, которую никто не хочет закрывать. Если в стене оставили вентиляцию, но через неё открывается дверь, то пользователю двери не важно название термина. Даже если дверь на цепочке (нельзя представиться другим доменом, остаются следы в виде Return-path), то всё равно как-то не очень хорошо выглядит.
>> из сотен разных критериев с разными весами
Ну т.е. ящик спокойно можно использовать для рассылки спама, который ещё не ловится байесовскими фильтрами, потому как заткнуть фонтан конкретного пользователя нельзя. И где там сотни критериев, если заголовков не много?redfs
16.03.2017 14:04Хорошо, не уязвимость, а просто дыра в стандарте, которую никто не хочет закрывать.
Эта дискуссия ведется с момента появления стандарта. Основания простые — аналогия с обычной почтой. Вы можете отправить письмо кому угодно, указав обратный адрес кого угодно просто бросив его в почтовый ящик — и оно будет (как правило:) доставлено, если адрес получателя верен. email приближен к этому прототипу, хорошо это или плохо — в общем-то неважно.И где там сотни критериев, если заголовков не много?
Ну, ради интереса полядите конфиги какого-нибудь spamassassin. Заголовков может и немного, много их сочетаний в разных вариациях + анализ содержимого.
theRavel
16.03.2017 14:09Как по-вашему работают все рассылки?
Например есть приложение, которое посылает email'ы через third-party email platform (SendGrid, Mailchimp, Amazon SES, etc.).
Например это приложение посылает вам email. Вы серьезно хотите там увидеть в поле «отправитель» что-то типа generated-1-2-3-hash@amazon.com? Конечно вы этого не видите, потому что From и Sender в данном случае отличаются и вы увидите там что-то типа support@application.com, хотя отправляющая платформа не владеет доменом application.com.
В этом нет никакой уязвимости, это удобно и это стандарт. Если кто-то неправильно реализует спам-фильтры, это не проблема стандарта.
Это конечно прекрасно что вы и ТС открыли для себя заголовки. Но этот пост… как бы так сказать… почему рамблер? Отправлять с кастомным from можно почти из любой почтовой системы, возможно это не всегда возможно сделать через UI.
PS. вот вам еще пример с Linked-In email: http://stackoverflow.com/a/14555043/871861
Ivan_83
16.03.2017 15:48+1Стыдно должно быть, товарищи технические «специалисты».
Итак.
Есть протокол SMTP — это протокол по которому передаются письма.
У вас, многих, каша в голове, и протокол SMTP смешан с mime данными — самим пересылаемым сообщением.
Вот так примерно выглядит сильно упрощённый вариант отправки письма, без лишних команд и ответов серверов.
MAIL FROM some_acc@rambler.ru
RCPT TO: u1@rambler.ru
RCPT TO: u2@rambler.ru
DATA
И ВОТ ТУТ НАШЕ ПИСЬМО С ЗАГОЛОВКАМИ!!!
.
QUIT
«И ВОТ ТУТ НАШЕ ПИСЬМО С ЗАГОЛОВКАМИ!!!» — вот там в заголовках и содержимом что угодно. Сервер это не интересует.
При получении он при создании файла дописывает туда служебку Received: from… и дальше пишет всё что шло после DATA.
Ему плевать на содержимое, для него это пересылаемые данные от some_acc@rambler.ru к u1@rambler.ru и u2@rambler.ru.
Все ограничения на From в письме — они в головах, обычно из почтовых клиентов для юзеров, где вольностей не позволяют дабы меньше глупых вопросов шло в ТП.
whiplash
16.03.2017 16:46/оффтопик/
А как Рамблер прокомментирует вот это например?
https://www.facebook.com/photo.php?fbid=1460164277347699&set=a.140948952602578.18963.100000624217935&type=3
«А занятный эффект наблюдается для Rambler-почты (это веб; mail.rambler.ru:443) — несогласованные результаты теста на CVE-2016-2107 для одного и того же IP: признак уязвимости то обнаруживается, то нет (см. скриншот). Процессоры, что ли, разные на серверах? (Там эффект зависит от поддержки AES-NI.) Или более простой вариант: разные сборки ПО.»
w9w
17.03.2017 19:31На Ваше сообщение об уязвимости дали хоть какой-то ответ, а мои 2 письма по поводу open redirect на https://id.rambler.ru/account/ до сих пор игнорируют, уязвимость не исправлена уже около месяца.
AndreyCarter
20.03.2017 22:49На самом деле, работает это не только с рамблером: яндекс и маил.ру аналогично пропускает сообщения.
Пытался через gmail подставить левый from — не прокатывает, выдаёт оригинальный sender.
Специально зарегал ещё один левый мейл в почтовике: больше проблема в том, что никак не распознать от кого пришло письмо действительно (яндекс, маил.ру), лишь маленькая незаметная ссылочка у gmail
Вот письмо от телеканала «ТНТ» на gmail (выадёт лишь оригинальный хостинг tut.by)
А вот письмо от Apple на mail.ru
Как видно из скринов, маил.ру вообще вводит в заблуждение, показывая, что реально от Apple пришло письмо, а это такой фишинг можно провернуть…
klev
Сам протокол SMTP позволяет указывать любой обратный адрес, даже не существующий. Может, это проблема Mail.ru и Yandex, то что они недостаточно проверяют заголовки, и не помечают это письмо как подозрительное?
Как например это делает Gmail.
gurux13
А вот это очень интересно. Вы отправили письмо, используя описанную технологию или просто рандомный SMTP сервер, который не убеждается, что такой from: допустим?
Если используя рандомный сервер, то это не то же самое (нет подписи).
Если используя рамблер, тогда предупреждение gmail'а неадекватно — отправил rambler, но не admin@rambler.ru.
klev
Да, вы правы, использовал внешний сервис, который позволяет вставлять любой «from», согласен, что проверка не совсем корректная.
Моя идея в том, что если есть малейшее подозрение в том, от кого пришло письмо, то об этом надо сообщать получателю, тем более, что сам протокол SMTP и надстройки над ним (DKIM и SPF) не обеспечивают достаточной верификации отправителя.