Warum Smart Contracts auditiert werden
Die meiste Software lässt sich nach dem Fund eines Fehlers reparieren. Ein Smart Contract auf einer öffentlichen Chain meist nicht. ethereum.org hält fest, dass bereitgestellter Contract-Code meist nicht geändert werden kann, um Sicherheitslücken zu schließen, und schätzt, dass der durch Sicherheitsmängel in Smart Contracts gestohlene oder verlorene Wert leicht über 1 Milliarde US-Dollar liegt [1]. Der Code hält oft direkt Geld, ist für jeden öffentlich einsehbar, und ein Angreifer muss nur einen Fehler finden.
Diese Kombination ist der Grund, warum Contracts, die Werte halten, vor dem Deployment von Fachleuten außerhalb des Teams geprüft werden, das sie geschrieben hat. Die Frage ist nicht, ob Sie diese Prüfung brauchen, sondern was sie für Sie leisten kann und was nicht.
Was ein Audit tut
Ein Audit ist eine zeitlich begrenzte Prüfung einer bestimmten Version Ihrer Contracts durch Sicherheitsingenieure, die sie nicht geschrieben haben. Ein typischer Auftrag sieht so aus.
- 01
Umfang
Die Prüfer vereinbaren, welche Contracts bei welchem Commit im Umfang sind, und lesen Ihre Dokumentation dazu, was das System tun soll.
- 02
Manuelle Prüfung
Erfahrene Prüfer lesen den Code Zeile für Zeile und suchen nach bekannten Arten von Schwachstellen (Reentrancy, Fehler in der Zugriffskontrolle, ungeprüfte Aufrufe, Rechen- und Rundungsfehler) und nach Logik, die nicht zur erklärten Absicht passt.
- 03
Automatisierte Analyse
Statische Analysewerkzeuge, Fuzzer und manchmal formale Werkzeuge suchen nach Mustern und Randfällen, die ein Mensch übersehen könnte.
- 04
Bericht
Befunde werden nach Schweregrad aufgelistet, von kritisch bis informativ, jeder mit einer Erklärung und einer empfohlenen Korrektur.
- 05
Prüfung der Korrekturen
Ihr Team behebt die Befunde, und die Prüfer kontrollieren die Korrekturen. Der Abschlussbericht nennt, welche Befunde behoben, zur Kenntnis genommen oder offen gelassen wurden.
Die Schwachstellen, die Prüfer am häufigsten finden, in klarer Sprache
- Reentrancy: Der Contract sendet Mittel oder ruft einen anderen Contract auf, bevor er seine eigenen Aufzeichnungen aktualisiert, und der andere Contract ruft zurück, um dieselben Mittel noch einmal zu nehmen.
- Zugriffskontrolle: Eine Funktion, die einem Administrator vorbehalten sein sollte, kann jeder aufrufen, oder eine Administratorrolle lässt sich übernehmen.
- Preismanipulation: Der Contract liest einen Preis aus einer Quelle, die ein Angreifer innerhalb einer Transaktion bewegen kann, etwa einem dünnen Handelspool.
- Rundung und Genauigkeit: kleine Divisionsfehler, die ein Angreifer tausendfach wiederholt oder die einen ersten Einzahler die Anteile aller späteren verzerren lassen.
- Fehler bei Upgrades: ein Proxy, der auf den falschen Code zeigt, Speicher, der zwischen Versionen kollidiert, oder ein Initialisierer, den jeder aufrufen kann.
- Logik, die tut, was der Code sagt, aber nicht, was das Geschäft meinte: eine doppelt erhobene Gebühr, eine Frist, die verkehrt herum geprüft wird.
Was ein Audit nicht abdeckt
ethereum.org ist hier deutlich: Audits finden nicht jeden Fehler und sind vor allem als zusätzliche Prüfrunde gedacht [1]. Darüber hinaus beschränkt sich der Umfang der meisten Audits auf den Contract-Code. Viele Verluste kommen von woanders.
| Bereich | Warum es zählt | Was es stattdessen abdeckt |
|---|---|---|
| Code, der nach dem Audit geändert wurde | Der Bericht gilt für einen Commit. Eine spätere Änderung, so klein sie ist, ist nicht auditiert. | Eine Prüfung der Korrekturen oder ein neues Audit bei jeder Änderung an auditiertem Code |
| Private Schlüssel und Administratorkonten | Wer den Upgrade- oder Administratorschlüssel hält, kann das System oft ändern oder leeren. | Multisig-Wallets, Hardwareschlüssel, Timelocks und schriftliche Verfahren |
| Website und Backend | Ein kompromittiertes Frontend kann Nutzer bitten, etwas Schädliches zu signieren. | Sicherheitstests der Webanwendung und Kontrollen der Lieferkette |
| Orakel und externe Daten | Ein Contract, der einem Preis-Feed vertraut, ist nur so sicher wie der Feed. | Designprüfung von Orakelwahl, Grenzen und Rückfallebenen |
| Ökonomisches Design | Code kann genau wie geschrieben funktionieren und trotzdem über Anreize oder Marktmanipulation ausnutzbar sein. | Ökonomische und spieltheoretische Prüfung, Simulationen |
| Deployment und Konfiguration | Falsche Konstruktorargumente oder Adressen können ein perfektes Audit zunichtemachen. | Skriptbasierte, geprüfte Deployments und Verifizierung auf der Chain |
Wie Sie einen Auditbericht lesen
- 01
Prüfen Sie den Commit
Der Bericht nennt die genaue geprüfte Version. Stellen Sie sicher, dass sie Byte für Byte mit dem übereinstimmt, was Sie bereitgestellt haben, und dass die bereitgestellten Contracts auf der Chain verifiziert sind.
- 02
Lesen Sie Umfang und Annahmen
Welche Contracts drin waren, welche nicht, und was die Prüfer über Administratoren, Orakel und andere Contracts angenommen haben.
- 03
Sehen Sie sich den Status jedes Befunds an
Behoben, zur Kenntnis genommen oder offen. Ein zur Kenntnis genommener kritischer Befund ist eine geschäftliche Entscheidung, die jemand erklären können sollte.
- 04
Lesen Sie auch die informativen Hinweise
Sie beschreiben oft Designentscheidungen, die die Prüfer riskant, aber nicht falsch fanden, und das ist nützlich für Ihre nächste Version.
Wie Sie sich vorbereiten, damit sich das Audit lohnt
Die Zeit von Prüfern ist knapp und teuer, also ist jede Stunde, die sie damit verbringen, unklaren Code zu verstehen oder Fehler zu finden, die Ihre Tests hätten finden sollen, eine Stunde, die den subtilen Problemen fehlt, für die Sie sie bezahlen. Der Leitfaden von OpenZeppelin zur Audit-Bereitschaft legt dar, was er vor einem Audit erwartet.
- Dokumentation, die Absicht, Designentscheidungen und Annahmen erklärt, von einem README und Architekturnotizen bis zu Kommentaren an jeder Funktion [2].
- Tests, die Randfälle und das Zusammenspiel mit anderen Contracts abdecken, mit dem Ziel von mindestens 90 % Codeabdeckung, und Fuzzing, wo es hilft [2].
- Sauberer, lesbarer Code, der einem einheitlichen Stil folgt, bewährte Muster wie Checks-Effects-Interactions nutzt und Abhängigkeiten über einen Paketmanager einbindet statt sie zu kopieren [2].
- Ausgereifter Code: getestet, dokumentiert und bereit zum Deployment, statt noch in Veränderung [2].
Wir ergänzen zwei eigene Gewohnheiten. Der Code wird für die Dauer des Audits bei einem markierten Commit eingefroren, und jede Korrektur danach durchläuft dasselbe Review und dieselbe Testsuite wie die ursprüngliche Arbeit, bevor die Prüfer sie sehen.
Checklisten und Standards und ihre Grenzen
Checklisten helfen beiden Seiten, sich darauf zu einigen, was geprüft wurde. Sie altern aber. Das Register Smart Contract Weakness Classification, lange eine gängige Referenz, gibt an, dass sein Inhalt seit 2020 nicht gründlich aktualisiert wurde und unvollständig sein kann, und verweist stattdessen auf die Spezifikation EEA EthTrust Security Levels und den Smart Contract Security Verification Standard [3]. Fragen Sie jeden Prüfer, gegen welchen Standard er prüft, und betrachten Sie eine Befundliste, die nur einem alten Register zugeordnet ist, mit etwas Vorsicht.
Keine Checkliste ersetzt Verständnis. Die Hinweise von Consensys Diligence gehen davon aus, dass die Abwehr bekannter Schwachstellen nicht genügt und die Contract-Entwicklung die Disziplin von Bereichen wie Finanzsystemen braucht: auf Fehler vorbereitet sein und sorgfältig ausrollen [4].
Sicherheit über das Audit hinaus
Ein Audit ist eine Momentaufnahme. Der Contract läuft jahrelang, der Code um ihn herum ändert sich, und Angreifer studieren ihn weiter. Die Praktiken unten halten ein System zwischen Audits sicher, und die meisten kosten wenig im Vergleich zu dem, was sie schützen.
- Eigenschaftsbasierte Tests und Fuzzing, die weiterlaufen, während sich der Code ändert, neben Unit-Tests [1].
- Formale Verifizierung für die kritischsten Invarianten, wo die Kosten gerechtfertigt sind [1].
- Ein Bug-Bounty-Programm nach dem Start, damit Menschen, die ein Problem finden, für die Meldung bezahlt werden statt es auszunutzen [1].
- Ein schrittweises Ausrollen: anfangs Grenzen für Einlagen oder Nutzer, die angehoben werden, während sich das System bewährt [4].
- Ein Notfall-Pause und ein Upgrade-Weg, wenn das Design sie zulässt, kontrolliert über eine Multisig-Wallet mit Timelock, sodass Änderungen sichtbar sind, bevor sie wirksam werden.
- Überwachung der Aktivität auf der Chain und Warnungen bei ungewöhnlichen Transaktionen, mit einem schriftlichen Plan, wer was tut, wenn etwas schiefgeht.
Zwei Web3-Projekte, nach unserer Preisliste berechnet
Die durchgerechneten Beispiele unten zeigen die Spanne nach unserer heutigen Preisliste, mit den Stunden je Rolle und dem Zahlungsplan. Die Entwicklung umfasst unsere eigenen Tests und interne Sicherheitsprüfung. Ein externes Audit, wo der Contract es rechtfertigt, wird von der Auditfirma angeboten und vorab zum Selbstkostenpreis berechnet, außerhalb der Meilensteine.
Durchgerechnetes Beispiel, jetzt berechnet
Ein Satz Smart Contracts
Token- oder Treuhand-Contracts mit Administratorrolle, vollständiger Testsuite, Fuzzing und Deployment-Skripten, bereit für ein externes Audit.
- Entwicklung
- ≈ 20.700 USD bis 31.700 USD, delivered within 9 weeksCAD 29,500 to 45,100
Preise in Ihrer Währung sind Schätzungen zum heutigen Kurs der Bank of Canada. Alle Rechnungen werden in CAD oder USD gestellt.
Geschätzter Aufwand nach Rolle
- Développement
- 70 to 107 h
- Ingénieur chaîne de blocs
- 32 to 50 h
- Développeur frontal
- 19 to 29 h
- Ingénieur principal
- 16 to 25 h
- Ingénieur assurance qualité
- 15 to 23 h
- Gestionnaire de projet
- 14 to 22 h
- Développeur frontal principal
- 11 to 17 h
- Ingénieur
- 11 to 17 h
- Développeur dorsal principal
- 8 to 12 h
- Développeur frontal junior
- 8 to 11 h
- Développeur dorsal
- 7 to 11 h
- Architecte logiciel
- 4 to 7 h
- Développeur dorsal junior
- 4 to 5 h
- Ingénieur DevOps
- 3 to 5 h
- Rédacteur technique
- 3 to 4 h
- Concepteur de produits
- 2 to 3 h
- Concepteur de produits principal
- 1 to 2 h
Wie bezahlt wird
- Anzahlung 30%
- CAD 8,850 to 13,530
- Spécification 10%
- CAD 2,950 to 4,510
- Contrats et tests 30%
- CAD 8,850 to 13,530
- Déploiement sur réseau de test 10%
- CAD 2,950 to 4,510
- Réseau principal 10%
- CAD 2,950 to 4,510
- Holdback, 30 days after launch (10%)
- CAD 2,950 to 4,510
Durchgerechnetes Beispiel, jetzt berechnet
Eine dApp mit ihren Contracts
Contracts plus eine Web-App mit Wallet-Anmeldung, einem Verwaltungsbereich, Benachrichtigungen und Analytics, mit individuellem Design und Supportplan.
- Entwicklung
- ≈ 68.400 USD bis 105.000 USD, delivered within 22 weeksCAD 97,400 to 149,000
Preise in Ihrer Währung sind Schätzungen zum heutigen Kurs der Bank of Canada. Alle Rechnungen werden in CAD oder USD gestellt.
Geschätzter Aufwand nach Rolle
- Développement
- 287 to 440 h
- Développeur frontal
- 58 to 89 h
- Gestionnaire de projet
- 50 to 76 h
- Ingénieur assurance qualité
- 50 to 76 h
- Ingénieur chaîne de blocs
- 47 to 71 h
- Concepteur de produits
- 46 to 70 h
- Développeur dorsal principal
- 41 to 62 h
- Développeur dorsal
- 40 to 61 h
- Ingénieur principal
- 37 to 57 h
- Développeur frontal principal
- 35 to 54 h
- Concepteur de produits principal
- 31 to 47 h
- Développeur frontal junior
- 23 to 36 h
- Architecte logiciel
- 21 to 32 h
- Développeur dorsal junior
- 20 to 31 h
- Ingénieur
- 16 to 24 h
- Ingénieur DevOps
- 12 to 18 h
- Rédacteur technique
- 9 to 13 h
Wie bezahlt wird
- Anzahlung 20%
- CAD 19,480 to 29,800
- Découverte 3.5%
- CAD 3,409 to 5,215
- Spécification 6.3%
- CAD 6,136.20 to 9,387.00
- Maquettes approuvées 3.5%
- CAD 3,409 to 5,215
- Fonctions principales 10.5%
- CAD 10,227 to 15,645
- Développement complet 7%
- CAD 6,818 to 10,430
- Contrats et tests 19.1%
- CAD 18,603.40 to 28,459.00
- Tests et corrections 3.5%
- CAD 3,409 to 5,215
- Déploiement sur réseau de test 6.3%
- CAD 6,136.20 to 9,387.00
- Mise en ligne 3.5%
- CAD 3,409 to 5,215
- Réseau principal 6.8%
- CAD 6,623.20 to 10,132.00
- Holdback, 30 days after launch (10%)
- CAD 9,740 to 14,900
Einen Prüfer auswählen
- 01
Lesen Sie ihre öffentlichen Berichte
Seriöse Firmen veröffentlichen frühere Berichte. Achten Sie auf klare Befunde, vernünftige Schweregrade und ehrliche Abschnitte zum Umfang.
- 02
Fragen Sie, wer die Arbeit macht
Namen und Erfahrung der Prüfer in Ihrem Auftrag zählen mehr als die Marke.
- 03
Vereinbaren Sie den Umfang schriftlich
Welche Contracts, welcher Commit, welche Annahmen und ob eine Prüfung der Korrekturen enthalten ist.
- 04
Passen Sie den Aufwand dem Risiko an
Ein Contract, der erhebliche Werte halten wird, kann mehr als ein unabhängiges Audit rechtfertigen. Ein einfacher Contract auf auditierten Bibliotheken braucht vielleicht weniger.
- 05
Buchen Sie früh
Gute Prüfer sind Wochen im Voraus ausgebucht. Planen Sie das Audit, wenn Sie mit dem Bau beginnen, nicht wenn Sie fertig sind.
Wir bauen und testen Contracts, prüfen sie intern, helfen Ihnen, einen Prüfer zu wählen und zu briefen, und beheben die Befunde. Wir auditieren nicht unsere eigene Arbeit und nennen das unabhängig.