Testen und formelle Verifizierung für Web3 Smart Contract Security

Testen und formelle Verifizierung für Web3 Smart Contract Security

Tests und formale Verifizierung für Web3 Smart Contract Security PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Lesezeit: 9 Minuten

Stellen Sie sich vor, Sie gehen Fallschirmspringen. Bevor Sie aus dem Flugzeug springen, werden Sie hundert Mal nach Ihrem Fallschirm suchen, richtig? Prüfen und Testen sind ein integraler Bestandteil der Sicherheit; Denken Sie an alle sicherheitsrelevanten Dinge. Es würde wahrscheinlich einen anschließenden Testmechanismus geben, sei es die Installation einer Videoüberwachung oder die Überprüfung der Tinte im Stift vor einer schriftlichen Prüfung in der Schule, wir alle befolgen Sicherheitsmaßnahmen. Je höher das damit verbundene Risiko, desto mehr testen wir. Und wenn wir über intelligente Verträge sprechen, ist das Risiko RIESIG. Sie können nicht nachlässig sein, wenn es um die Sicherheit von Smart Contracts geht.

1. Sicherheit wird immer benötigt.

Sie können die Tür sicher zweimal oder dreimal abschließen, spielt keine Rolle. Können Sie sicher sein, dass Ihr Haus nicht ausgeraubt werden kann, während Sie weg sind? Sie können nicht, weil Sie nicht wissen, was der Räuber tun könnte, um in das Haus einzubrechen – das gleiche gilt für alle Sicherheitsmaßnahmen, die wir ergreifen. Es gibt keine absolut sichere Methode, die Sicherheit garantiert. Dennoch erhöhen die Maßnahmen, die wir schnell ergreifen, unsere Chancen, sicher zu sein, was das Spiel ausmacht. Wir wollen die Chancen auf Sicherheit durch verschiedene Maßnahmen erhöhen.

Die Welt von Web3 ist nicht anders. Es gibt keine sichere Methode, um sich selbst zu retten, aber erfahrene Auditoren von QuillAudits können die Chancen, dass Ihr Protokoll gesichert wird, enorm erhöhen und Ihre Sicherheit auf dem neuesten Stand gewährleisten. In web3 gibt es zwei wichtige Mechanismen, die Ihnen helfen zu verstehen, wie sicher Sie sind, indem Sie einige Tests an Ihrem Protokoll durchführen:-

  1. Intelligente Vertragsprüfung
  2. Formale Verifizierung von Smart Contracts

Lassen Sie uns sie im Detail verstehen und erfahren, wie sie uns helfen, die Schwachstellen oder Schwachstellen unserer Verträge zu erkennen.

2. Intelligente Vertragsprüfung

Ein erfahrener Entwickler kann einer Maschine mit Code die Arbeit erklären. Manchmal stellt die Maschine jedoch aufgrund eines Fehlers oder eines logischen Fehlers im Code nicht genau den Mechanismus dar, den der Entwickler im Sinn hatte. Testen ist der Prozess, der dabei hilft, festzustellen, wo unser Code fehlschlägt und was getan werden kann, damit er der Aktion entspricht, die er ausführen soll.

Intelligente Vertragsprüfung ist eine Phase im Entwicklungszyklus, in der wir eine detaillierte Analyse unserer Verträge durchführen und versuchen herauszufinden, wo und warum unser Code versagt. Fast alle Smart Contracts durchlaufen diese Phase. Es gibt zwei Möglichkeiten, wie Smart Contract-Tests durchgeführt werden. Lassen Sie uns sie erkunden.

2.1 Automatisiert

Wie der Name schon sagt, wird diese Methode zum Testen von Smart Contracts verwendet, um Skripttests durchzuführen. Es handelt sich um eine automatisierte Software, die wiederholte Tests durchführt, um Schwachstellen und Fehler in Smart Contracts zu finden. Diese automatisierten Testwerkzeuge können mit Testdaten und erwarteten Ergebnissen konfiguriert werden. Dann wird das tatsächliche Ergebnis mit den erwarteten verglichen, um zu prüfen, ob der Vertrag ordnungsgemäß funktioniert. Automatisierte Tests können weiter in drei Kategorien eingeteilt werden.

2.1.1. Funktionsprüfung

Angenommen, Sie schreiben ein Programm, das zwei Zahlen, a und b, nimmt und dann die Addition beider Zahlen zurückgibt. Um dieses Programm zu überprüfen, geben Sie also 2 und 8 ein und füttern das erwartete Ergebnis mit 10. Wenn das Programm jetzt ausgeführt wird, sollte es auch 10 zurückgeben. Wenn dies der Fall ist, funktioniert es einwandfrei, und unser Code ist korrekt, aber wenn es so ist nicht, dann liegt ein Fehler in unserem Code vor. 

Funktionstests erfordern ein Verständnis dafür, wie sich Ihr Vertrag unter bestimmten Bedingungen verhalten sollte. Wir können es testen, indem wir eine Berechnung mit ausgewählten Werten ausführen und die zurückgegebene Ausgabe vergleichen. Functional Testing hat drei Klassen:-

  1. Unit-Test:- Hier geht es um das Testen einzelner Bestandteile des Smart Contracts auf Korrektheit. Es ist durchsetzungsfähig oder erfordert Anweisungen zu Variablen.
  1. Integration Testing: – Dabei geht es um das gemeinsame Testen mehrerer Einzelkomponenten. Integrationstests sind in der Hierarchie eine Ebene höher als Komponententests. Es hilft uns, Fehler zu ermitteln, die sich aus dem Zusammenspiel verschiedener Funktionen ergeben, die Teil anderer Smart Contracts sein können.
  1. System Texteng: – Dies ist die höchste in der Hierarchie. Dabei testen wir den gesamten Vertrag als ein vollständig integriertes System, um zu sehen, ob es unseren Anforderungen entspricht. Dies geschieht aus der Sicht des Benutzers, und der beste Weg, dies zu tun, besteht darin, es auf Testnetzen bereitzustellen.

2.1.2. Statische Analyse

Die statische Analyse kann durchgeführt werden, ohne dass das Programm ausgeführt wird. Es beinhaltet die Analyse des Quellcodes oder Bytecodes des Smart Contracts vor der Ausführung. Die statische Analyse, die ihrem Namen entspricht, kann zur Erkennung einiger häufiger Schwachstellen führen.

2.1.3. Dynamische Analyse

Im Gegensatz zur statischen Analyse wird die dynamische Analyse während der Laufzeit der Smart Contracts durchgeführt, um Probleme im Code zu identifizieren. Die dynamischen Code-Analysatoren beobachten den laufenden Zustand des Vertrags und erstellen einen detaillierten Bericht über Schwachstellen und Eigentumsverletzungen. Fuzzing fällt unter die dynamische Analyse. Fuzzing speist falsche oder böswillige Eingaben ein, um eine unbeabsichtigte Codeausführung zu verursachen.

2.2-Handbuch

Wie der Name schon sagt, beinhaltet diese Methode des Smart Contract Testings eine regelmäßige Interaktion mit einem menschlichen Entwickler. Code-Audits, bei denen Entwickler Codezeilen durchgehen, fallen unter den manuellen Modus des Smart-Contract-Tests.

Der manuelle Modus erfordert viel Zeit, Geschick, Geld und Mühe. Dennoch lohnt sich das Ergebnis oft, denn damit identifizieren wir Schwachstellen, die beim automatischen Testen möglicherweise unbemerkt bleiben. Es gibt zwei wesentliche Arten von manuellen Tests:-

2.2.1 Code-Audits:- 

Der beste Weg, um zu testen, ob Ihre Sicherheitsmaßnahme richtig funktioniert, besteht darin, zu versuchen, sie zu brechen. Wenn Sie zum Beispiel überprüfen möchten, ob Ihr Autoschloss richtig funktioniert, versuchen Sie es aufzubrechen. Jetzt fragen Sie vielleicht, dass ein geschickter Autodieb leicht in mein Auto einbrechen kann. Vielleicht nicht, also besteht die Lösung darin, jemanden einzustellen, der sich mit dem Einbrechen auskennt, damit er Sie führen kann!

 Ja, ich spreche von QuillAudits. Wir sind ein Team von erfahrenen Auditoren, die Sie anleiten können. Code-Audits erfordern eine Angreifer-Mentalität, um alle möglichen Schwachstellen im Quellcode zu finden. Ein Code-Audit ist eine detaillierte Bewertung des Codes eines Smart Contracts, um potenzielle Schwachstellen und Fehler aufzudecken.

2.2.2 Bug-Bounty:-

Wenn Sie glauben, dass es Sicherheitslücken in Ihrem Quellcode gibt (was meistens der Fall ist) und Sie diese nicht finden können, können Sie diese Arbeit an Freiberufler auslagern, indem Sie ein Belohnungssystem erstellen. Es ist eher so, als würde man eine Belohnung für jeden ankündigen, der Ihren Smart Contract hacken kann. Auf diese Weise lernen Sie die in Ihrem Smart Contract vorhandene Schwachstelle kennen, damit Sie ihn besser schützen und Ihre Benutzer vor Verlust bewahren können.

3. Formale Verifizierung von Smart Contracts

Formale Verifizierung ist der Prozess der Bewertung der Korrektheit eines Vertrags auf der Grundlage formaler Spezifikationen. Das bedeutet, dass die formale Verifizierung bewertet, ob der Code das tut, was beabsichtigt ist. Bei der formalen Verifizierung werden formale Methoden zum Spezifizieren, Entwerfen und Verifizieren von Programmen verwendet.

3.1 Was ist die formale Spezifikation?

Im Zusammenhang mit Smart Contracts beziehen sich formale Spezifikationen auf die Eigenschaften, die unter allen Umständen gleich bleiben müssen. Dies sind „invariante“ Eigenschaften, da sie sich nicht ändern können und logische Aussagen über die Vertragsausführung darstellen.

Formale Spezifikation ist eine Sammlung von Anweisungen, die in formaler Sprache geschrieben sind. Spezifikationen decken verschiedene Eigenschaften ab und beschreiben, wie sich die Eigenschaften des Vertrages unter anderen Umständen verhalten sollten. Formale Spezifikationen sind von entscheidender Bedeutung, denn wenn Verträge keine unveränderlichen Variablen haben oder sich Eigenschaften während der Ausführung ändern, kann dies zu einer möglichen Ausbeutung von Eigentum führen, was zu einem enormen Verlust führen kann.

Es kann uns helfen festzustellen, ob ein Smart Contract die Spezifikationen erfüllt oder unerwartetes Verhalten aufweist. Formale Verifikation besteht aus drei Komponenten: einer Spezifikation, einem Modell und einer Verifikations-Engine.

3.1.1-Spezifikation

Eine Spezifikation ist eine klare, eindeutige und vollständige Beschreibung der Anforderungen an einen Smart Contract. Es sollte beschreiben, was der Vertrag leisten soll und was nicht. Hier ist eine Beispielspezifikation für einen einfachen, intelligenten Vertrag, der zwei Zahlen hinzufügt:

// Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
// Implementation details are not relevant to the specification
// …
}

3.1.2 Modell

Ein Modell stellt formal den Smart Contract dar, der verwendet werden kann, um über sein Verhalten nachzudenken. Ein beliebtes Modell für Smart Contracts ist die Programmiersprache Solidity. Hier ist ein Beispielmodell für die oben beschriebene Add-Funktion:

// Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
return a + b;
}

3.1.3 Verifizierungs-Engine

Eine Verifikationsmaschine ist ein Werkzeug, das ein Modell analysieren und seine Korrektheit bezüglich einer gegebenen Spezifikation verifizieren kann. Für Smart Contracts stehen mehrere Verifizierungs-Engines zur Verfügung, darunter:

Mithril: Ein symbolisches Open-Source-Ausführungstool, das eine Vielzahl von Sicherheitslücken in Smart Contracts von Solidity erkennen kann.

Remix-IDE: eine integrierte Entwicklungsumgebung, die ein formelles Verifikationstool enthält, das die Korrektheit von Smart Contracts verifizieren kann.

Certora Prüfer: ein kommerzielles Tool, das die Korrektheit von Smart Contracts mithilfe automatisierter mathematischer Argumentation überprüfen kann. Hier ist ein Beispiel dafür, wie die formale Verifizierung verwendet werden kann, um die Korrektheit eines Smart Contracts mit dem Certora Prover zu verifizieren:

pragma solidity 0.7.6; // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint)
function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function test_add(uint a, uint b) public pure returns (bool) {
uint expected = a + b;
uint actual = add(a, b);
return expected == actual;
} // Verification: Verify the correctness of the add function contract TestAdd {
function test_add(uint a, uint b) public view returns (bool) {
return CertoraProver.verify(test_add, a, b);
}
}

Im obigen Beispiel definieren wir einen Solidity Smart Contract, der ein Modell der Add-Funktion, eine Spezifikation für die Funktion und eine Verifizierungs-Engine (Certora Prover) enthält, die die Korrektheit der Funktion verifizieren kann. Wir definieren auch eine Testfunktion (test_add), mit der die Korrektheit der Funktion überprüft werden kann.

3.2 Testen vs. formale Verifizierung

Wie wir besprochen haben, gibt das Testen das erwartete Ergebnis für einige Eingabedatenbots zurück, die ihm fehlen, weil wir nichts über die Daten sagen können, auf denen es nicht getestet wurde. Es ist praktisch unmöglich, es bei jeder möglichen Eingabe zu überprüfen. Daher sind wir uns über die „funktionale Korrektheit“ nicht sicher. Hier kommt die formale Verifizierung ins Spiel. Formale Verifizierungsmethoden verwenden rigorose mathematische Techniken zum Spezifizieren und Verifizieren von Software oder intelligenten Verträgen.

3.3 Techniken zur formalen Verifikation

Die formale Verifikation hat ein breites Spektrum an Techniken zur Verbesserung Smart Contract Sicherheit. In diesem Teil des Blogs werden wir einige einzeln untersuchen.

3.3.1 Modellprüfung

Als wir besprochen haben, was eine formale Spezifikation ist, prüfen wir den Smart Contract anhand seiner Spezifikation in dieser formalen Verifizierungstechnik. Diese intelligenten Verträge werden als Zustandsübergangssysteme dargestellt, und Eigenschaften werden mithilfe der zeitlichen Logik definiert. 

Diese Technik wird hauptsächlich verwendet, um zeitliche Eigenschaften zu bewerten, die das Verhalten von Smart Contracts im Laufe der Zeit darstellen. Zugriffssteuerungseigenschaft (Administrator ruft an Selbstzerstörung) kann als formale Logik niedergeschrieben werden. Dann kann der Modellprüfungsalgorithmus überprüfen, ob der Vertrag diese formale Überprüfung erfüllt.

Die Modellprüfung verwendet eine Technik namens State Space Exploration, bei der im Grunde alle möglichen Zustände ausprobiert werden, in denen sich unser Smart Contract befinden kann, und dann überprüft wird, ob einer davon zu einer Eigentumsverletzung führt. Dies kann jedoch zu unendlich vielen Zuständen führen; Daher verlassen sich Modellprüfer auf Abstraktionstechniken, um eine effiziente Analyse von Smart Contracts zu ermöglichen.

3.3.2 Satzbeweis

Beim Theorembeweisen geht es um mathematische Begründungen zur Korrektheit von Programmen. Es befasst sich damit, einen logischen Eindruck von der Systematik und Spezifikation des Vertrags zu schaffen und die „logische Äquivalenz“ zwischen den Aussagen zu überprüfen. Logische Äquivalenz ist eine mathematische Beziehung, die besagt, dass Aussage A genau dann wahr ist, wenn Aussage B wahr ist.

Wie wir in der Model-Checking-Technik gelernt haben, modellieren wir Verträge als Übergangssysteme mit endlichen Zuständen. Das Beweisen von Sätzen kann die Analyse von Systemen mit unendlichen Zuständen handhaben. Ein automatisierter Theorembeweiser kann jedoch nicht immer wissen, ob ein logisches Problem entscheidbar ist; daher ist häufig menschliche Unterstützung erforderlich, um den Theorembeweiser bei der Ableitung von Korrektheitsbeweisen anzuleiten.

4. Fazit

Sowohl das Testen als auch die formale Verifizierung sind integrale Bestandteile der Entwicklung intelligenter Verträge. Dies sind die Methoden, die verwendet werden, um Smart Contracts sicher zu machen und dabei zu helfen, die Verträge einsatzbereit zu machen. Aber wie Sie wissen, ist Sicherheit nie genug. Viele Smart Contracts wurden gehackt, nur weil es keine angemessenen Tests gab. Jetzt braucht die Web3-Community mehr denn je sicherere Protokolle. 

Wir bei QuillAudits haben es uns zur Aufgabe gemacht, Ihre Protokolle zu schützen. Mit unserem kompetenten und erfahrenen Team stellen wir sicher, dass keine einzige Schwachstelle unbemerkt bleibt. Besuchen Sie unsere Website und sichern Sie sich Ihr Web3-Projekt!

28 Views

Zeitstempel:

Mehr von Quillhash