(Partea 3) Peste 300 de milioane de dolari au pierdut din cauza acestei vulnerabilități!
Partea 2
Iată un exemplu live de contract inteligent și aflați cum funcționează, chiar dacă nu sunteți dezvoltator
Atacurile de reintrare sunt o vulnerabilitate comună în contractele inteligente EVM, permițând unui contract extern să deturneze fluxul de control și să intre din nou, potențial drenând fondurile victimei.
Aceste atacuri sunt încă o problemă semnificativă în dezvoltarea contractelor inteligente și sunt luate foarte în serios de către dezvoltatori.
Atacurile opulare cu contracte inteligente de reintrare includ:
• Hackul DAO: au pierdut aproximativ 50 de milioane de dolari ETH.
• Cream Finance: au pierdut peste 30 de milioane de dolari din diverse active.
• Protocol Siren: Au pierdut diferite active în valoare de peste 30 de milioane de dolari.
Să implementăm acest exemplu folosind contracte inteligente Solidity.
Nu vă faceți griji, vom merge pas cu pas.
Voi folosi @EthereumRemix (X), o interfață de dezvoltare în care puteți scrie, compila, testa și rula cod.
Vom scrie un cod și vom simula un atac.
• Mai întâi, să creăm un fișier numit „Bank.sol”, care va conține tot codul.
• Apoi, creați o mapare pentru a stoca soldul fiecărei adrese.
Aici, fiecare adresă va corespunde contului unei persoane.
În continuare, vom crea o funcție simplă de depunere care le permite clienților să depună bani în bancă.
Contractul inteligent aici reprezintă banca.
De fiecare dată când se face o depunere, maparea este actualizată prin adăugarea noului depozit la adresa respectivă.
Avem nevoie, de asemenea, de o funcție de retragere care să permită deponenților să își retragă total sau parțial soldul.
Pentru a simplifica, de fiecare dată când clientul apelează la această funcție, își va retrage întregul sold, iar soldul îl setăm la 0 în mapare.
În cele din urmă, adăugăm o funcție care nu modifică maparea, ci pur și simplu permite unui client să-și verifice soldul.
Aceasta se numește funcție de vizualizare, care nu consumă niciun gaz deoarece nu modifică datele din lanț, ci afișează doar informațiile solicitate.
Contractul pare destul de simplu și, la prima vedere, pare indestructibil.
Să încercăm un atac de reintrare asupra lui. Vom construi contractul inteligent al atacatorului cu o funcție de primire care se va retrage în continuare atâta timp cât soldul contractului este peste 1 ETH.
Pentru a finaliza, vom adăuga o funcție de vizualizare, getBalance, care va returna soldul Ether al contractului Attacker.
Acum, să implementăm totul și să testăm dacă atacul nostru de reintrare va funcționa.
În primul rând, trebuie să implementăm contractul Băncii:
• Începeți prin a compila ambele coduri.
• Implementarea contractului bancar.
• Copiați adresa contractului bancar desfășurat și utilizați-o ca intrare pentru a implementa contractul Attacker.
• Apoi, depuneți 10 ETH în contractul Băncii.
• Depuneți 1 ETH în contractul Attacker.
• În sfârșit, lansați atacul folosind funcția de atac.
După cum vedem, atacul a funcționat.
Am depus 10 ETH cu o adresă și 1 ETH cu adresa atacatorului.
În cele din urmă, adresa atacatorului deține 11 ETH.
Cum ar fi putut fi prevenit acest lucru?
Ar fi putut fi evitat prin setarea soldului clientului la 0 înainte de a le trimite fondurile atunci când apelează funcția de retragere.
Tot ce ar fi fost nevoie este să muți o singură linie de cod.
Sper că ați găsit acest articol de ajutor.
Urmați-mă @Bluechip pentru mai mult.
Like/Repostează citatul dacă poți.
#TON #DOGSONBINANCE #CryptoMarketMoves #TelegramCEO #USNonFarmPayrollReport