Attaque par déni de service dans les smart contracts Rust
L'attaque par déni de service ( DoS ) peut rendre les smart contracts inutilisables pendant une période, voire de manière permanente. Les principales raisons incluent :
La logique du contrat présente un défaut de complexité de calcul élevé, entraînant une consommation de Gas dépassant la limite.
Lors d'un appel entre contrats, l'exécution du contrat dépend de contrats externes peu fiables, ce qui entraîne un blocage.
Le propriétaire du contrat a perdu sa clé privée, il est impossible d'exécuter des fonctions de privilège pour mettre à jour des états importants.
Voici une analyse des vulnérabilités des attaques par déni de service à travers des exemples concrets.
1. Parcourir des structures de données volumineuses contrôlées par l'extérieur
Voici un contrat simple pour "distribuer des dividendes" aux utilisateurs :
pub fn register_account(&mut self) {
si self.accounts.insert(&env::predecessor_account_id(), &0).is_some() {
env::panic("Le compte est déjà enregistré".to_string().as_bytes());
} else {
self.registered.push(env::predecessor_account_id());
}
log!("Compte enregistré {}", env::predecessor_account_id());
}
pub fn distribute_token(&mut self, amount: u128) {
assert_eq!(env::predecessor_account_id(), DISTRIBUTEUR, "ERR_NOT_ALLOWED");
pour cur_account dans self.registered.iter() {
let balance = self.accounts.get(&cur_account).expect("ERR_GET");
self.accounts.insert(\u0026cur_account, \u0026balance.checked_add(amount).expect("ERR_ADD"));
log!("Try distribute to account {}", &cur_account);
ext_ft_token::ft_transfer(
cur_account.clone(),
montant,
&FTTOKEN,
0,
GAS_FOR_SINGLE_CALL
);
}
}
Ici, la taille de self.registered n'est pas limitée, ce qui peut être manipulé par des utilisateurs malveillants et devenir trop grand, entraînant des frais de Gas dépassant la limite lors de l'exécution de distribute_token.
Solution : Il n'est pas recommandé de parcourir de grandes structures de données contrôlées par des tiers. Il est possible d'adopter un mode de retrait, permettant aux utilisateurs de récupérer eux-mêmes les "dividendes".
2. La dépendance d'état entre les contrats croisés entraîne un blocage
Le retour des tokens au précédent enchérisseur le plus élevé est une condition préalable à la mise à jour de l'état. Si le compte de cet utilisateur a été désactivé, cela entraînera un blocage de l'ensemble du processus d'enchères.
Méthode de résolution : prendre en compte la possibilité d'échec des appels externes et augmenter la gestion des erreurs. Il est possible de mettre en attente les jetons non remboursables, puis de permettre aux utilisateurs de les extraire eux-mêmes par la suite.
3. Clé privée du propriétaire perdue
Certaines fonctions clés sont définies comme exécutables uniquement par le propriétaire. Si le propriétaire ne peut pas exercer ses fonctions, ( comme la perte de la clé privée ), cela entraînera le dysfonctionnement du contrat.
Solution : mettre en place plusieurs propriétaires pour une gouvernance partagée, ou adopter des demandes de multi-signature en remplacement du contrôle d'un unique propriétaire, afin d'atteindre une gouvernance décentralisée.
</accountid,balance></accountid,>
Voir l'original
Cette page peut inclure du contenu de tiers fourni à des fins d'information uniquement. Gate ne garantit ni l'exactitude ni la validité de ces contenus, n’endosse pas les opinions exprimées, et ne fournit aucun conseil financier ou professionnel à travers ces informations. Voir la section Avertissement pour plus de détails.
7 J'aime
Récompense
7
7
Partager
Commentaire
0/400
gaslight_gasfeez
· Il y a 11h
Les fourmis des frais de gaz se sont regroupées.
Voir l'originalRépondre0
ImpermanentTherapist
· Il y a 11h
Encore des petits coups dans le contrat externe.
Voir l'originalRépondre0
WealthCoffee
· Il y a 11h
Encore une histoire de frais de Gas, c'est énervant.
Voir l'originalRépondre0
LiquidationTherapist
· Il y a 11h
C'est aussi simple que ça, le contrat est verrouillé.
Voir l'originalRépondre0
SquidTeacher
· Il y a 11h
Vous faites des erreurs aussi basiques que de perdre une clé privée ?
Voir l'originalRépondre0
BlockTalk
· Il y a 11h
Perdre sa clé privée, c'est vraiment effrayant.
Voir l'originalRépondre0
CryptoAdventurer
· Il y a 11h
Encore une fois, les smart contracts se sont effondrés, l'adresse de votre Portefeuille prend feu, mon frère.
Analyse des attaques DoS sur les smart contracts : interprétation des cas et stratégies de défense
Attaque par déni de service dans les smart contracts Rust
L'attaque par déni de service ( DoS ) peut rendre les smart contracts inutilisables pendant une période, voire de manière permanente. Les principales raisons incluent :
La logique du contrat présente un défaut de complexité de calcul élevé, entraînant une consommation de Gas dépassant la limite.
Lors d'un appel entre contrats, l'exécution du contrat dépend de contrats externes peu fiables, ce qui entraîne un blocage.
Le propriétaire du contrat a perdu sa clé privée, il est impossible d'exécuter des fonctions de privilège pour mettre à jour des états importants.
Voici une analyse des vulnérabilités des attaques par déni de service à travers des exemples concrets.
1. Parcourir des structures de données volumineuses contrôlées par l'extérieur
Voici un contrat simple pour "distribuer des dividendes" aux utilisateurs :
rouille #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Contract { pub registered: Vec, pub accounts: UnorderedMap\u003caccountid, balance=""\u003e, }
pub fn register_account(&mut self) { si self.accounts.insert(&env::predecessor_account_id(), &0).is_some() { env::panic("Le compte est déjà enregistré".to_string().as_bytes()); } else { self.registered.push(env::predecessor_account_id()); }
log!("Compte enregistré {}", env::predecessor_account_id()); }
pub fn distribute_token(&mut self, amount: u128) { assert_eq!(env::predecessor_account_id(), DISTRIBUTEUR, "ERR_NOT_ALLOWED"); pour cur_account dans self.registered.iter() { let balance = self.accounts.get(&cur_account).expect("ERR_GET"); self.accounts.insert(\u0026cur_account, \u0026balance.checked_add(amount).expect("ERR_ADD")); log!("Try distribute to account {}", &cur_account); ext_ft_token::ft_transfer( cur_account.clone(), montant, &FTTOKEN, 0, GAS_FOR_SINGLE_CALL ); } }
Ici, la taille de self.registered n'est pas limitée, ce qui peut être manipulé par des utilisateurs malveillants et devenir trop grand, entraînant des frais de Gas dépassant la limite lors de l'exécution de distribute_token.
Solution : Il n'est pas recommandé de parcourir de grandes structures de données contrôlées par des tiers. Il est possible d'adopter un mode de retrait, permettant aux utilisateurs de récupérer eux-mêmes les "dividendes".
2. La dépendance d'état entre les contrats croisés entraîne un blocage
Considérer un contrat de "licitation" :
rouille #[near_bindgen] #[derive(BorshDeserialize, BorshSerialize)] pub struct Contract { pub registered: Vec\u003caccountid\u003e, pub bid_price: UnorderedMap\u003caccountid,balance\u003e, pub current_leader: AccountId, pub highest_bid: u128, pub refund: bool }
PromiseOrValue { assert!(amount > self.highest_bid); if self.current_leader == DEFAULT_ACCOUNT { self.current_leader = sender_id; self.highest_bid = amount; } else { ext_ft_token::account_exist( self.current_leader.clone)(, &FTTOKEN, 0, env::prepaid_gas() - GAS_FOR_SINGLE_CALL * 4, (.then)ext_self::account_resolve) sender_id, montant, &env::current_account_id((, 0, GAS_FOR_SINGLE_CALL * 3, (); } log!) "current_leader: {} highest_bid: {}", self.current_leader, self.highest_bid ); PromiseOrValue::Value(0) }
Le retour des tokens au précédent enchérisseur le plus élevé est une condition préalable à la mise à jour de l'état. Si le compte de cet utilisateur a été désactivé, cela entraînera un blocage de l'ensemble du processus d'enchères.
Méthode de résolution : prendre en compte la possibilité d'échec des appels externes et augmenter la gestion des erreurs. Il est possible de mettre en attente les jetons non remboursables, puis de permettre aux utilisateurs de les extraire eux-mêmes par la suite.
3. Clé privée du propriétaire perdue
Certaines fonctions clés sont définies comme exécutables uniquement par le propriétaire. Si le propriétaire ne peut pas exercer ses fonctions, ( comme la perte de la clé privée ), cela entraînera le dysfonctionnement du contrat.
Solution : mettre en place plusieurs propriétaires pour une gouvernance partagée, ou adopter des demandes de multi-signature en remplacement du contrôle d'un unique propriétaire, afin d'atteindre une gouvernance décentralisée.