Модель безопасности
Криптографические примитивы
| Примитив | Алгоритм | Применение |
|---|---|---|
| Подписи | Ed25519 (ed25519-dalek) | Подпись транзакций, подпись блоков |
| Хеширование блоков | SHA-512 | Хеш блока с доменным тегом "BLK" |
| Хеширование транзакций | SHA-256 | Хеш сообщения для подписи |
| Хеширование состояния | BLAKE3 | Вычисление корня состояния |
| Хеширование хранилища | Keccak256 | Вычисление адресов слотов хранилища контрактов |
| Сжатие | snap, lz4 | Сжатие сообщений P2P |
Безопасность транспорта
Уровень P2P
- Шифрование: протокол Noise libp2p (аутентифицированное шифрование)
- Мультиплексирование: Yamux
- Идентичность: ключи узла Ed25519
- Максимальный размер передачи: 256 КБ на сообщение
Уровень RPC
- TLS: не терминируется сервером RPC. В продакшен-развёртываниях необходимо использовать обратный прокси с терминацией TLS.
- CORS: ограничен источниками localhost. Для продакшена настройте разрешённые источники.
- Лимит тела запроса: максимум 1 МБ.
Ограничение частоты запросов
| Уровень | Лимит | Окно |
|---|---|---|
| Глобальный RPC | 200 зап/с | Скользящее окно 1 секунда |
| RPC на IP | 50 зап/с | Скользящее окно 1 секунда |
| Размер пакета | 100 запросов | На HTTP-запрос |
| Сканирование хешей блоков | 1000 блоков | На вызов chain_getBlockByHash |
Валидация входных данных
RPC
- Версия JSON-RPC должна быть точно
"2.0" - Сообщения об ошибках санируются перед отправкой клиентам
- Внутренние ошибки возвращают общие сообщения (без трассировок стека или внутренних форматов)
- Детали отклонения мемпула исключаются из ответов с ошибками
Мемпул
- Валидация nonce: требуются последовательные nonce (допуск пробела до 5000 для восстановления от пиков)
- Проверка баланса: отправитель должен иметь достаточный баланс для суммы + комиссии
- Верификация подписи: подпись Ed25519 проверяется перед приёмом
- Система квот: лимиты на класс (Financial: 50 тыс., IoT: 100 тыс., Global: 100 тыс.)
- Ограничение на отправителя: максимум 512 ожидающих транзакций на отправителя
Конвейер транзакций
Проверки без состояния (выполняются первыми):
- Проверка формата подписи
- Верификация подписи Ed25519
- Проверка вывода публичного ключа → адрес
Проверки с состоянием (выполняются после прохождения проверок без состояния):
- Nonce >= nonce аккаунта
- Баланс >= сумма + комиссия
- Аккаунт не в чёрном списке
Атомарная фиксация: вычет баланса и увеличение nonce происходят атомарно.
Безопасность консенсуса
Кворум BFT
- Кворум: 2f+1 (67%) валидаторов должны подписать Block Acceptance Certificate
- Устойчивость к Byzantine-сбоям: до f = (n-1)/3 byzantine-узлов
- Верификация сертификата: мастерноды проверяют все подписи аттестации
Защита PoU от манипуляций
- Сглаживание оценки: экспоненциальное скользящее среднее предотвращает манипуляцию оценкой через временное поведение
- Ротация предложителей: после 50 блоков предложитель должен уступить место (предотвращает монополию)
- Минимальный порог оценки: оценка < 300 лишает права на вознаграждения
Безопасность выборов
- Детерминированные идентификаторы групп: основаны на эпохе, а не на системном времени (предотвращает разногласия мастернод)
- Дедупликация выборов: фиксируется только первый результат за раунд
- Мягкое отклонение неизвестных групп: мастерноды предупреждают, но продолжают обработку для неизвестных идентификаторов групп
Управление ключами
Кошелёк SDK
- Зерование: приватные ключи зеруются при
Drop(через крейтzeroize) - Без сохранения: кошелёк SDK не сохраняет ключи на диск
- Принудительный HTTPS: удалённые RPC-эндпойнты по умолчанию требуют HTTPS
Кран (Faucet)
- Ключи по кругу: 10 пар ключей чередуются для предотвращения конкуренции nonce
- Сериализованные заявки: мьютекс
faucet_lockпредотвращает гонки условий TOCTOU - Лимиты заявок: 5 SAVT за заявку, 24-часовое ограничение на адрес
Безопасность узлов
Жизнеспособность узлов
- Keepalive gossipsub: публикация оценки PoU через gossipsub обновляет
last_seen - Тайм-аут бездействия: 600 секунд (настраивается) перед удалением узла
- Отключение SlowPeer: узлы отключаются при переполнении очереди отправки gossipsub
Ограничения ресурсов
- Очередь обработчика соединений: 50 000 сообщений (LN + MN)
- Сетка gossipsub: mesh_n=8, mesh_n_high=12, mesh_n_low=4
- Размер стека: 8 МБ для предотвращения переполнения стека
- Память: ограниченные пулы мемпула с обратным давлением
Ответственное раскрытие
Сообщайте об уязвимостях безопасности через процесс ответственного раскрытия проекта. Не создавайте публичные задачи для ошибок безопасности.