Второй фактор защищает, только если код одноразовый, ограничен по попыткам и не обходится. Сломай одно допущение — и аккаунт открыт.
Код не одноразовый, и его можно повторить. На проверке нет лимита, и её перебирают. Проверка гоняется с повторной отправкой, и один код используется на несколько попыток. Или запасной путь — старая версия API, устаревший вход, сброс через поддержку — вовсе пропускает код.
Двухфакторка — это цепочка, и атакующему нужен только слабейший узел. Этот узел почти никогда не криптография — это повторная отправка, счётчик попыток или запасной путь.
OTP — часто последние ворота перед движением денег: перевод, вывод, подтверждение карты. Если код обходится, атакующий не читает данные — он двигает средства. Это превращает бытовую дыру в финансовую.
Может быть — подмена SIM и перехват SMS добавляют риск. Но главная проблема почти всегда в логике проверки, а не в канале.
Только на изолированных аккаунтах и согласованных тестовых номерах — никогда против реальных клиентов.