Ключи кошельков хранятся отдельно
Приватные ключи никогда не попадают на серверы, которые обрабатывают запросы из интернета. Ключи создаются и хранятся только в отдельном сервисе подписи. Он не принимает входящих подключений из интернета, а ключи в нём зашифрованы AES-256-GCM ключом из Vault, который работает на отдельном сервере.
Ключ расшифровывается в памяти только на время одной подписи и сразу стирается. Остальная платформа видит только публичные адреса.
Сервис подписи проверяет каждую операцию сам
Даже если бы кто-то получил доступ к основному серверу, сервис подписи не подпишет произвольную транзакцию. Он независимо проверяет каждый запрос:
- лимиты на одну операцию, в час и в сутки по каждой монете;
- сбор средств с адресов платежей разрешён только на собственный кошелёк сервиса;
- монеты без настроенных лимитов не подписываются вообще;
- каждый запрос подписывается не более одного раза и записывается в журнал вместе с решением;
- подпись можно мгновенно заморозить для всего сервиса или одного кошелька.
Платёж засчитывается только после двойной проверки
Moonvex подключён к нескольким независимым провайдерам узлов в каждой сети. Платёж засчитывается, только когда транзакцию подтвердили два разных провайдера. Сбой или подмена данных у одного провайдера не может зачислить несуществующие деньги.
Каждый перевод в блокчейне учитывается ровно один раз: это гарантирует уникальный ключ в базе данных, а не только код приложения.
Учёт по двойной записи
Все движения денег записываются в бухгалтерский журнал по принципу двойной записи. Журнал только дополняется. Сбалансированность проводок проверяет сама база данных: несбалансированную операцию она не примет, даже если в коде будет ошибка.
Сервис регулярно сверяет учёт с реальными балансами кошельков в блокчейне. Расхождения попадают в отдельную очередь и разбираются вручную.
Выплаты: 2FA и лимиты
- каждая выплата из кабинета или Telegram-бота подтверждается одноразовым кодом из приложения 2FA;
- код нельзя использовать повторно, число попыток ограничено;
- на выплаты действуют лимиты на одну операцию и в сутки, так что даже при утечке пароля нельзя быстро вывести весь баланс;
- выплата по API требует идемпотентного ключа, поэтому повтор запроса после таймаута не создаст вторую выплату.
Защита аккаунта
- пароли хранятся только в виде хеша argon2id;
- двухфакторная аутентификация (TOTP) в кабинете, секреты 2FA зашифрованы;
- блокировка после серии неудачных входов, ограничение частоты запросов;
- роли в команде: владелец, разработчик, бухгалтер, наблюдатель. Каждый видит и делает только своё;
- ключи API хранятся в виде хеша, у них есть права доступа, срок действия, отзыв и белый список IP.
Подписанные уведомления
Каждый webhook подписан HMAC-SHA256 с отметкой времени. Ваш сервер может проверить, что уведомление пришло от Moonvex и не было изменено или повторено. Доставка повторяется до трёх суток, журнал отправок виден в кабинете.
Webhooks отправляются только на адреса https. Внутренние и служебные адреса блокируются после разрешения DNS, переадресации не выполняются: через настройку webhook нельзя атаковать внутреннюю сеть.
Журнал аудита
Действия администраторов — изменения комиссий, лимитов, заморозки, выплаты — записываются в журнал, каждая запись которого связана с предыдущей хешем SHA-256. Удалить или тихо изменить запись задним числом нельзя: цепочка перестанет сходиться. Доступ к панели администратора разрешён только с доверенных сетей и требует 2FA.
Что можете сделать вы
- включите 2FA в кабинете — без неё нельзя выводить средства;
- всегда проверяйте подпись webhook и не засчитывайте заказ по одному только редиректу клиента;
- храните секретный ключ API только на сервере, не в коде сайта или мобильного приложения;
- ограничьте ключ API своими IP-адресами;
- выдавайте сотрудникам минимально нужные роли.
Нашли уязвимость?
Напишите нам до публичного раскрытия и опишите, как воспроизвести проблему. Не обращайтесь к чужим данным и не нарушайте работу сервиса при проверке. Мы ответим, исправим проблему и сообщим, когда исправление будет выпущено. Контакт указан в файле /.well-known/security.txt.
Связаться с нами
Вопросы по безопасности и сообщения об уязвимостях: [email protected]. Отвечаем на каждое сообщение.
Правила сервиса →