Как не нужно реализовывать двухфакторную авторизацию на примере одного банка, или почему продакт-менеджер должен консультироваться с безопасниками

Уже четвертый год являюсь клиентом одного банка. В свое время было куча косяков в UI, о которых я писал в банк многостраничные отзывы (да и сейчас программисты никак не могут реализовать то, что делает любой русский школьник, пишущий в первый раз калькулятор: а именно, принимать в качестве десятичного разделителя и точку, и запятую), но по сравнению с остальным страхом «Сбербанка», «Райфайзена» (ох уж эти джава-апплеты, сколько знакомых звонили каждый раз, когда нужно было сделать перевод — сами не могли разобраться) и т. д. — просто радость для глаз.

Но, собственно, пост вылез из недавнего «улучшения». Месяц-два назад кто-то в банке решил улучшить пользовательское взаимодействие и присылать одноразовые коды для определенных операций не эс-эм-эской, а через USSD-сообщение (UPDATE: или, как подсказали в комментариях, возможно, через Flash-SMS, что, впрочем, дела не меняет). Здесь защита и стала падать.

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

Что стало не так

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

Ключевой момент в том, что USSD должен (но только не в этом банке) инициироваться самим пользователем на конкретном устройстве (т. е. пользователь должен в этот момент держать устройство в руках). Всё потому, что USSD — это, по сути, сигнализационный канал, в котором обмен сообщениями происходит мгновенно и, в отличие от SMS, USSD не имеет промежуточной базы данных. Проще говоря, они нигде не хранятся и показываются «здесь и сейчас», доставляясь мгновенно.

С одной стороны, всё хорошо: одноразовый пароль не сохранится ни в какой базе, придет быстрее SMS, весь диалог ведется в рамках одной сессии, выходить из мобильного приложения в смски не нужно (USSD появится поверх интерфейса). Но есть одно но, из-за того, что USSD-сообщение нигде не хранится, оно показывается мгновенно и сразу же поверх любого интерфейса (как на картинке выше; не дай бог, спамеры начнут слать свои «письма» через USSD). Если еще не стало понятно, USSD-сообщение будет показано, даже если ваш телефон заблокирован паролем (текст SMS, а вместе с ним и одноразовый пароль, при заблокированном телефоне не прочитать), как минимум, на iOS и, как подсказывают в комментариях, на Windows Phone.

Поэтому, если вдруг злоумышленник узнал ваш обычный пароль и при этом имеет физический доступ на 5 секунд к вашему телефону (например, вы оставили его на столе и отошли), он сможет зайти в мобильный банк. Даже если у вас запаролен телефон. И ему даже не нужно удалять будет USSD-сообщение, т. к. оно нигде не сохранится на телефоне, а просто исчезнет при нажатии кнопки Dismiss. Опять же, из-за того, что сообщение будет показано принудительно (SMS само не откроется, пока вы, например, играете), можно просто находиться рядом с телефоном (в этом случае, правда, жертва что-то заподозрит, ведь она не инициировала сообщение).

Никогда не делайте исключений для двухфакторной аутентификации для удобства пользователей

Думаете, на этом проблемы кончились? Кто-то «гениальный» из отдела взаимодействия решил сделать сервис еще удобнее. «Давайте будем просить одноразовый пароль на вход только в первый раз, когда пользователь установил приложение» — сказал он. Сказал, да не подумал: а что, если этот пользователь зашел в свой личный кабинет не через свой планшет / телефон? Если это было устройство злоумышленника, то теперь, чтобы залогиниться ему будет достаточно знать обычный пароль юзера (двухфакторная аутентификация просто не будет запрашиваться).

В итоге, сейчас происходит прекрасная схема:
1. Введем двухфакторную аутентификацию (типа).
2. Будем отсылать одноразовый пароль через USSD, а не SMS так, чтобы код можно было увидеть даже на заблокированном телефоне.Верно для текущих клиентов на Windows 8 и Android, но уже поправлено для последней версии клиента под iOS.
3. Не будем спрашивать одноразовый пароль, если на устройстве хоть раз зашли по двухфакторной аутентификации (т. е. формально отключим двухфакторную аутентификацию для конкретного устройства).
4. Сделаем так, чтобы жертва зашла через наше устройство, и узнаем ее пароль (был прекрасный ролик про софт, который «снимает» набираемый пароль по отражению экрана в стеклах очков или keylogger).
5. Profit!

Вывод

1. Пока есть подобное поведение, как минимум, в iOS и Windows Phone всегда используйте SMS (и только SMS) для передачи одноразовых паролей.
2. Если уж пользователь согласился на двухфакторную авторизацию всегда используйте ее (не отключайте ее для отдельных устройств после первого входа, если пользователь вышел из своего «профиля»). Это гораздо более серьезное нарушение политики безопасности, чем отправка паролей в виде USSD (ведь в этом случае вообще не нужно ничего отправлять).

Банк, если что, Тинькова. Отсюда мораль, если вас всё это беспокоит, пользуйтесь только веб-мордой (там всегда приходят только SMS и всегда требуется двухфакторная аутентификация). Как отвечает суппорт: «На данный момент произвести соответствующие изменения, к сожалению, не представляется возможным». Надеюсь, этот пост, как-то поднимет приоритет «соответствующих изменений» с «когда-нибудь, если будет время» до «срочно».

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

  • 0
  • 1

Добавить комментарий

Кликните на изображение чтобы обновить код, если он неразборчив