Arithmetische Über- und Unterläufe in der virtuellen Maschine von Ethereum

Free Bitcoins: FreeBitcoin | BonusBitcoin

Coins Kaufen: Bitcoin.deAnycoinDirektCoinbaseCoinMama (mit Kreditkarte)Paxfull

Handelsplätze / Börsen: Bitcoin.de | KuCoinBinanceBitMexBitpandaeToro

Lending / Zinsen erhalten: Celsius NetworkCoinlend (Bot)

Cloud Mining: HashflareGenesis MiningIQ Mining


Ethereum Virtual Machine (EVM) definiert eine konstante Größe für alle Datentypen und damit für die Ganzzahlen. Daher wird eine Variable zum Speichern einer Ganzzahl verwendet. Es gibt einen bestimmten Zahlenbereich, den diese Variable annehmen kann. Zum Beispiel a uint8 Variable, kann Zahlen zwischen speichern 0 und 255.

Überlauf

Arithmetischer Überlauf ist eine Bedingung, die auftritt, wenn eine Operation ein Ergebnis erzeugt, das größer ist, als ein bestimmtes Register oder ein Speicherort speichern oder darstellen kann.

Bedenken Sie, wir haben eine uint8 Variable aufgerufen Summe. Diese Variable kann Werte von 0 bis 255 annehmen, wie der Umfang einer uin8-Variablen ist [0, 255]. Die Variable Summe ist die Summe der Variablen ein (wo a = 0) und b (wo b = 257).

Wenn wir hinzufügen ein und b wir bekommen sum = a + b => sum = 0 + 257 => sum = 257. Beachten Sie an diesem Punkt, dass die Summe = 257 ∉ ist[0, 255]. Um diesen Wert in der zu speichern Summe Variable müssen wir umwickeln die Nummer 257 und konvertieren Sie es in eine Nummer, die innerhalb des Bereichs existiert [0, 255]. Für diesen Prozess verwenden wir die folgende Formel:

(Anzahl der hinzuzufügenden Elemente – Maximum) + Minimum – 1

Mit dieser Formel haben wir sum = (257–255) + 0–1 => sum = 1 ∈ [0, 255]. Also, nach 257 umwickelt, konvertiert in 1, die in den Geltungsbereich von gehört [0, 255]. Jetzt kann der Wert 1 normalerweise in gespeichert werden Summe Variable.

Diese Bedingung wird aufgerufen Überlauf. Wenn ein Überlauf auftritt, verwendet das EVM die umwickeln Prozess, damit der Wert in der Variablen gespeichert werden kann.

Unterlauf

Wir können jetzt den gleichen Prozess ausführen, wenn ein Unterlauf auftritt. Überlegen Sie noch einmal, wir haben eine uint8 Variable aufgerufen sub. Diese Variable kann Werte von 0 bis 255 annehmen. Die Variable sub ist die Subtraktion der Variablen ein (wo a = 0) minus b (wo b = 1).

Wenn wir jetzt subtrahieren ein von b wir bekommen sub = a – b => sum = 0–1 => sub = -1. Beachten Sie an dieser Stelle, dass sub = -1 ∉ [0, 255]. Um diesen Wert in der zu speichern sub Variable müssen wir umwickeln wieder die Zahl -1. Für diesen Prozess verwenden wir die folgende Formel:

Maximum + (Minimum – Anzahl ToBeSubtracted) + 1

Mit dieser Formel haben wir sub = 255 + (0–1) +1 => sub = 255 ∈ [0, 255]. Also, nachdem -1 umwickelt wurde, konvertierte es in 255, was in den Geltungsbereich von gehört [0, 255]. Jetzt kann der Wert 255 normalerweise in gespeichert werden Summe Variable.

Die folgende Tabelle zeigt, wie uint8 Werte werden nach dem Wrap-Around-Prozess konvertiert.

uint8 Wrap-Around-Prozess

Die Sicherheitslücke

Diese Sicherheitsanfälligkeit kann auftreten, wenn eine mathematische Gleichung eine Variable mit fester Größe verwendet, um einen Wert zu speichern, der außerhalb ihres Bereichs liegt. Zeichen Vertrag verwendet die Transfer Funktion zum Überprüfen, ob der Benutzer über das erforderliche Guthaben verfügt, um den gewünschten Betrag an eine Adresse zu überweisen.

Token-Vertrag

Bedenken Sie, dass der Benutzer ein Gleichgewicht von Null hat und bereit ist, 100 Äther zu übertragen. Wann Zeile 11 Innerhalb Transfer Funktion ausgeführt wird Folgendes passieren.

Guthaben[msg.sender]-Wert = 0–100 = -100

Beachten Sie, dass wir eine haben uint8 variabel so -100 ∉[0, 255]. Also haben wir eine Unterlauf. Wie bereits erwähnt, wird der Wrap-Around-Prozess ausgeführt, sodass der Wert -100 in 156 konvertiert wird. Jetzt 156 ∈ [0, 255] und das Folgende wird passieren.

Guthaben[msg.sender]-Wert = 156 = -100 ≥ 0 = Wahr

Was der böswillige Benutzer hier getan hat, ist, dass 100 Äther erfolgreich von einem übertragen wurden keine Balance Konto.

Vorbeugende Technik

Um diese Art von Angriff zu vermeiden, können wir in unseren mathematischen Codebibliotheken verwenden. Diese Bibliotheken ersetzen jeden Operator durch feste Funktionen.

Eine der beliebtesten Bibliotheken aus diesem Grund ist die Sichere Mathematikbibliothek von Zeppelin öffnen. Diese Bibliothek ersetzt alle mathematischen Operatoren durch Funktionen. Wenn ein Unter- oder Überlauf auftritt, gibt die Funktion einen Fehler aus und das Programm wird ohne Verwirrung beendet.

Safe Math Library Vertrag

Wenn wir nun die Safe Math Library verwenden, lautet der Code Token Contract wie folgt.

Token-Vertrag mit Safe Math Library

Wann Zeile 11 ausgeführt und ein Unterlauf aufgetreten ist, wird die Funktion einen Fehler auslösen und das Programm wird beendet.

Free Bitcoins: FreeBitcoin | BonusBitcoin

Coins Kaufen: Bitcoin.deAnycoinDirektCoinbaseCoinMama (mit Kreditkarte)Paxfull

Handelsplätze / Börsen: Bitcoin.de | KuCoinBinanceBitMexBitpandaeToro

Lending / Zinsen erhalten: Celsius NetworkCoinlend (Bot)

Cloud Mining: HashflareGenesis MiningIQ Mining

By continuing to use the site, you agree to the use of cookies. more information

The cookie settings on this website are set to "allow cookies" to give you the best browsing experience possible. If you continue to use this website without changing your cookie settings or you click "Accept" below then you are consenting to this.

Close