Sui.

Publication

Partagez vos connaissances.

Benjamin XDV.
Jun 30, 2025
Questions et Réponses avec des Experts

What Are Common Security Pitfalls in Sui Move Development?

I’m auditing a Sui Move smart contract and want to avoid critical vulnerabilities. From reviewing past exploits, I’ve seen: access control issues, arithmetic overflows, reentrancy risks, frontrunning, improper object ownership

Questions:

What are the most critical Sui Move vulnerabilities to watch for?

How does Move’s ownership model prevent/differ from traditional reentrancy?

Are there Sui-specific attack vectors (e.g., object spoofing)?

  • Sui
  • Architecture
5
2
Partager
Commentaires
.

Réponses

2
Evgeniy CRYPTOCOIN.
Jun 30 2025, 18:08

Réponse

1. Les 5 principaux pièges de sécurité de Sui Move

Contrôle d'accès inapproprié

Risque : les fonctions qui devraient être restreintes peuvent être appelées par n'importe qui.

Exemple :

move
public fun admin_withdraw(signer: &signer) { // No check!  
    withdraw_coins(signer, ...);  
}  

Corriger :

move
public fun admin_withdraw(signer: &signer, admin_cap: &AdminCap) {  
    assert!(address_of(signer) == admin_cap.admin, EUnauthorized);  
}  

Point clé : utilisez des modèles de fonctionnalités (AdminCap, OwnerCap) pour gérer les opérations sensibles.

Débordements/sous-débits arithmétiques

Risque : les mathématiques u64 se déroulent silencieusement (par exemple, les soldes passent à 0 → 2^64-1).

Exemple :

move
let total = user_balance + deposit_amount; // Overflow possible  

Corriger :

move
use sui::math;  
let total = math::checked_add(user_balance, deposit_amount)?;  

Conseil de pro : utilisez toujours :

math : :checked_* (add/sub/mul/div)

balance : :join () /split () pour les pièces.

Conditions de course aux objets partagés

Risque : modifications simultanées apportées à des objets partagés (par exemple, des pools AMM) entraînant une altération de l'état.

Exemple :

move
// Two TXNs read pool.reserves simultaneously → bad swap rates  

Corriger :

Utilisez &mut exclusivement dans la mesure du possible.

Pour les objets partagés, concevez des opérations idempotentes (par exemple, exigez des résumés TXN sous forme de nonces).

Avantage de la combinaison : Le système de types de Move empêche la réentrée (contrairement à Solidity), mais les objets partagés peuvent toujours courir.

Frontrunning et MEV

Risque : les mineurs réorganisent les TXN pour en extraire la valeur (par exemple, attaques sandwich).

Exemple :

move
// AMM swap with no slippage check:  
let dy = reserve_y * dx / reserve_x; // Miner can manipulate `reserve_x/y`  

Corriger :

Exiger les paramètres min_received :


move
assert!(dy >= min_dy, EInsufficientOutput);  

Utilisez les vérifications des délais :

move
assert!(tx_context::epoch(ctx) <= deadline, EExpired);  
Phantom Type Confusion
Risk: Using the wrong type parameter (e.g., mixing Coin<USD> and Coin<USDC>).

Exemple :

move
public fun merge_coins<C>(a: Coin<C>, b: Coin<C>) { ... }  
// Can be called with `Coin<USD>` and `Coin<USDC>` if `C` isn’t constrained!  

Corriger :

move
constraint C: store + drop; // Restrict valid types  

###2. Vecteurs d'attaque spécifiques à Sui Usurpation d'objet Risque : faux objets injectés via des appels RPC malveillants. Défense :

Vérifiez toujours la propriété de l'objet (possède une clé et un champ propriétaire).

Utilisez des listes blanches d'identification d'objets pour les opérations critiques.

Détournement dynamique de champs Risque : l'attaquant ajoute des champs dynamiques malveillants à votre objet. Défense :

Marquez les objets avec Store uniquement si nécessaire.

Utilisez des wrappers privés pour les données sensibles.

5
Meilleure réponse
Commentaires
.
0xduckmove.
Jun 30 2025, 18:52

Il existe un article sur les meilleures pratiques de sécurité pour la construction sur Sui. C'est génial de vérifier ceci https://blog.sui.io/security-best-practices/

0
Commentaires
.

Connaissez-vous la réponse ?

Veuillez vous connecter et la partager.