Заказать
Все кейсы
Кейс 03 / 08CRITICAL · CVSS 8.5
Крипто-приложение · обмен без комиссии

Риск потерять весь баланс кошелька сервиса

Сервис платил комиссию сети за пользователей. Проверка перед оплатой оказалась неполной.

Заказчик: · NDA

  • Доступанонимная регистрация
  • Деньги клиентовне затронуты
  • Эксплуатацияне найдена
100 %баланса горячего кошелька под угрозой
Горячий кошелёк сервиса
БалансОбмен работает
0,65 SOL
Деньги пользователей не затронуты
Комиссия за обмен клиента−0,000005 SOL
Один анонимный заказ−0,65 SOL
После исправления: чужая транзакция отклонена
01

О продукте

В Solana приложение оплачивало обмен токенов за пользователей без SOL на балансе. Сервер собирал транзакцию, клиент подписывал её и возвращал. Затем сервис добавлял подпись своего горячего кошелька и отправлял транзакцию в сеть.

02

Где была ошибка

Перед подписью сервер запрещал только прямой перевод SOL с кошелька сервиса через операцию Transfer. Другой способ списания, CreateAccount, проходил: средства направлялись на создание счёта под контролем атакующего.

Сервис не сравнивал транзакцию клиента с исходной транзакцией обмена. Поэтому его подпись подтверждала чужие инструкции и сумму списания. Под угрозой был весь операционный баланс, в том числе после каждого пополнения.

03

Чем это грозило

  • Потеря баланса операционного кошелька
  • Повтор после каждого пополнения
  • Остановка обмена без комиссии для всех

Средства пользователей были в безопасности: их кошельки хранятся у них.

04

Как доказали

В локальной проверке с точной копией серверного кода подменённая транзакция прошла проверку и получила подпись сервиса. Контрольный прямой перевод был отклонён. Транзакции в сеть не отправляли, средства не списывали.

В истории кошелька за год следов эксплуатации не нашли. После исправления подмена отклонялась, а подпись исходной серверной транзакции проходила.

05

Как исправили

Сервис подписывает почти всё, что прислали

  • Исходная транзакция не использовалась для проверки ответа клиента
  • Клиент мог заменить инструкции, получателей и суммы
  • Чёрный список блокировал только один способ списания

Сервис подписывает только свою сборку

  • Сервер сохраняет исходную транзакцию в заказе
  • Перед подписью сообщение сверяется с исходным байт в байт
  • Любая подмена отклоняется; прежние проверки сохранены вторым слоем
Урок

Подписывайте только то, что собрали сами. Чёрный список никогда не бывает полным.

Исправлено
Заявка

Проверим ваш продукт до того, как это сделает кто-то другой

Опишите продукт в двух словах. Ответим в течение рабочего дня и предложим формат: чёрный или белый ящик.

  • Договор и NDA до начала работ
  • Отчёт для бизнеса и для разработчиков
  • Повторная проверка после исправления