Modèle de Sécurité
Primitives Cryptographiques
| Primitive | Algorithme | Utilisation |
|---|---|---|
| Signatures | Ed25519 (ed25519-dalek) | Signature de transactions, signature de blocs |
| Hachage de blocs | SHA-512 | Hachage de bloc avec balise de domaine "BLK" |
| Hachage de transactions | SHA-256 | Hachage du message de signature |
| Hachage d'état | BLAKE3 | Calcul de la racine d'état |
| Hachage de stockage | Keccak256 | Dérivation des emplacements de stockage des contrats |
| Compression | snap, lz4 | Compression des messages P2P |
Sécurité du Transport
Couche P2P
- Chiffrement : Protocole Noise de libp2p (chiffrement authentifié)
- Multiplexage : Yamux
- Identité : Clés de pairs Ed25519
- Taille maximale de transmission : 256 Ko par message
Couche RPC
- TLS : Non terminé par le serveur RPC. Les déploiements en production doivent utiliser un proxy inverse avec terminaison TLS.
- CORS : Restreint aux origines localhost. Configurer les origines autorisées pour la production.
- Limite du corps : Maximum 1 Mo pour le corps de la requête.
Limitation du Débit
| Couche | Limite | Fenêtre |
|---|---|---|
| RPC global | 200 req/s | Fenêtre glissante de 1 seconde |
| RPC par IP | 50 req/s | Fenêtre glissante de 1 seconde |
| Taille de lot | 100 requêtes | Par requête HTTP |
| Scan de hachage de bloc | 1000 blocs | Par appel chain_getBlockByHash |
Validation des Entrées
RPC
- La version JSON-RPC doit être exactement
"2.0" - Les messages d'erreur sont assainis avant d'être retournés aux clients
- Les erreurs internes retournent des messages génériques (pas de traces de pile ni de formats internes)
- Les détails de rejet du mempool sont supprimés des réponses d'erreur
Mempool
- Validation du nonce : Nonces séquentiels requis (tolérance d'écart jusqu'à 5000 pour la récupération en rafale)
- Vérification du solde : L'expéditeur doit avoir un solde suffisant pour le montant + les frais
- Vérification de signature : Signature Ed25519 vérifiée avant admission
- Système de quotas : Limites par classe (Finance : 50K, IoT : 100K, Global : 100K)
- Limite par expéditeur : Maximum 512 transactions en attente par expéditeur
Pipeline de Transactions
Gardes sans état (exécutés en premier) :
- Validation du format de signature
- Vérification de la signature Ed25519
- Vérification de la dérivation clé publique → adresse
Gardes avec état (exécutés après le passage sans état) :
- Nonce >= nonce du compte
- Solde >= montant + frais
- Compte non mis sur liste noire
Commit atomique : la déduction du solde et l'incrémentation du nonce se produisent de manière atomique.
Sécurité du Consensus
Quorum BFT
- Quorum : 2f+1 (67 %) des validateurs doivent signer le Certificat d'Acceptation de Bloc
- Tolérance byzantine : Jusqu'à f = (n-1)/3 nœuds byzantins
- Vérification des certificats : Les masternodes vérifient toutes les signatures d'attestation
Anti-Manipulation PoU
- Lissage du score : La moyenne mobile exponentielle empêche la manipulation du score via un comportement transitoire
- Rotation du proposant : Après 50 blocs, le proposant doit céder la place (prévient le monopole)
- Seuil de score minimum : Score < 300 disqualifie des récompenses
Sécurité des Élections
- Identifiants de groupe déterministes : Basés sur l'époque, non sur l'horloge murale (évite le désaccord entre MN)
- Déduplication des élections : Seul le premier résultat par session est validé
- Rejet doux des groupes inconnus : Les masternodes avertissent mais continuent le traitement pour les identifiants de groupe inconnus
Gestion des Clés
Portefeuille SDK
- Zéroïsation : Les clés privées sont zéroïsées à la libération (via la crate
zeroize) - Pas de persistance : Le portefeuille SDK n'enregistre pas les clés sur disque
- Application HTTPS : Les points de terminaison RPC distants nécessitent HTTPS par défaut
Faucet
- Clés en rotation : 10 paires de clés rotatives pour éviter la contention de nonce
- Réclamations sérialisées : Le mutex
faucet_lockempêche les conditions de course TOCTOU - Limites de réclamation : 5 SAVT par réclamation, délai de 24 heures par adresse
Sécurité des Nœuds
Vivacité des Pairs
- Keepalive Gossipsub : Le partage de score PoU publie via gossipsub pour rafraîchir
last_seen - Délai d'inactivité : 600 secondes (configurable) avant suppression du pair
- Déconnexion SlowPeer : Les nœuds sont déconnectés si la file d'envoi gossipsub est saturée
Limites des Ressources
- File du gestionnaire de connexion : 50 000 messages (LN + MN)
- Maillage Gossipsub : mesh_n=8, mesh_n_high=12, mesh_n_low=4
- Taille de pile : 8 Mo pour éviter le débordement de pile
- Mémoire : Pools de mempool bornés avec contre-pression
Divulgation Responsable
Signalez les vulnérabilités de sécurité via le processus de divulgation responsable du projet. Ne créez pas de tickets publics pour les bogues de sécurité.