Ключі гаманців зберігаються окремо
Приватні ключі ніколи не потрапляють на сервери, які обробляють запити з інтернету. Ключі створюються та зберігаються лише в окремому сервісі підпису. Він не приймає вхідних підключень з інтернету, а ключі в ньому зашифровані 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]. Відповідаємо на кожне повідомлення.
Правила сервісу →