Вход в любой чужой аккаунт
Пароль, телефон и почта жертвы не нужны. Хватало публичных данных из блокчейна.
Заказчик: · NDA
- Доступанонимно
- Затронутывсе EVM-кошельки
- Исправленоза сутки
О продукте
Мобильное приложение для покупки и обмена криптовалют. Приватные ключи хранятся только на устройстве пользователя. Регистрация и вход используют один API-запрос: сервер проверяет цифровую подпись и выдаёт токены сессии.
Где была ошибка
Сервер проверял подпись по расширенному публичному ключу xpub, а аккаунт выбирал по отдельному полю publicKey. Связь между полями не проверялась. Подпись собственным ключом проходила проверку, но сервер выдавал сессию чужого аккаунта.
Публичный ключ владельца можно восстановить из подписи его транзакции в EVM-сети. Секреты и устройство владельца для этого не нужны. Сервер также не проверял срок действия подписи и не блокировал повторный вход с тем же запросом.
Чем это грозило
- Чтение профиля, балансов и истории операций
- Перехват уведомлений пользователя
- Подмена привязанного адреса кошелька
- Утечка клиентской базы и регуляторный риск
Вывести деньги злоумышленник не мог: для этого нужна подпись с телефона пользователя.
Как доказали
На тестовой среде с тем же кодом запрос вернул HTTP 200 и JWT чужого тестового аккаунта. Сессия открывала профиль, историю операций и балансы. Также подтвердили подмену адреса кошелька и перенаправление push-уведомлений.
После исправления повторили проверку: подменный вход вернул 401, обычный вход продолжил работать. Данные реальных пользователей не затрагивали.
Как исправили
Каждая проверка по отдельности работала верно. Уязвимость была в связи между ними.
Исправлено