Forståelse af overløb og understrømsangreb på smarte kontrakter

Overflow og Underflow Attacks på Smart Contracts guide.

Overvej følgende diagram:

Forståelse af overløb og understrømsangreb på smarte kontrakter

Det er et normalt kilometertæller, der beregner afstanden på din bil. Denne kilometertæller går fra 000000 – 999999. Dette er grunden til det øjeblik du krydser over til 1.000.000 km, vil din kilometertæller vende tilbage til 000000.

Dette kan have nogle alvorligt alvorlige konsekvenser.

Forståelse af overløb og understrømsangreb på smarte kontrakter

Tænk på årtusindskiftet og Y2K-problemet. Y2K var en klasse af computerbugs, der truede med at forårsage kaos under årtusindskiftet. For at holde det så simpelt som muligt repræsenterede mange programmer firecifrede år med kun de sidste to cifre. Så 1998 blev lagret som 98 og 1999 som 99. Dette ville dog være problematisk, når året ændres til 2000, da systemet vil gemme det som 00 og vende tilbage til 1900.

Begge eksemplerne, som vi har givet dig ovenfor, er en klasse af fejl kaldet “heltal overløb.” I denne vejledning skal vi undersøge de skadelige virkninger af overløb og underflowangreb på smarte kontrakter.

#Crypto ExchangeBenefits

1

Binance
Best exchange


VISIT SITE
  • ? The worlds biggest bitcoin exchange and altcoin crypto exchange in the world by volume.
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

2

Coinbase
Ideal for newbies


Visit SITE
  • Coinbase is the largest U.S.-based cryptocurrency exchange, trading more than 30 cryptocurrencies.
  • Very high liquidity
  • Extremely simple user interface

3

eToro
Crypto + Trading

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

Overflowfejl

Et overløb opstår, når et tal forøges over dets maksimale værdi. Antag, at vi erklærer en uint8-variabel, som er en usigneret variabel og kan tage op til 8 bits. Dette betyder, at det kan have decimaltal mellem 0 og 2 ^ 8-1 = 255.

Husk dette, og overvej følgende eksempel.

uint a = 255;

a ++;

#CRYPTO BROKERSBenefits

1

eToro
Best Crypto Broker

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

2

Binance
Cryptocurrency Trading


VISIT SITE
  • ? Your new Favorite App for Cryptocurrency Trading. Buy, sell and trade cryptocurrency on the go
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

#BITCOIN CASINOBenefits

1

Bitstarz
Best Crypto Casino

VISIT SITE
  • 2 BTC + 180 free spins First deposit bonus is 152% up to 2 BTC
  • Accepts both fiat currencies and cryptocurrencies

2

Bitcoincasino.io
Fast money transfers


VISIT SITE
  • Six supported cryptocurrencies.
  • 100% up to 0.1 BTC for the first
  • 50% up to 0.1 BTC for the second

Dette vil føre til et overløb, fordi a’s maksimale værdi er 255.

Soliditet kan håndtere op til 256-bit numre. Forøgelse med 1 ville til en overløbssituation:

Dette vil føre til et overløb, fordi a’s maksimale værdi er 255.

Soliditet kan håndtere op til 256 bit numre. Forøgelse med 1 ville til en overløbssituation:

0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

+ 0x000000000000000000000000000000000001

——————————————-

= 0x000000000000000000000000000000000000

Lad os kontrollere overløbsfejlen med en simpel tokenoverførselskontrakt (kode taget fra GitHub):

kortlægning (adresse => uint256) offentlig balanceOf;

// USIKKER

funktionsoverførsel (adresse _to, uint256 _value) {

/ * Kontroller, om afsenderen har balance * /

kræve (balanceOf [msg.sender] >= _værdi);

/ * Tilføj og træk nye saldi * /

balanceOf [msg.sender] – = _værdi;

balanceOf [_to] + = _værdi;

}

// SIKKER

funktionsoverførsel (adresse _to, uint256 _value) {

/ * Kontroller, om afsenderen har balance og overløb * /

kræve (balanceOf [msg.sender] >= _værdi && balanceOf [_to] + _value >= balanceOf [_to]);

/ * Tilføj og træk nye saldi * /

balanceOf [msg.sender] – = _værdi;

balanceOf [_to] + = _værdi;

}

Så hvad har vi her?

Der er to “transfer” -funktioner, der bruges i ovenstående program. Den ene kontrollerer for et overløb, mens den anden ikke kontrollerer for det. Den sikre overførselsfunktion kontrollerer, om saldoen når den maksimale værdi.

Nu skal du huske en ting. Denne funktion er muligvis ikke relevant hele tiden, især i ovenstående scenarie. Som udvikler skal man tænke, om værdien nogensinde vil nå et så højt niveau, eller bruger de bare unødvendigt gas.

Underflowfejl

Nu når vi den anden ende af spektret, Underflow-fejlen. Dette fungerer i den nøjagtige modsatte retning. Husk hvordan uint8 kun kan tage værdier mellem 0 og 255? Overvej følgende kode.

unint8 a = 0;

en-;

Vi har lige forårsaget en understrømning, som får en til at have den maksimalt mulige værdi, der er 255.

Anvendelse af den samme logik i smarte kontrakter om soliditet:

0x000000000000000000000000000000000000

– 0x000000000000000000000000000000000001

——————————————-

= 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

Som du kan se, kan det føre til alvorlig fremvisning af data.

Lad os tjekke et stykke kode og se, hvordan enkel understrømning kan forårsage kaos i en smart kontrakt (kode taget fra GitHub):

kortlægning (adresse => uint256) offentlig balanceOf;

// USIKKER

funktionsoverførsel (adresse _to, uint256 _value) {

/ * Kontroller, om afsenderen har balance * /

kræve (balanceOf [msg.sender] >= _værdi);

/ * Tilføj og træk nye saldi * /

balanceOf [msg.sender] – = _værdi;

balanceOf [_to] + = _værdi;

}

// SIKKER

funktionsoverførsel (adresse _to, uint256 _value) {

/ * Kontroller, om afsenderen har balance og overløb * /

kræve (balanceOf [msg.sender] >= _værdi && balanceOf [_to] + _value >= balanceOf [_to]);

/ * Tilføj og træk nye saldi * /

balanceOf [msg.sender] – = _værdi;

balanceOf [_to] + = _værdi;

}

I kodeeksemplet, der er givet ovenfor, kan en hacker drage fordel af manipulateMe, fordi de dynamiske arrays er lagret sekventielt. Alt, hvad en hacker skal gøre, er:

Ring til popBonusCode for at understrømme

Beregn lagerplaceringen for manipulateMe

Rediger og opdater manipulateMe’s værdi ved hjælp af modifyBonusCode

Det er åbenlyst nemt at påpege alle fejlene i isolerede funktioner, men forestil dig dog en lang og kompliceret smart kontrakt med tusindvis af kodelinjer. Det kan være meget let at miste styr på en sådan fejl under kodekontrol.

Farer ved overløb og understrømsangreb

Underflowfejlen er mere sandsynlig end tilfældet med overløbsfejlen, fordi det vil være noget umuligt for nogen at få det krævede antal tokens for at forårsage et overløb.

Forestil dig en situation, hvor en tokenholder kun har X-tokens. Antag, at han prøver at bruge X + 1-tokens. Hvis programmet ikke engang kontrollerer for det, er der en chance for, at en angriber ender med flere tokens end hvad de faktisk har, og får en maksimal balance.

Overvej følgende eksempel (taget fra nethemba):

pragmasoliditet ^ 0.4.22;

kontrakttegnet {

kortlægning (adresse => uint) vægte;

funktionsoverførsel (adresse _to, uint _value) offentlig {

kræve (saldi [msg.sender] – _value >= 0);

saldi [msg.sender] – = _værdi;

saldi [_to] + = _værdi;

}

}

I koden angivet ovenfor kan kravet i “overførsel” -funktionen se korrekt ud ved første øjekast, men kun indtil du er klar over, at operationer mellem to enheder producerer enhedsværdi.

Hvad dette i sidste ende betyder er, at værdien af saldi [msg.sender] – _værdi >= 0 vil altid være sandt uanset tilstanden.

På grund af denne tilstand kan en hacker faktisk eje flere midler end hvad de faktisk ejer og maksimere deres saldo. For eksempel. hvis hacker ejer 100 tokens og forsøger at eje 101 tokens, ender de med 100-101 tokens, hvilket giver ham 2 ^ 256-1 tokens som et resultat af underflow!

Dette kan simpelthen bryde hele systemet.

Problemer i den virkelige verden forårsaget af understrømsangreb

4chan’s / biz / grupperet sammen skabte “Proof of Weak Hands Coin” eller POWH. Det var en legitim Ponzi-ordning, men folk købte stadig ind i det, og det voksede til over en million dollars.

Det viser sig imidlertid, at udviklerne af POWH-mønt ikke sikrede alle operationer og ikke var i stand til at sætte det korrekte forsvar mod overløb og underflowangreb. På grund af netop denne grund var en ukendt hacker i stand til at hæve 2000 ETH væk, som var værd $ 2,3 millioner.

Som du kan se, er det vigtigt for en udvikler at styrke deres forsvar mod overløb og understrømningsangreb. Som en dusørjæger skal du være på udkig efter angreb på overløb / underløb.

Mike Owergreen Administrator
Sorry! The Author has not filled his profile.
follow me