Типичные ошибки реализации SMS-аутентификации
ист: https://blog.deteact.com/ru/common-flaws-of-sms-auth/
Угрозы
Account Takeover Регистрация от имени другого пользователя SMS-флуд любых телефонных номеров Истощение ресурсов веб-сервера и баланса на SMS-шлюзе
Уязвимости и атаки
Отсутствие Rate Limit
Это наиболее общий класс уязвимостей SMS-аутентификации, и эксплуатация такого недостатка очевидна: код подтверждения можно просто перебрать, поскольку нет достаточных ограничений по количеству попыток.
Как правило, код подтверждения состоит из 4-6 цифр, так что максимальное количество запросов, необходимых для перебора, — 1 миллион, что совсем не много для современного веба.
Привязка Rate Limit к Cookie
Иногда количество попыток входа привязывают к cookie-идентификатору, и атакующий может просто не отправлять соответствующий cookie-идентификатор, чтобы попытки входа не засчитывались.
Одинаковый код для разных действий
Уязвимость заключается в том, что код, высланный для подтверждения действия в одном интерфейсе (например, на странице регистрации) можно также использовать и для другого интерфейса (например, для входа в аккаунт)
SMS-флуд
Rate limit должен ограничивать не только количество попыток входа с одним номером, но и в целом запросы к приложению, поскольку атакующий может попытаться осуществить флуд не на конкретного пользователя, а массово, с целью нанесения ущерба самому сервису.
Небезопасные случайные числа
Как известно, код подтверждения должен быть случайным, поэтому, если его можно предугадать (например, если его значение зависит только от текущей секунды по Unix-времени), любой аккаунт можно угнать.
Блокирование пользователей
Если при превышении rate limit в приложении предусмотрена блокировка аккаунта пользователя, возможен массовый отказ в обслуживании: атакующий может просто осуществить несколько неуспешных попыток ввода кода для каждого из клиентов, таким образом заблокировав все аккаунты. Конечно, для этого нужно знать их номера телефонов или логины.
Перехват SMS
Не секрет, что SMS является небезопасным транспортом для передачи данных. Есть большое количество способов перехвата сообщений, включая атаки на уровне сигнальной сети SS7, атаки на абонента по GSM, компрометацию шлюза SMS-провайдера, компрометацию личного кабинета клиента на сайте оператора и т.д.
Возможность перехвата SMS описанными методами обычно не является недостатком реализации самого веб-сервиса, но необходимо учитывать риск такой атаки при разработке приложения.
Рекомендации
Для снижения уровня риска призываем следовать следующим советам:
Использовать 6-значные коды подтверждения
Ограничивать количество и частоту попыток ввода кода подтверждения с одного IP-адреса
Учитывать количество попыток как в текущей сессии, так и суммарно для номера телефона
Не блокировать аккаунт пользователя после нескольких неудачных попыток
Для каждой попытки входа генерировать новый уникальный код
Для подтверждения каждого действия использовать отдельный код
Не использовать предсказуемые идентификаторы и коды подтверждения
Для особо критичных сервисов не использовать SMS-подтверждения, заменить на 2FA или хотя бы push-уведомления или звонками
Last updated
Was this helpful?