Solidity Storage Array -Fehlerankündigung
In diesem Blog -Beitrag handelt es sich um zwei Fehler, die mit Speicherarrays verbunden sind, die ansonsten nichts miteinander zu tun haben. Beide sind seit langem im Compiler vorhanden und wurden erst jetzt entdeckt, obwohl ein Vertrag, der sie enthält, sehr wahrscheinlich Fehlfunktionen in Tests aufweisen sollte.
Daenam Kim mit Hilfe von Nguyen Phambeide von Kurvegrid entdeckte ein Problem, bei dem ungültige Daten im Zusammenhang mit Arrays von signierten Ganzzahlen gespeichert werden.
Dieser Fehler ist seit Solidity 0.4.7 vorhanden und wir betrachten ihn umso schwerwiegender der beiden. Wenn diese Arrays in einer bestimmten Situation negative Ganzzahlen verwenden, verursacht sie Datenbeschädigungen und daher sollte der Fehler leicht zu erkennen sein.
Im Rahmen des Ethereum Bug Bounty -Programms erhielten wir einen Bericht über einen Fehler innerhalb des neuen experimentellen ABI -Encoders (als Abiencoderv2 bezeichnet). Der neue ABI -Encoder ist immer noch als experimentell markiert, aber wir denken jedoch, dass dies eine herausragende Ankündigung verdient, da er bereits auf dem Mainnet verwendet wird. Credits an Ming Chuan Lin (von https://www.secondstate.io) für die Entdeckung und das Beheben des Fehlers!
Der 0.5.10 Freisetzung Enthält die Korrekturen an den Fehler. Im Moment planen wir nicht, eine Fix für die Legacy 0.4.x -Serie der Solidität zu veröffentlichen, aber wir könnten, wenn es eine populäre Nachfrage gibt.
Beide Fehler sollten in Tests, die die entsprechenden Codepfade berühren, leicht sichtbar sein.
Details zu den beiden Fehler finden Sie unten.
Signierter Ganzzahlarray -Fehler
Wer sollte besorgt sein
Wenn Sie Verträge bereitgestellt haben, die signierte Integer -Arrays im Speicher verwenden und entweder direkt zuweisen
- ein wörtliches Array mit mindestens einem negativen Wert darin (x = [-1, -2, -3];) oder
- eine vorhandene Reihe von a anders Signierter Ganzzahltyp
Dies führt zu einer Datenbeschädigung im Speicherarray.
Verträge, die nur einzelne Arrayelemente zuweisen (dh mit X[2] = -1;) sind nicht betroffen.
So überprüfen Sie, ob Vertrag anfällig ist
Wenn Sie im Speicher signierte Integer -Arrays verwenden, versuchen Sie, Tests auszuführen, bei denen Sie negative Werte verwenden. Der Effekt sollte sein, dass der gespeicherte tatsächliche Wert positiv anstatt negativ ist.
Wenn Sie einen Vertrag haben, der diesen Bedingungen entspricht und überprüfen möchten, ob der Vertrag tatsächlich anfällig ist, können Sie uns über uns wenden Security@ethereum.org.
Technische Details
Speicherarrays können aus Arrays unterschiedlicher Art zugewiesen werden. Während dieser Kopie- und Zuordnungsoperation wird bei jedem der Elemente eine Typumwandlung durchgeführt. Zusätzlich zur Konvertierung, insbesondere wenn der signierte Ganzzahltyp kürzer als 256 Bit ist, müssen bestimmte Wertbits zur Vorbereitung auf das Speichern mehrerer Werte im selben Speicherplatz aufgenommen werden.
Welche Bits auf Null aus der Quelle und nicht aus dem Zieltyp ermittelt wurden. Dies führt dazu, dass zu viele Teile gerichtet werden. Insbesondere ist das Vorzeichenbit Null, was den Wert positiv macht.
ABiencoderv2 Array -Fehler
Wer sollte besorgt sein
Wenn Sie Verträge eingesetzt haben, die den experimentellen ABI -Encoder V2 verwenden, sind diese möglicherweise betroffen. Dies bedeutet, dass nur Verträge betroffen sein können, die die folgende Richtlinie im Quellcode verwenden:
pragma experimental ABIEncoderV2;
Darüber hinaus gibt es eine Reihe von Anforderungen für den Auslösen des Fehlers. Weitere Informationen finden Sie weiter unten.
So überprüfen Sie, ob Vertrag anfällig ist
Der Fehler manifestiert sich nur, wenn alle folgenden Bedingungen erfüllt sind:
- Speicherdaten mit Arrays oder Strukturen werden direkt an einen externen Funktionsaufruf gesendet ABI.CODE oder zu Ereignisdaten ohne vorherige Zuordnung zu einer lokalen (Speicher-) Variablen und
- Diese Daten enthält entweder ein Array von Strukturen oder ein Array von statisch großen Arrays (dh mindestens zweidimensional).
Darüber hinaus ist Ihr Code in der folgenden Situation nicht beeinflusst:
- Wenn Sie solche Daten nur zurückgeben und sie nicht verwenden ABI.CODEexterne Anrufe oder Ereignisdaten.
Mögliche Konsequenzen
Natürlich kann jeder Fehler in Abhängigkeit vom Programmkontrollfluss stark unterschiedliche Konsequenzen haben. Wir gehen jedoch davon aus, dass dies eher zu Fehlfunktionen als zu Ausbeulichkeit führt.
Der Fehler sendet unter bestimmten Umständen unter bestimmten Umständen korrupte Parameter für Methodenaufrufe an andere Verträge.
Technische Details
Während des Codierungsprozesses führt der experimentelle ABI -Encoder in einem Array nicht ordnungsgemäß zum nächsten Element, falls die Elemente mehr als einen einzelnen Slot in der Lagerung einnehmen.
Dies ist nur bei Elementen der Fall, die Strukturen oder statisch große Arrays sind. Arrays dynamisch großer Arrays oder elementarer Datentypen sind nicht betroffen.
Der spezifische Effekt, den Sie sehen, ist, dass die Daten im codierten Array “verschoben” werden: Wenn Sie ein Array von Typ haben uint[2][] und es enthält die Daten
[[1, 2]Anwesend [3, 4]Anwesend [5, 6]]dann wird es als codiert als [[1, 2]Anwesend [2, 3]Anwesend [3, 4]] Weil der Encoder nur durch einen einzelnen Steckplatz zwischen Elementen statt zwei vorangetrieben wird.
Dieser Beitrag wurde gemeinsam von @axic, @chriseth, @holiman komponiert

