Reentrancy
Ein externer Aufruf vor der State-Aktualisierung erlaubt einem Angreifer, die Funktion erneut zu betreten, bevor die Salden verringert werden. Befolge Checks-Effects-Interactions und nutze einen Reentrancy-Guard.
// 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);
}
Authentifizierung über tx.origin
tx.origin zur Autorisierung erlaubt einem Zwischenvertrag, im Namen des Nutzers zu handeln. Nutze msg.sender.
Oracle-/Preismanipulation
Einen Spotpreis aus einer einzigen Pool zu lesen macht ihn durch einen großen Swap manipulierbar, oft per Flash Loan finanziert. Bevorzuge einen zeitgewichteten Durchschnittspreis (TWAP) oder ein aggregiertes Oracle.
Fehlende Zugriffskontrolle
Eine sensible Funktion ohne einschränkenden Modifier kann von jedem aufgerufen werden. Sichere privilegierte Funktionen mit onlyOwner oder Rollenprüfungen.
Ungeprüfter externer Aufruf
Den Rückgabewert eines Low-Level-Calls zu ignorieren lässt den Vertrag nach einem fehlgeschlagenen Transfer weiterlaufen. Prüfe immer den zurückgegebenen Boolean.
Geschäftslogik-Fehler
Ein invertierter Vergleich oder falsche Anteilsberechnung bricht eine Invariante. Diese Fehler sind vertragsspezifisch, entgehen generischen Detektoren und sind oft die teuersten. Beschreibe das erwartete Verhalten und vergleiche es mit dem Code.
Willst du das sichere Ausnutzen üben? Siehe Lernen. Bereit, deinen Vertrag zu scannen? Scanner öffnen.