Accueil / Bibliothèque
référence

Bibliothèque des vulnérabilités de smart contracts

Chaque classe de vulnérabilité expliquée, avec un exemple vulnérable et sa version corrigée.

Reentrancy

Un appel externe effectué avant la mise à jour de l'état permet à un attaquant de réentrer la fonction avant que les soldes soient décrémentés. Appliquez checks-effects-interactions et utilisez un garde anti-reentrancy.

// vulnerable
function withdraw(uint a) public {
  require(bal[msg.sender] >= a);
  (bool ok,) = msg.sender.call{value:a}("");
  bal[msg.sender] -= a; // too late
}
// fixed
function withdraw(uint a) public nonReentrant {
  require(bal[msg.sender] >= a);
  bal[msg.sender] -= a;                 // effects first
  (bool ok,) = msg.sender.call{value:a}("");
  require(ok);
}

Authentification via tx.origin

Utiliser tx.origin pour l'autorisation permet à un contrat intermédiaire d'agir au nom de l'utilisateur. Utilisez msg.sender.

Manipulation d'oracle / de prix

Lire un prix spot depuis une seule pool le rend manipulable par un gros swap, souvent financé par un flash loan. Préférez un prix moyen pondéré dans le temps (TWAP) ou un oracle agrégé.

Contrôle d'accès manquant

Une fonction sensible sans modifier de restriction peut être appelée par n'importe qui. Protégez les fonctions privilégiées avec onlyOwner ou des vérifications de rôle.

Appel externe non vérifié

Ignorer la valeur de retour d'un appel bas niveau laisse le contrat continuer après un transfert échoué. Vérifiez toujours le booléen retourné.

Failles de logique métier

Une comparaison inversée ou un calcul de part erroné casse un invariant. Ces failles sont propres au contrat, échappent aux détecteurs génériques et sont souvent les plus coûteuses. Décrivez le comportement attendu et comparez-le au code.

Envie de vous exercer à les exploiter en toute sécurité ? Voir Apprendre. Prêt à scanner votre propre contrat ? Ouvrez le scanner.

▶ Ouvrir le scanner