GUSD smart contract maakt diefstal van antispam-betalingen mogelijk

We kijken naar front-running als manier om de antispam-stake van de Gemini dollar te verkrijgen.

De Winklevoss-tweelingbroers zijn vooral bekend als de vermeende grondleggers van Facebook, en ontvingen in 2008 zelfs $ 65 miljoen ter compensatie van Mark Zuckerberg. In 2013 investeerden ze stevig in Bitcoin, en kochten ze zo’n 1% van alle bestaande munten tegen $ 120 per stuk.

Kort daarna openden de broers de Gemini-cryptocurrency exchange, en in 2018 lanceerden ze de stablecoin Gemini dollar (GUSD). Een stablecoin is een cryptocurrency met een vaste prijs: 1 GUSD-token kost altijd 1 Amerikaanse dollar. Stablecoins zijn handig voor het “digitaliseren” van echte dollars. Ze zorgen ervoor dat het verplaatsen van blockchain-dollars tussen exchanges snel en eenvoudig verloopt. De garantiegever van de omgekeerde conversie naar dollars is het bedrijf dat ze aan u uitgaf en verkocht.

Onder de Kaspersky Smart Contract Source Code Review-dienst analyseerden we een smart contract dat GUSD-functionaliteit biedt, en we ontdekten hier een tekortkoming.

Disclaimer

Houd er rekening mee dat dit smart contract al beoordeeld was, al weten we niet of er eventuele gebreken in de code in het rapport werden beschreven.

In overeenstemming met ons Responsible Disclosure-beleid namen we contact op met het beveiligingsteam van Gemini om het probleem te melden. Zij lieten ons weten dat het probleem was opgemerkt tijdens de ontwerpfase, maar dat het geen risico vormde voor GUSD.

Bekijk voor een eenvoudige uitleg van hoe smart contracts werken onze post over smart contracts, Ethereum en ICOs.

Gemini-dollar smart contracts

Normaal gesproken als iemand nieuwe tokens wil creëren op basis van de Ethereum-blockchain, schrijven ze een smart contract (een miniprogramma) dat het volgende specificeert:

  1. Data (“zo veel tokens bevinden zich op dit of dat adres),
  2. Methodes (“gelieve mijn tokens over de maken naar dit of dat adres,” plus een paar andere).

De makers van het Gemini-dollarsysteem implementeerden tevens de volgende verbeteringen:

  1. Ze deelden het contract in drie componenten in: Proxy (de permanente interface waarmee tokenhouders kunnen communiceren en taken kunnen uitvoeren, store (het in kaart brengen van tokenhouders naar hun saldo’s) en Impl (de onderliggende logica);
  2. Het component dat de logica beschrijft kan worden geüpdatet en aangevuld met nieuwe functies zoals de mogelijkheid om middelen te bevriezen. Ondertussen blijven de data en interface onveranderd; de update is voor iedereen zichtbaar;
  3. Voor updates en controle wordt er een apart “Custodian” smart contract gebruikt dat wordt beheerd door meerdere mensen (custodians) voor aanvullende bescherming. Als één custodian een actie voorstelt, moeten de anderen deze bevestigen voor deze doorgang kan krijgen.

De verbeteringen zijn veilig en versterken de algehele beveiliging en flexibiliteit.

Antispam-betalingen

Als iemand anders dan de primaire custodian een voorstel doet in een custodian contract, moeten ze een aandeel van 1 ETH betalen (ongeveer $ 200 tegen de huidige wisselkoers). Zoals opgemerkt in de commentaren van het contract zelf, is het doel van deze antispam-maatregel om deelnemers te ontmoedigen om te veel verzoeken te creëren.

De antispam-betalingen gaan uiteindelijk naar één persoon toe: degene die de goedkeuring aankondigt van het betreffende voorstel/verzoek. Deze implementatie lijkt misschien niet helemaal eerlijk, maar uit de commentaren blijkt dat de makers dat duidelijk zo zagen.

} else {

if (address(this).balance > 0) {

// reward sender with anti-spam payments

// ignore send success (assign to ʹsuccessʹ but this will be overwritten)

success = msg.sender.send(address(this).balance);

Wat ons betreft raden we het gebruik van de Solidity Withdrawal Pattern-aanpak aan.

Front-running-aanvallers kunnen alle antispam-betalingen stelen

De persoon die de goedkeurig van het verzoekt bepaalt, ontvangt dus ook alle ETH-antispam-betalingen. Om dat te doen, roept hij of zij de functie completeUnlock van het smart contract op en voert de signatures van twee custodians in de parameters in.

Het probleem is dat Ethereum net als elke andere blockchain verzoeken met vertraging uitvoert. Een klantentransactie (het overmaken van geld of oproepen van een functie) wordt een tijdje in de wachtrij gezet (gewoonlijk 15 seconden of langer). Tijdens deze tijd kan er werkelijk iedereen de geplande transfers van andere Ethereum-gebruikers zien, inclusief de bedragen, ontvangers en parameters. En een gluurder kan die informatie gebruiken om hun eigen transactie te creëren en die vooraan in de wachtrij te krijgen door een hogere commissie aan de miner te betalen.

Elk voordeel dat wordt verkregen door te gluren wordt beschouwd als front-running, een aanvalsmethode (Bekende aanvallen: Front-Running).

Van investopedia.com:

Front-running is als een handelaar of andere instantie een transactie aangaat omdat ze voorkennis hebben van een grote niet-gepubliceerde transactie die van invloed zal zijn op de prijs, wat waarschijnlijk financieel gewin voor de handelaar tot gevolg heeft. Dit is ook het geval als een handelaar of analist aandelen voor hun account koopt of verkoopt vóórdat hun bedrijf aanbevelingen aan cliënten geeft betreffende het kopen of verkopen van aandelen.

In ons geval kan een complete outsider een robot instellen die het custodian contract in de gaten houdt. Als die ziet dat iemand de completeUnlock-functie op heeft geroepen (een custodian die met een Gemini-dollar interageert), kopieert hij onmiddellijk alle parameters en roept het de functie op om de Ether uit te pakken die daar is opgebouwd.

Om zo’n aanval tegen te gaan, raden we het gebruik van de populaire Solidity Withdrawal Pattern-aanpak aan.

Bovendien raden we aan om onbekenden te blokkeren zodat ze geen functie kunnen oproepen die voor custodians is bedoeld.

Praktische implementatie van een aanval

Hoewel de ontdekte kwetsbaarheid in theorie gevaarlijk is, is hij in de praktijk redelijk onschuldig. Dit is waarom:

  1. Antispam-betalingen doen er niet zo veel toe voor custodians van zo’n grote onderneming als de Gemini-dollar. Het GUSD-totaalvermogen (het totale volume aan uitgegeven tokens) kwam op een gegeven moment boven de $ 100 miljoen uit. Zelfs nu overstijgt het nog de $ 5 miljoen.
  2. Er zijn nog geen antispam-betalingen verschenen in dit contract en dat gebeurt misschien ook wel nooit, omdat de primaire custodian op geen enkele wijze verplicht is om deze te storten (alle anderen wel).
  3. Nu gebruikers kennis hebben genomen van deze kwetsbaarheid, kunnen ze de kwetsbare functie simpelweg vermijden of het contract updaten.
  4. Tijdens de beoordelingen vonden we geen kwetsbaarheden die een bedreiging vormen voor GUSD-tokens.

 

Gemini reageert: “We hebben voor dit ontwerp gekozen omdat Gemini niet van plan is om onder normale omstandigheden ether te staken, en daarom hebben we een op risico’s gebaseerde beslissing genomen om de complexiteit van onze codebase niet materieel uit te breiden om zo te kunnen profiteren van een robuuster herstelmechanisme voor een theoretische en nominale antispam-stake. Prioriteit geven aan veilige, eenvoudige code blijft de beste oplossing voor de Gemini-dollar en de gebruikers ervan. In de toekomst kunnen we op deze beslissing terugkomen als het risico verandert en een duurder en complexer contract geschikter wordt.”

We besloten om deze post te publiceren in samenwerking met Gemini, aangezien antispam-stakes alleen een risico vormen in het geval van een combinatie van specifieke en onwaarschijnlijke omstandigheden, en GUSD loopt geen risico.

We willen nogmaals iedereen eraan herinneren dat er altijd sprake moet zijn van een holistische veiligheidsaanpak wat betreft ICOs en andere activiteiten die gerelateerd zijn aan cryptocurrencies en blockchains.

Tips