Utforske smarte kontraktsårbarheter: (Ultimate Guide)

I dag skal vi gå dypere inn i en verden av smarte kontraktsårbarheter, og fokusere på en interessant svakhet som kom frem på grunn av Ethereum-basert auksjonsspill. Dette angrepet skjedde på grunn av feil fordeling av gass. Før vi kommer inn i detaljene i angrepet, la oss se på selve spillet og begrepet gass.

Utforske smarte kontraktsårbarheter: Kongen av eter

Så, “King of the Ether Throne” (KotET) er et spill der deltakerne konkurrerer med hverandre om tittelen “King of the Ether.” Så hvordan fungerer det?

Ved enkel budgivning. Slik fungerer budprosessen i henhold til deres hjemmeside:

  • Anta at den nåværende kravprisen for tronen er 10 eter.
  • Du vil være konge / dronning, så du sender 10 eter til kontrakten.
  • Kontrakten sender din 10 eter (minus 1% provisjon) til forrige konge / dronning, som en “kompensasjonsbetaling”.
  • Kontrakten gjør deg til den nye kongen / dronningen av Ether Throne.
  • Den nye kravprisen for tronen øker med 50% til 15 eter i dette tilfellet.
  • Hvis det kommer en usurper som er villig til å betale 15 eter, avleverer de deg og blir konge / dronning, og du mottar deres betaling på 15 eter som din “kompensasjonsbetaling”.

Enkelt sagt er det en Ponzi-ordningen.

Nå, før vi fortsetter med hvordan dette knytter seg til smarte kontraktsårbarheter, la oss forstå hvordan gass fungerer.

Hva er Ethereum Gas? (Smarte kontraktsårbarheter)

“Gass” er livsnerven i Ethereum-økosystemet, det er ingen annen måte å sette det på. Gass er en enhet som måler mengden beregningsinnsats det vil ta for å utføre visse operasjoner.

Hver eneste operasjon som deltar i Ethereum, det være seg en enkel transaksjon, eller en smart kontrakt, eller til og med en ICO tar litt mengde bensin. Gass er det som brukes til å beregne antall avgifter som må betales til nettverket for å utføre en operasjon.

Alle smarte kontrakter som kjører i EVM er kodet med soliditet (Ethereum planlegger å gå videre til Vyper fra Solidity i fremtiden.) Hver eneste linje med soliditet krever en viss mengde gass for å bli beregnet.

For å bedre forstå hvordan gass fungerer i Ethereum, la oss bruke en analogi. Anta at du skal på biltur. Før du gjør det, går du gjennom disse trinnene:

  • Du går til bensinstasjonen og angir hvor mye bensin du vil fylle opp i bilen din.
  • Du får bensinen fylt opp i bilen din.
  • Du betaler bensinstasjonen mengden penger du skylder dem for bensinen.

La oss nå trekke paralleller med Ethereum.

  • Bilen er operasjonen du vil utføre, som en gass eller en smart kontrakt.
  • Gassen er bra … .gass.
  • Bensinstasjonen er gruvearbeideren din.
  • Pengene du betalte dem er gruvearbeidsavgiftene.

Alle operasjoner som brukerne vil utføre der inne, må gi gass for følgende:

  • For å dekke sine data, altså egen gass.
  • For å dekke hele beregningen.

Hva er gassgrense?

For å få en operasjon utført i Ethereum, må operasjonsgeneratoren (dvs. personen som initierer transaksjonen eller den smarte kontraktsskaperen) spesifisere en gassgrense før de sender den til gruvearbeiderne. Når en gassgrense først er spesifisert, vil gruvearbeiderne begynne å utføre operasjonen.

Når du sender inn en gassgrense, må følgende punkter vurderes:

  • Ulike operasjoner vil ha forskjellige gasskostnader (som vist tidligere).
  • Gruvearbeiderne vil slutte å utføre det øyeblikket gassen går tom.
  • Hvis det er igjen gass, vil den umiddelbart bli refundert til driftsgeneratoren.

La oss se dette i drift i et hypotetisk scenario:

Anta at vi legger til to tall, og for det må kontrakten gjøre følgende:

  • Lagring av 10 i en variabel. La oss si at denne operasjonen koster 45 gass.
  • La oss si at dette koster 10 gass når vi legger til to variabler.
  • Lagring av resultatet som igjen koster 45 gass.

Anta at gassgrensen er 120 wei.

Den totale gassen som brukes av gruvearbeideren er (45 + 10 + 45) 100 wei.

Gebyrene som skyldes dem forutsatt 1 wei koster 0,02 mikro ETH er (100 * 0,02 mikro ETH) = 0,000002 ETH.

Nå, hvor mye gass som er igjen?

120 – 100 = 20 wei.

20 wei blir tilbakebetalt tilbake til driftsgeneratoren.

Så hva gikk galt med KotET?

KotET-kontrakter oppførte seg ganske normalt, bortsett fra i ett scenario. Da KotET-kontrakten sendte en betaling til en “kontrakonto”, tildelte den på en eller annen måte bare en liten mengde bensin … 2300 for å være nøyaktig. Det er tydeligvis ikke nok gass til å dekke utgiftene.

Som KotET uttrykker det,

“Når en lommebokontrakt ikke klarte å behandle betalingen som ble sendt til den av KotET-kontrakten, ble den betalte eteren returnert til KotET-kontrakten. KotET var ikke klar over at betalingen mislyktes, og den fortsatte behandlingen, og gjorde innringeren til konge til tross for at kompensasjonsbetalingen ikke var sendt til forrige monark. ”

La oss prøve å slå ned alt som gikk galt her:

  • Gassgrensen på 2300.
  • Tåke-lommebokontrakten som ikke var tilstrekkelig for at betalingen kunne godtas av lommebokontrakten.
  • KotETs kontraktsutvikler var ikke klar over gassgrensen på 2300 som var inkludert når betalingen ble sendt.

  • KotET-kontraktutvikler var ikke klar over at noen del av transaksjonen kunne mislykkes og tilbakestilles uten at hele kjeden mislyktes og gikk tilbake.
  • Minimal betatesting i den virkelige verden av KotET-kontraktutviklerne.
  • Tilbakefunksjonen i lommebokontraktene som brukes av Ethereum Mist Wallet, krever mer gass enn 2300 tilgjengelig under en .send () -anrop..

Ser på koden (smarte kontraktsårbarheter)

Denne kontrakten er en forenklet fremstilling av spillet:

Utforske smarte kontraktsårbarheter: Kongen av eter

I følge kontrakten, når en deltaker sender eter til kontrakten (msg.value), utløser de også KotETs tilbakefall som standard. KotET-reserven sjekker først om den sendte eteren er nok til å få tittelen.

Hvis ikke, tilbakestilles eteroverføringen. Hvis ja, blir deltakeren valgt som den nye kongen. Når det skjer, blir kompensasjonen sendt til forrige konge, og deltakeren blir kronet. Forskjellen mellom pengene som er sendt av den nye kongen og erstatningen til den gamle kongen holdes av kontrakten. KotET-eieren kan trekke tilbake alle disse etrene som er akkumulert i kontrakten gjennom sweepCommission.

Sårbarheten ligger i sendefunksjonen. Hvis funksjonen er utstyrt med utilstrekkelig gass, vil kongen. Sende (kompensasjon) mislykkes hvis kongens adresse er en kontrakt med en dyr tilbakefall. I dette tilfellet holdes kompensasjonen ganske enkelt av kontrakten i stedet for den forrige kongen.

Konklusjon om smarte kontraktsårbarheter

Vi håper at du lærte av KotETs feil. Det er små feil som disse som kan forårsake stor ødeleggelse hvis de ikke rettes opp i tide. Når det gjelder smart kontraktkoding, er oppmerksomhet på detaljer av største betydning for å unngå sårbarheter med smarte kontrakter.

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