Риск потерять весь баланс кошелька сервиса
Сервис платил комиссию сети за пользователей. Проверка перед оплатой оказалась неполной.
Заказчик: · NDA
- Доступанонимная регистрация
- Деньги клиентовне затронуты
- Эксплуатацияне найдена
О продукте
В Solana приложение оплачивало обмен токенов за пользователей без SOL на балансе. Сервер собирал транзакцию, клиент подписывал её и возвращал. Затем сервис добавлял подпись своего горячего кошелька и отправлял транзакцию в сеть.
Где была ошибка
Перед подписью сервер запрещал только прямой перевод SOL с кошелька сервиса через операцию Transfer. Другой способ списания, CreateAccount, проходил: средства направлялись на создание счёта под контролем атакующего.
Сервис не сравнивал транзакцию клиента с исходной транзакцией обмена. Поэтому его подпись подтверждала чужие инструкции и сумму списания. Под угрозой был весь операционный баланс, в том числе после каждого пополнения.
Чем это грозило
- Потеря баланса операционного кошелька
- Повтор после каждого пополнения
- Остановка обмена без комиссии для всех
Средства пользователей были в безопасности: их кошельки хранятся у них.
Как доказали
В локальной проверке с точной копией серверного кода подменённая транзакция прошла проверку и получила подпись сервиса. Контрольный прямой перевод был отклонён. Транзакции в сеть не отправляли, средства не списывали.
В истории кошелька за год следов эксплуатации не нашли. После исправления подмена отклонялась, а подпись исходной серверной транзакции проходила.
Как исправили
Подписывайте только то, что собрали сами. Чёрный список никогда не бывает полным.
Исправлено