Уязвимость перебора email в диалоге «Сброс пароля»

OWASP Идентификатор уязвимости: WSTG-IDNT-04

Шаги воспроизведения:

  1. Попробуйте ввести неверный адрес электронной почты в диалоговом окне «Забыли свой email»:
  2. Попробуйте ввести корректный адрес электронной почты в диалоговом окне «Забыли свой email»:

Описание уязвимости (по данным OWASP):

  • Возможно собрать набор действительных имён пользователей, взаимодействуя с механизмом аутентификации приложения. Этот тест полезен для проверки методом грубой силы, когда проверяется, можно ли, зная действительное имя пользователя, подобрать соответствующий пароль.

  • Часто веб-приложения раскрывают наличие имени пользователя в системе либо из-за неправильной конфигурации, либо в результате проектного решения. Например, при вводе неверных учётных данных иногда возвращается сообщение о том, что имя пользователя существует в системе, либо указан неверный пароль. Полученная информация может быть использована злоумышленником для составления списка пользователей системы. Эта информация может быть использована для атаки на веб-приложение, например, методом грубой силы или с использованием стандартных имён пользователей и паролей.

Рекомендуемое исправление:

  1. Диалоговое окно «Забыли свой email» должно вести себя одинаково независимо от того, корректен ли адрес электронной почты или нет.

У нас есть настройка администратора hide email address taken, которая изменяет поведение этого экрана:

Возможно, стоит сделать это значение по умолчанию? :thinking:

9 лайков

Включить администратору: Настройки — Вход — скрывать, что адрес электронной почты уже занят

скрывать, что адрес электронной почты уже занят

Не сообщать пользователям о существовании учётной записи с указанным адресом электронной почты при регистрации или при восстановлении пароля. Требовать полный адрес электронной почты для запросов «забытый пароль».

См. также Different password reset for wrong username/email (2014 ;))

Редактирование от @JammyDodger: на 40 секунд быстрее.

7 лайков

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

3 лайка

Спасибо вам обоим. Я столкнулся с этой ошибкой в естественных условиях на meta.discourse.org и не знал об этом параметре, но приятно знать, что исправление уже реализовано в коде, и патч должен быть очень простым. Чтобы соответствовать лучшим практикам OWASP, этот параметр всегда должен быть включён. Не понимаю, почему какой-либо администратор мог бы захотеть отключить его, поскольку это создаёт совершенно ненужную уязвимость в области безопасности и конфиденциальности, что прямо нарушает отраслевые стандарты лучших практик. Если есть какая-то причина сохранить эту опцию для устаревших установок, что мне не под силу представить, то следует добавить предупреждение, указывающее, что текущая конфигурация нарушает отраслевые стандарты лучших практик, и рекомендовать соответствующую конфигурацию.

2 лайка

Спасибо за ссылку на эту тему. @awesomerobot имеет право на своё мнение, но при этом открыто игнорирует общепринятые отраслевые стандарты и лучшие практики, настаивая на том, что хорошо известная, многократно описанная и явно задокументированная ошибка somehow «не является ошибкой». Я не считаю его мнение убедительным по сравнению с опубликованными отраслевыми стандартами и лучшими практиками.

По крайней мере, значение по умолчанию должно отражать более безопасную конфигурацию, и должна быть какая-то подсказка, чтобы предупредить начинающих администраторов, что отключение этой опции представляет собой намеренную и ненужную уязвимость безопасности и конфиденциальности на их форуме. Например, ссылка на запись OWASP или что-то подобное.

Может ли кто-нибудь объяснить, в каком сценарии может быть предпочтительнее отключить эту опцию? Я искренне не понимаю, почему это вызывает споры, и хотел бы узнать, упускаю ли я какой-то случай использования, который делает ненужной модель безопасности с явным подтверждением (opt-in), реализуемую этой настройкой. Если такой сценарий нельзя привести, то эта настройка всегда должна быть включена и, следовательно, вообще не должна быть настраиваемой опцией.

1 лайк

Я думаю, что в данный момент всё работает как ожидалось, поэтому мы не можем по-настоящему классифицировать это как #баг. Однако мы регулярно пересматриваем наши значения по умолчанию, и вы затронули несколько интересных моментов, которые стоит рассмотреть.

Я передам это в ux, чтобы обсуждение могло продолжиться там. :+1:

11 лайков

Просто… люди плохо запоминают, какой адрес электронной почты они использовали при создании аккаунта, и обращаются к администраторам для решения проблем.

Это похоже на «требование второй факторной аутентификации» или «минимальную длину пароля». Я считаю, что общая рекомендация — всегда требовать второй фактор, а рекомендации по минимальной длине пароля сейчас, кажется, выше, чем наше текущее значение по умолчанию для обычных пользователей… но также существует разрыв между рекомендациями по безопасности и средними навыками работы с компьютером.

Я не категорически против изменения настроек по умолчанию, но стоит отметить, что они могут повлиять на удобство использования.

10 лайков

Мне кажется, что настройки по умолчанию в Discourse должны соответствовать лучшим практикам, как и почти на каждом другом сайте.

Похоже, что на моем экземпляре установлено соответствующее значение:

Если учетная запись соответствует x@example.com, вы скоро получите электронное письмо с инструкциями по сбросу пароля.

3 лайка

Мне нравится этот отзыв, но я бы предпочел, чтобы он был подкреплён немного данными:

Что делают следующие сайты?

  • Facebook
  • Twitter
  • Amazon
  • Reddit
  • Yahoo
3 лайка

Спасибо всем за ваши ценные отзывы и мнения по поводу этой уязвимости. Для меня ситуация предельно ясна и не представляет никакой сложности: в Discourse существует известная уязвимость, о которой неоднократно сообщали администраторы и специалисты по безопасности, такие как я, но её рассматривают как особенность, а не как уязвимость безопасности: NIST: CWE-200: Раскрытие конфиденциальной информации неавторизованному лицу.

Обосновывать эту небезопасную конфигурацию по умолчанию, нарушающую общепринятые отраслевые стандарты, ссылаясь на гипотетическую ситуацию, когда администратор форума завален запросами пользователей о том, какие адреса электронной почты они использовали при регистрации, не имеет смысла. Дело в том, что использование страницы «Забыли пароль» не требует взаимодействия с администратором независимо от настроек этого параметра: если включена более безопасная и соответствующая стандартам настройка, пользователь просто проверит свои электронные письма в диалоге «Забыли электронную почту» и увидит, приходило ли на этот адрес письмо для сброса пароля, точно так же, как объясняется в самом диалоге, и как это реализовано во всех современных, уважающих конфиденциальность и соответствующих стандартам веб-приложениях. Кроме того, оправдание этого нарушения на основании того, что другие сайты тоже могут нарушать лучшие практики, не является логичным или убедительным аргументом с точки зрения безопасности и защиты данных. Мне трудно понять, почему мы предоставляем администраторам «возможность» делать установку Discourse чуть менее безопасной и менее соответствующей стандартам без какой-либо явной выгоды.

Тем не менее, я выполнил предписанную вами работу, @sam:

  1. Google: не допускает перебор пользователей.
  2. YouTube: не допускает перебор пользователей (поскольку использует вход через Google, а Google не допускает перебор пользователей).
  3. Facebook: официально допускает перебор пользователей через страницу «Найти аккаунт»/«Забыли пароль» только если пользователь специально пометил свой адрес электронной почты или номер телефона как публичные, и тем не менее печально известен утечкой данных 500 млн пользователей через уязвимость такого типа, а также выплатил тысячи долларов специалистам по безопасности, которые обнаружили, что внутренние правила ограничения частоты запросов и «только если явно помечено как публичное» не соблюдались.
  4. Instagram: допускает перебор пользователей (и пострадал из-за этого). Это другой тип взлома, чем тот, о котором я упоминал для Facebook.
  5. X (пожалуйста, проявляйте уважение и не используйте мёртвые имена на этом форуме): допускает перебор пользователей через страницу сброса пароля, но реализует ограничение частоты запросов и несколько других легко обходимых препятствий, а также печально известен компрометацией телефонных номеров пользователей из-за ошибки в реализации ограничений частоты запросов и защиты данных.
  6. Baidu: допускает перебор пользователей на странице «Забыли электронную почту» и реализует капчу (и, возможно, ограничение частоты запросов? Мой китайский язык не очень хорош). Интересно, что процесс восстановления требует подачи апелляции в административную команду, а не просто отправки письма для восстановления. Очень типично для централизованного контроля КПК.
  7. Википедия: не допускает перебор пользователей.
  8. Yahoo: допускает перебор пользователей через страницу сброса пароля, но реализует ограничение частоты запросов и капчу. Я не смог найти примеров того, что Yahoo попадала в скандалы или выплачивала хакерам за эксплуатацию этой уязвимости, но найти информацию о Yahoo в любом поисковике по понятным причинам очень сложно.
  9. Yandex: допускает перебор пользователей на странице входа, реализует капчу и контрольный вопрос на странице «Забыли электронную почту».
  10. Whatsapp: не допускает перебор пользователей. Вход с ПК осуществляется через мобильные учётные данные. Мобильные учётные данные привязаны к номеру телефона. Кнопки выхода нет, равно как и страницы входа/страницы «Забыли электронную почту».
  11. XVideos: не допускает перебор пользователей.
  12. PornHub: не допускает перебор пользователей.
  13. Amazon (сайт электронной коммерции): допускает перебор пользователей через страницу сброса пароля, что является прямым нарушением их собственных рекомендаций по лучшим практикам для продукта Cognito user pools в Amazon Web Services. Я не смог найти примеров того, что Amazon попадала в скандалы или выплачивала хакерам за эксплуатацию этой уязвимости, но найти информацию об Amazon в любом поисковике по понятным причинам очень сложно.
  14. Xnxx: не допускает перебор пользователей. На основном сайте нет страницы входа, а сайт «gold» не допускает перебор пользователей. Я нашел неработающую страницу входа в мобильной версии обычного сайта, и в ней просто отсутствует функциональность «Забыли электронную почту» (и, как выяснилось, она также устарела в пользу их сайта «gold»).
  15. Tik Tok: не допускает перебор пользователей. Принудительно требует многофакторную аутентификацию на странице сброса пароля.
    (21. Reddit: не допускает перебор пользователей. Они соответствуют общепринятым отраслевым лучшим практикам.)

Из 15 лучших сайтов в этом списке 8 из 15 не допускают перебор пользователей (или 9 из 16, если включить Reddit, и можно добавить 0,5 для Facebook, поскольку он позволяет перебор только информации, которую пользователь сознательно разрешил сделать публичной), и по крайней мере 3 из 7 сайтов из этого списка, которые допускают перебор пользователей, столкнулись с критическими инцидентами безопасности именно из-за этого решения.

2 лайка

Это несколько нечестно, поскольку, возможно, главный продукт Google (Gmail) допускает такой перебор.

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

Ни одна из других платформ в этом списке не является (потенциально) программным обеспечением для самостоятельного размещения.

Не существует единой центральной платформы Discourse — администраторы сайтов свободны выбирать самостоятельно.

Тем не менее, я согласен с тем, чтобы подталкивать администраторов сайтов к выбору хороших настроек по умолчанию.

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

4 лайка

Разве это не применимо к любому сайту со страницей регистрации, а не только к поставщикам услуг электронной почты? Я понимаю вашу точку зрения: страницы регистрации могут стать вектором для аналогичных уязвимостей конфиденциальности и данных, поэтому они должны быть защищены, но это другая часть процесса аутентификации пользователя, о которой мы говорим в этой теме. В данном обсуждении мы конкретно рассматриваем утечки из диалога «Забыли пароль». Не поймите меня неправильно: оба аспекта абсолютно важны, требуют тщательного внимания и мер по смягчению рисков для предотвращения уязвимостей конфиденциальности и данных. Обычно для форм регистрации требуется капча, а для конечных точек «Забыли пароль» ответ должен быть одинаковым, независимо от того, существует ли указанный адрес электронной почты или нет. Многие сайты также защищают конечную точку «Забыли пароль» с помощью капчи. Оба конечных пункта должны иметь ограничение скорости запросов.

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

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

Я определенно поддерживаю свободу действий администраторов и не люблю усложнять жизнь ни администраторам, ни пользователям, но не считаю, что «плюсы» этой настройки перевешивают «минусы» ни в одном сценарии. Нет ни одного случая, когда администратор действительно хотел бы эту «функцию». Так же как мы не позволяем администратору устанавливать максимальную длину пароля, мы не должны позволять им ненужным образом незначительно снижать безопасность своего форума, допуская эту уязвимость перебора через диалог «Забыли пароль». Я считаю, что нужно просто полностью убрать эту опцию и заставить всех следовать стандартному, соответствующему требованиям способу. Честно говоря, я не думаю, что большинство администраторов заметят это или будут возражать, но это сделает конечную точку, доступную из общедоступного интернета, немного безопаснее во всех установках Discourse. Если мы обязаны оставить эту настройку, то по умолчанию она должна находиться в более безопасном положении, а менее безопасное положение должно быть четко обозначено, чтобы начинающие администраторы понимали, почему оно не рекомендуется. Однако я считаю, что лучший вариант — просто исключить эту настройку из кода. Я с радостью подготовлю запрос на включение изменений (PR) для этого.

1 лайк

Я не думаю, что можно рассматривать эти вопросы изолированно. В процессе регистрации на Discourse есть сообщение «Этот адрес электронной почты уже занят», и трудно понять, как сделать это иначе. Пока это существует, трудно увидеть, в чём именно заключается большая проблема с сообщением «Мы нашли совпадающую учётную запись».

Думаю, это имело бы значение для форума, который разрешает только внешнюю аутентификацию.

Преодолев желание возразить вам только из-за вашего стиля, я считаю, что по существу вы правы в той мере, в какой ваша позиция заключается в том, что по умолчанию должен быть выбран более безопасный вариант, по крайней мере при использовании внешней аутентификации. Я всё ещё не согласен с тем, что для менее безопасного варианта нет места (на моём форуме используется стандартный процесс регистрации Discourse, поэтому я не планирую менять опцию сброса пароля).

Кстати, я рассмеялся, когда вы оставили читателя догадываться из контекста, что XVideos и Xnxx (хотя не X) — это порнографические сайты, но при этом потрудились объяснить, что Amazon — это «сайт электронной коммерции».

1 лайк

Это было сделано для того, чтобы отличить Amazon.com от AWS. И раз вы спросили: AWS не допускает перечисление пользователей. :slightly_smiling_face:

Я согласен, что необходимо рассматривать все этапы процесса аутентификации пользователя и то, как они взаимодействуют друг с другом. Это крайне важно и является одним из самых распространенных источников уязвимостей безопасности. Если упомянутая вами похожая уязвимость, позволяющая перечислять адреса электронной почты на странице регистрации, не устранена должным образом, её следует исправить независимо от итогов обсуждения этой темы. Это была бы ошибка в реализации hide_email_address_taken. Обсуждение этой потенциальной ошибки или упущения, вероятно, должно проходить в отдельной теме (и, скорее всего, с тегом bug).

1 лайк

Просто заметка: при включённой опции hide email address taken такое сообщение при регистрации также не появляется (также меняется сообщение об приглашении, если ввести существующий адрес электронной почты). :+1:

Одной из возможных сложностей при простом изменении настройки по умолчанию может быть встроенная функция «требовать полный адрес электронной почты для сброса пароля», что может усложнить ситуацию (хотя, вероятно, это не является непреодолимым препятствием).

2 лайка

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

Что это означает? Имеется ли в виду, что нельзя сбросить пароль, используя только имя пользователя?

1 лайк

Именно так. :+1: При включённой опции «Скрывать, что адрес электронной почты уже занят» для сброса пароля необходимо указать сам адрес электронной почты учётной записи, а не просто имя пользователя.

1 лайк

Я предлагаю переименовать параметр сайта hide_email_address_taken в prevent_password_recovery_by_username, а затем удалить некорректное поведение из приложения для всех пользователей. Это позволит сохранить функциональность сброса пароля без изменений для всех установок, одновременно устраняя уязвимость перебора email-адресов. Я опытный разработчик RoR и JavaScript и с радостью реализую этот pull request; я быстро ознакомился с кодовой базой и вижу, что это не будет слишком громоздким PR.

Если же рефакторинг этой «функции» до полного исчезновения действительно невозможен, то я всё же считаю, что имеет смысл разделить эти две связанные концепции на отдельные записи параметров сайта.

1 лайк
2 лайка