![](https://habrastorage.org/webt/5e/34/ws/5e34wsjps494l1x3hmavlg6pe9w.png)
Предисловие. Microsoft и другие компании в последнее время выступают против паролей. Призывают использовать более безопасные и удобные методы 2FA. Среди альтернативных вариантов — авторизация через «волшебные ссылки», то есть через почтовый ящик.
Один разработчик попытался реализовать такую систему, но напоролся на совершенно неожиданное препятствие… Оказалось, кто-то ходит по приватным одноразовым ссылкам до пользователя — и авторизуется вместо него! Вы уже догадались, кто это.
Далее слово автору.
Недавно я внедрил проверку почтовых адресов при регистрации пользователей. Полезное дело, чтобы отфильтровать ботов, ошибочные адреса, а также проверить доступность почтовых ящиков для будущих писем и рассылок.
Как обычный ленивый девелопер, я быстренько сляпал простую систему токенов, которая работает по следующей схеме:
- Пользователь регистрируется, указывает свой адрес электронной почты (здесь ещё нужна Google Recaptcha).
- Генерируется уникальный токен, который отправляется по электронной почте в виде ссылки, которую можно нажать, подтвердить свой email и автоматически войти в систему.
- По истечении срока действия токен протухает (это я забыл реализовать, ну да ладно).
Такова базовая проверка электронной почты. Подобные схемы сейчас довольно популярны для реализации «волшебных ссылок», то есть входа в аккаунт без пароля. (Предполагается, что если у вас есть доступ к почтовому ящику, то наверное, ваша личность установлена. Ну а сам почтовый ящик максимально защищён, включая аппаратные токены, код на смартфон и прочее, так что «угнать» его очень сложно — гораздо сложнее, чем просто пароль от сайта).
Несколько недель всё нормально работало. Затем я вдруг заметил рост количества заходов в систему без каких-либо дальнейших действий на сайте. Очень странно.
Изучение логов показало: все фантомные входы генерирует Bingbot, то есть бот поисковой системы Bing от Microsoft!
Сначала я предположил, что это злонамеренная атака с поддельным юзер-агентом, но нет. IP-адреса злоумышленника совпадали с IP-адресами поисковой системы Bing, так что всё казалось законно.
Как Bing входил в аккаунты пользователей?
Ещё немного покопавшись, мне удалось найти конкретные токены. Все эти фейковые сессии начинались с URL с уникальным токеном, который я отправлял для верификации почты. Без реферера.
Единственным логичным объяснением было то, что Microsoft отправляла электронную почту из сервисы Outlook (со ссылками) в поисковую систему Bing для индексации. Все мы знаем, что провайдеры электронной почты собирают наши данные. Но, конечно, они не индексируют приватный контент электронной почты… Ведь правда, не индексируют?..
Быстро погуглив (потому что никто ведь не пользуется бингом), я нашел это:
С февраля 2017 года Outlook (https://outlook.live.com/) сканирует электронные письма, поступающие в ваш почтовый ящик, и отправляет все найденные URL-адреса в Bing, чтобы их проиндексировал краулер Bing.
Это фактически делает бесполезными все одноразовые ссылки, такие как логин, сброс пароля и т. д.
Мне показалось, что я наткнулся на заговор уровня Wikileaks. Неужели Microsoft передаёт приватное содержимое электронной почты в свою поисковую систему?
Чтобы поверить в столь невероятный заговор, нужно было проверить факты… и мои опасения подтвердились.
Bing действительно индексировал мои ссылки для верификации почтовых адресов
Bingbot автоматически переходил по этим ссылкам и автоматически входил в учётные записи новых пользователей.
К счастью, после входа он ничего не делал, разве что немного щёлкал мышкой, а все эти аккаунты были совершенно новыми — созданы буквально только что, поэтому там ещё не хранились конфиденциальные данные.
Исправление
В качестве быстрого фикса я добавил функцию истечения срока действия токенов (теперь все токены истекают после использования и действительны только в течение 1 часа).
Но вероятно, придётся перейти к формату «вот ваш одноразовый код» (без ссылок), который пользователь должен вручную скопировать и вставить на страницу. Так спокойнее.
Несомненно, существует много других (лучших) способов повысить безопасность такого флоу. И обнаружить ботов в наши дни довольно просто, так что я мог бы добавить дополнительные проверки… Но когда узнаёшь, что любые конфиденциальные ссылки рискуют появиться в результатах поиска, то уже как-то не очень комфортно их использовать.
Примечание. В обсуждении на lobste.rs высказали предположение, что аналогичным образом поступают многие почтовые сервисы. Скорее всего, они ходят по ссылкам не для поисковой индексации, а для антивирусной проверки. Но в любом случае передавать конфиденциальную информацию по почте без шифрования — не самая лучшая идея. Ведь любое письмо открыто для индексации десятками автоматических сканеров на пути от отправителя к адресату.