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

в 10:08, , рубрики: sms, ussd, двухфакторная аутентификация, информационная безопасность, разработка, тиньков, тинькофф кредитные системы, уязвимость, метки: , , , , ,

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

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

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

Когда стали использоваться USSD-сообщения:

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

Во всех других случаях для отсылки одноразового пароля используется старая-добрая SMS.

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

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

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

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

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

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

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

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

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

Автор: Piskov

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js