Dieser Blog -Beitrag enthält ein Update zu unseren Erkenntnissen nach der Entdeckung des Speicherkorruptionsfehlers in der vergangenen Woche. Zusammenfassend war der Fehler viel weniger schwerwiegend als wir anfangs dachten. Die geringe Anzahl betroffener Verträge, die wir gefunden haben, ist entweder vom Eigentümer nur ausgenutzt, oder der Exploit kann nur zu einer Störung der Benutzeroberfläche und nicht in der tatsächlichen Vertragslogik führen. Alle von uns geprüften Vertragsverträge/DAPPs können festgelegt werden, ohne den Vertrag selbst aufrüsten zu müssen. Natürlich überprüfen Sie noch Ihre Verträge, um sicher zu sein.
Nach der Entdeckung des Speicherkorruptionsfehlers im Soliditätskompiler und der Erkenntnis, dass er schwerwiegende Auswirkungen auf bereits abgestoßene Verträge hat, die nicht aktualisiert werden können, haben wir analysiert, wie häufig der Fehler ist und wie ausnutzbare Verträge behandelt werden können.
Wir haben uns auf Verträge mit Quellcode konzentriert, die in Ethercan veröffentlicht wurden, da wichtige oder beliebte intelligente Verträge in der Regel ihren Quellcode dort veröffentlicht werden, um Vertrauen von ihren Benutzern zu gewinnen, die dann die Kompilierung überprüfen können. Wenn der Quellcode nicht verfügbar ist, ist es für einen Angreifer auch viel schwieriger, einen geeigneten Exploit zu finden. Schließlich prüfen Verträge, die privat verwendet werden (und daher nicht die Veröffentlichung ihres Quellcodes erfordern), dass sie in der Regel aus einer bestimmten Adresse aufgerufen werden, und daher hat ein Angreifer keine Möglichkeit, in ihren Speicher zu schreiben.
Um den Prozess der Überprüfung aller Verträge auf Ethercan zu automatisieren, haben wir eine modifizierte Version des Solidity Compiler erstellt, mit dem automatisch die Bedingungen für das Auslösen des Fehlers erfasst werden können. Diese Technik hat bereits die Anzahl der potenziell gefährdeten Verträge auf 167 reduziert. Wir haben diese Verträge dann manuell auf eine mögliche Korruption des Speichers überprüft, die sie anfällig für Angriffe machen würden.
Es stellte sich heraus, dass nur zehn Verträge anfällig waren, sodass wir uns mit den meisten Vertragsinhabern/Entwicklern wenden konnten. Sieben von zehn dieser Verträge können vom Eigentümer nur ausbeuchten, da sie bestimmte Parameter außerhalb seines zulässigen Bereichs ändern oder einen zuvor verschlossenen Vertrag entsperren haben. Ein Vertrag ist von nicht privilegierten Benutzern ausbrochen, hat jedoch andere wichtige Mängel in seinem Design. Die beiden anderen Verträge, die von nicht privilegierten Benutzern ausfindig gemacht wurden, lieferten entweder keine Vorteile, wenn sie ausgenutzt sind oder nur die Benutzeroberfläche beeinflussten.
Warum sind nur so wenige Verträge ausbrochen?
Lassen Sie uns zunächst definieren, was wir unter “Ausnutzung” meinen:
Der Korruptionsfehler ist ausbindbar, wenn er verwendet werden kann, um eine Variable im Speicher auf eine Weise zu ändern, die ohne den Fehler nicht möglich wäre, und diese Änderung hat Konsequenzen für das Verhalten und die Verwendung des intelligenten Vertrags. Zum Beispiel betrachten wir einen Vertrag in den folgenden Situationen nicht aus.
- Das gleiche Konto könnte die Variable im selben Vertragszustand auf regelmäßige Weise überschreiben.
- Überschreiben kann nur zur Bauzeit stattfinden (beachten Sie, dass wir nicht überprüft haben, ob zu diesem Zeitpunkt ein Überschreiben stattgefunden hat).
- Das Überschreiben wird nur in unwahrscheinlichen Situationen ausgelöst, in denen die Vertragslogik ohnehin gebrochen wurde (z. B. ein 32-Bit-Zähler, der einmal pro Block inkrementiert ist, Ovelflows).
- Variablen können überschrieben werden, die im intelligenten Vertrag nicht genutzt werden und nicht kritisch aussehen, aber Teil der öffentlichen Schnittstelle sein können.
Warum ist dieser kritische Fehler in so wenigen Fällen nur ausblosierbar?
Es handelt sich um eine Kombination der folgenden Faktoren, die die Wahrscheinlichkeit der Ausbeugung miteinander vervielfachen und dramatisch verringern.
- Da kleine Typen in sehr seltenen Fällen nur einen Vorteil bieten, werden sie selten verwendet.
- Kleine Typen müssen im Speicher nebeneinander liegen – ein einzelner großer Typ dazwischen verhindert, dass der Fehler ausgelöst wird.
- Zustandsvariablen werden nacheinander häufig zugeordnet, wodurch die Korruption bei der zweiten Zuordnung entfernt wird.
- Die Kombination von “Adresse” und “Bool” ist in den noch übrigen Fällen am häufigsten, aber hier ist die Adressvariable häufig ein “Eigentümer”, aus dem zugewiesen wird msg.sender und damit nicht ausgenutzt. Auch wenn der Besitzer geändert werden kann, ist das Flag häufig eine Flagge, die vom Besitzer auf anderen Mitteln weiterhin festgelegt werden kann.
Wie man betroffene Verträge behebt
Eine große Mehrheit der ausblockabbaren Verträge kann nur vom Vertragsinhaber, Administrator oder Entwickler ausblosierbar sind, insbesondere obwohl eine einzige Funktion, die es dem Eigentümer ermöglicht, sich zu ändern. Der Exploit ermöglicht dem Eigentümer eine weitere Eskalation von Privilegien. Um zu verhindern, dass der Eigentümer diesen Exploit ausnutzt, kann zwischen dem Eigentümer und dem betroffenen Vertrag ein Proxyvertrag installiert werden. Dieser Proxy -Vertrag leitet die Anrufe vom Eigentümer weiter, aber es macht nicht auf, die Ausbeutungsfunktionen aufzurufen. Wenn es noch erforderlich ist, die Ausbeutungsfunktionen zu rufen, kann der Proxy -Vertrag verhindern, dass bösartige Daten an den Vertrag weitergeleitet werden.
Wenn Sie bestimmte Fragen oder Bedenken hinsichtlich Ihrer Verträge haben, kontaktieren Sie uns bitte gitter.
Eine freundliche wichtige Note von Legal
Die Aussagen in diesem Beitrag sind Empfehlungen zur Bekämpfung des Speicherversorgerfehlers im Soliditäts Compiler. Wie Sie wissen, arbeiten wir in einem aufstrebenden und sich entwickelnden technischen Raum. Die gleichen Elemente, die diese Arbeit aufregend machen – die Innovation, die Auswirkungen, das wachsende Verständnis der Funktionsweise von Verträgen – sind die gleichen, die es riskant machen. Wenn Sie die Empfehlungen in diesem Beitrag implementieren und weiterhin teilnehmen, sollten Sie sicherstellen, dass Sie verstehen, wie sich dies auf Ihren spezifischen Vertrag auswirkt, und Sie sollten verstehen, dass Risiken eingehen. Indem Sie diese Empfehlungen implementieren, nehmen Sie allein die Risiken der Konsequenzen ein.

