Explorarea vulnerabilităților contractului inteligent: (Ghid final)

Astăzi vom merge mai adânc în lumea vulnerabilităților contractelor inteligente, concentrându-ne pe o slăbiciune interesantă care a luat importanță datorită jocului de licitație bazat pe Ethereum. Acest atac a avut loc din cauza alocării greșite a gazului. Înainte de a intra în detaliile atacului, să analizăm jocul în sine și conceptul de gaz.

Explorarea vulnerabilităților contractului inteligent: regele eterului

Deci, „Regele tronului eteric” (KotET) este un joc în care participanții concurează între ei pentru titlul de „Regele eterului”. Deci, cum funcționează asta?

Prin simpla licitare. Iată cum funcționează procesul de licitare site-ul lor web:

  • Să presupunem că prețul actual al revendicării pentru tron ​​este de 10 eteri.
  • Vrei să fii Rege / Regină, așa că trimiteți 10 eteri la contract.
  • Contractul trimite 10 eteri (mai puțin un comision de 1%) regelui / reginei anterioare, ca „plată de compensare”.
  • Contractul te face să fii noul rege / regină al tronului eteric.
  • Noul preț al revendicării pentru tron ​​crește cu 50%, până la 15 eteri în acest caz.
  • Dacă vine un uzurpator care este dispus să plătească 15 eter, acesta te depune și devine rege / regină, iar tu primești plata lor de 15 eter ca „plată de compensare”.

În termeni simpli, este un Schema Ponzi.

Acum, înainte de a continua cu ce legătură există acest lucru cu vulnerabilitățile contractului inteligent, să înțelegem cum funcționează gazul.

Ce este Ethereum Gas? (Vulnerabilități ale contractelor inteligente)

„Gazul” este esența vieții ecosistemului Ethereum, nu există o altă modalitate de a pune asta. Gazul este o unitate care măsoară cantitatea de efort de calcul pe care o va lua pentru a executa anumite operațiuni.

Fiecare operațiune care participă la Ethereum, fie că este vorba de o tranzacție simplă, fie de un contract inteligent, fie chiar un ICO ia o cantitate de gaz. Gazul este ceea ce este utilizat pentru a calcula numărul de taxe care trebuie plătite rețelei pentru a executa o operațiune.

Toate contractele inteligente care rulează în EVM sunt codificate folosind soliditatea (Ethereum intenționează să treacă la Vyper de la Solidity în viitor.) Fiecare linie de cod din soliditate necesită o anumită cantitate de gaz pentru a fi calculată.

Pentru a înțelege mai bine cum funcționează gazul în Ethereum, să folosim o analogie. Să presupunem că pleci într-o călătorie rutieră. Înainte de a face acest lucru, parcurgeți acești pași:

  • Mergi la benzinărie și specifici cât de mult vrei să umple în mașină.
  • Ai gazul acela umplut în mașină.
  • Plătești la benzinărie suma de bani pe care le datorezi pentru benzină.

Acum, să facem paralele cu Ethereum.

  • Mașina este operațiunea pe care doriți să o executați, cum ar fi un gaz sau un contract inteligent.
  • Gazul este bine …. gaz.
  • Benzinăria este minerul tău.
  • Banii pe care i-ai plătit sunt taxele minerilor.

Toate operațiunile pe care utilizatorii doresc să le execute acolo trebuie să furnizeze gaz pentru următoarele:

  • Pentru a-și acoperi datele, de asemenea, gaz intrinsec.
  • Pentru a acoperi întregul său calcul.

Ce este Limita de gaz?

Pentru a realiza o operațiune în Ethereum, generatorul de operațiuni (adică persoana care inițiază tranzacția sau creatorul contractului inteligent) trebuie să specifice o limită de gaz înainte de a o trimite minerilor. Când s-a specificat o limită de gaz numai atunci minerii vor începe să execute operațiunea.

Atunci când depuneți o limită de gaz, trebuie luate în considerare următoarele puncte:

  • Diferite operațiuni vor avea costuri diferite de gaz (așa cum s-a arătat anterior).
  • Minerii vor înceta să execute în momentul în care s-a epuizat gazul.
  • Dacă a mai rămas gaz, acesta va fi rambursat imediat generatorului de funcționare.

Să vedem acest lucru în funcțiune într-un scenariu ipotetic:

Să presupunem că adăugăm două numere și, pentru aceasta, contractul trebuie să facă următoarele acțiuni:

  • Memorarea a 10 într-o variabilă. Să presupunem că această operațiune costă 45 wei de gaz.
  • Adăugând două variabile, să presupunem că acest lucru costă 10 wei de gaz.
  • Stocarea rezultatului care costă din nou 45 wei de gaz.

Să presupunem că limita de gaz este 120 wei.

Gazul total utilizat de miner este (45 + 10 + 45) 100 wei.

Taxele care li se datorează presupunând 1 wei costă 0,02 micro ETH este (100 * 0,02 micro ETH) = 0,000002 ETH.

Acum, cât gaz a rămas?

120 – 100 = 20 wei.

Cele 20 de wei sunt rambursate înapoi la generatorul de funcționare.

Deci, ce sa întâmplat cu KotET?

Contractele KotET s-au comportat destul de normal, cu excepția unui singur scenariu. Când contractul KotET a trimis o plată către un „cont contractual”, acesta a alocat cumva doar o cantitate mică de gaz … 2300 pentru a fi exact. Este clar că nu este suficient gaz pentru a acoperi cheltuielile.

După cum spune KotET,

„Când un contract de portofel nu a reușit să proceseze plata trimisă de acesta prin contractul KotET, eterul plătit a fost returnat contractului KotET. KotET nu a fost conștient de faptul că plata a eșuat și a continuat procesarea, făcând apelantul rege, în ciuda faptului că plata despăgubirii nu a fost trimisă monarhului anterior ”.

Să încercăm să descompunem tot ce a greșit aici:

  • Limita de gaz de 2300.
  • Contractul de portofel de ceață care a fost insuficient pentru ca plata să fie acceptată de contractul de portofel.
  • Dezvoltatorul contractului KotET nu a fost conștient de limita de 2300 de gaze care a fost inclusă la trimiterea plății.

  • Dezvoltatorul contractului KotET nu știa că orice parte a tranzacției ar putea eșua și reveni fără ca întregul lanț să cedeze și să revină.
  • Testarea beta minimă în lumea reală de către dezvoltatorii contractului KotET.
  • Funcția de rezervă în contractele de portofel utilizate de Ethereum Mist Wallet necesită mai mult de 2300 de gaze disponibile în timpul unui apel .send ().

Privind codul (Vulnerabilități ale contractelor inteligente)

Acest contract este o reprezentare simplificată a jocului:

Explorarea vulnerabilităților contractului inteligent: regele eterului

Conform contractului, atunci când un participant trimite eter la contract (msg.value), acesta declanșează în mod implicit și rezerva KotET. Rezerva KotET verifică mai întâi dacă eterul trimis este suficient pentru a obține titlul.

Dacă nu, acesta revine transferul de eter. Dacă da, participantul este ales ca noul rege. Când se întâmplă acest lucru, compensațiile sunt trimise regelui anterior și participantul este încoronat. Diferența dintre banii trimiși de noul rege și compensația vechiului rege este păstrată prin contract. Proprietarul KotET poate retrage toate aceste etere acumulate în contract prin sweepCommission.

Vulnerabilitatea constă în funcția de trimitere Dacă funcția este echipată cu gaz insuficient, king.send (compensare) va eșua dacă adresa regelui este aceea a unui contract cu o rezervă scumpă. În acest caz, compensația este pur și simplu păstrată prin contract în locul regelui anterior.

Concluzie privind vulnerabilitățile contractului inteligent

Sperăm că ați aflat din greșeala lui KotET. Micile greșeli ca acestea pot provoca multe ravagii dacă nu sunt corectate la timp. Când vine vorba de codificarea contractelor inteligente, atenția la detalii este de o importanță capitală pentru a evita vulnerabilitățile contractelor inteligente.

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