Zusammenfassung: In einigen Situationen können Variablen andere Variablen im Speicher überschreiben.
Betroffene Solidität Compiler -Versionen: 0,1,6 bis 0,4,3 (einschließlich 0,4,4 Vorabversionversionen)
Detaillierte Beschreibung:
Speichervariablen, die kleiner als 256 Bit sind, werden in den gleichen 256 -Bit -Steckplatz zusammengepackt, wenn sie passen können. Wenn ein Wert größer als der Typ, der vom Typ zulässig ist, der ersten Variablen zugeordnet ist, überschreibt dieser Wert die zweite Variable.
Dies bedeutet, wenn ein Angreifer einen Überlauf im Wert der ersten Variablen verursachen kann, kann die zweite Variable geändert werden. Das Erstellen eines Überflusses in der ersten Variablen ist mit Arithmik oder direktem Wert aus den Anrufdaten möglich (Werte in den Anrufdaten werden auf 32 Bytes abgestimmt, und die Polsterung wird weder verifiziert noch durchgesetzt).
Verträge, die nur die unten für Zustandsvariablen aufgeführten Typen verwenden, sind nicht betroffen. Arrays, Zuordnungen und Strukturen (basierend auf den folgenden Typen) sind ebenfalls nicht betroffen:
- Signierte ganze Zahlen, einschließlich Größen kleiner als 256 Bit
- Bytesnn -Typen, einschließlich Größen kleiner als 256 Bit
- nicht signierte Ganzzahlen (Uint) von 256 Bit
Verträge mit Typen kleiner als 256 Bit, die sich nie nebeneinander befinden (beachten Sie, dass Zustandsvariablen von Basisverträgen “gezogen” werden) sind nicht betroffen.
Der Ethereum -Multisignature -Brieftaschenvertrag ist nicht betroffen. Beachten Sie, dass Adressen 160 Bit aufnehmen, daher sind Verträge, die nur Adressen und 256-Bit-Typen verwenden, sicher. Darüber hinaus werden Adressen und Boolescheer in der Praxis fast nie durch arithmetische Operationen manipuliert, sodass Verträge nur mit Adressen, Booleschen und 256 -Bit -Typen sicher sein sollten.
Die folgenden Verträge können betroffen sein: Verträge mit zwei oder zusammenhängenden Zustandsvariablen, bei denen die Summe ihrer Größen weniger als 256 Bit beträgt und die erste Zustandsvariable keine signierte Ganzzahl und nicht vom Typ Bytesnn ist.
Typen kleiner als 256 Bit umfassen: Bool, Enums, Uint8, …, uint248, int8, …, int248, Adresse, jeder Vertragstyp
Empfohlene Aktion:
- Neukompilienverträge, die noch nicht unter Verwendung mindestens Soliditätsfreisetzung 0.4.4 (nicht mit der Vorab- oder Nachtversion) eingesetzt wurden.
- Deaktivieren, Mittel aus oder aktualisieren bereits bereitgestellte Verträge.
Diese Verwundbarkeit wurde von gefunden von [github.com/catageek](https://github.com/catekek): [https://github.com/ethereum/solidity/issues/1306](https://github.com/ethereum/Solidity/issues/1306)

