Pe măsură ce protocoalele DeFi continuă să se încălzească în ecosistemul Ethereum, CipherTrace vede tot mai multe exploate și vectori de atac ieșiți la lumină. Săptămâna trecută, pe 28 decembrie 2020, a fost exploatat contractul de exploatare a scutului Cover Protocol, Blacksmith. Hackerii au folosit o eroare în contractul minier pentru a crea o cantitate infinită de jetoane COVER și pentru a scoate mai mult de 4.4 milioane de dolari din proiect.
Protocol de acoperire eliberat post-Mortem, ieri, afirmând că, necunoscut de Devs, bug-ul a fost prezent de la implementarea inițială a contractului Blacksmith, subliniind importanța unor audituri de securitate aprofundate și a pentestingului contracte inteligenteCe sunt contractele inteligente? Un contract inteligent este un computer pro ... Mai Mult.
O cronologie a inventării infinite
Cronologia inițială a atacatorului
- Noul fond de lichidități Balancer a fost adăugat la contractul Blacksmith.sol.
- Atacator depozite 1,326,879.99 jetoane BPT în contractul Blacksmith.sol.
- Același atacator atunci execută exploatarea, prin retragerea de fonduri din contract.
- Atacatorul a reușit continua bătând recompense și retragând fonduri în valoare de aproximativ 4.4 milioane USD.
Într-o întorsătură interesantă a evenimentelor, presupuși „hackeri albi” legați de Grap Finance au exploatat bug-ul pentru a crea token-uri COVER în valoare de aproximativ 4 milioane de dolari. Grap Finance a returnat în cele din urmă fondurile la Cover Protocol.
Cronologie Grap Finance Deployer External Owned Account (EOA)
- Noul fond de lichidități a fost aprobat pentru extragerea lichidității.
- Grap Finance Deployer EOA depus 15,255.55 BPT (DAI / Bază) în piscina de pe Cover prin contractul Blacksmith.sol.
- Aproximativ patru minute mai târziu, fondurile erau retrase pe Cover lăsând 1 Wei în soldul EOA al Grap Finance Deployer.
- Un alt utilizator extern a retras cea mai mare parte a soldului lor din contractul Blacksmith.sol în același timp, ceea ce a condus Grap Finance cu toată lichiditatea pentru fondul DAI / Bază al contractului Blacksmith.sol.
- Grap Finance Deployer depus înapoi 15,255.55 BPT (DAI / Bază) în piscină.
- Apoi Grap Finance Deployer creanțe recompensele și, datorită exploatării, monetizează 40,796,131,214,802,500,000.21 COVER.
- După arderea jetoanelor bătute, Grap Finance Deployer trimite înapoi declarând Ether to Cover „Data viitoare, ai grijă de propriile tale rahaturi.”
How to Mint Infinite Tokens - O analiză tehnică
Context
Această exploatare ne duce înapoi la fundamentele limbajului de programare Solidity, care este utilizat pentru implementarea contractelor inteligente în cadrul Ethereum. Odată ce aceste contracte sunt compilate, mașina virtuală Ethereum (EVM) va fi capabilă să înțeleagă instrucțiunile (de exemplu, coduri opționale) care sunt utilizate pentru a executa diferite funcții și pentru a manipula memoria și stocarea. EVM are trei zone diferite în care poate stoca date: memorie, stocare și stivă. Înțelegerea acestor zone este importantă pentru înțelegerea modului în care a fost exploatat bug-ul.
Similar cu memoria cu acces aleatoriu (RAM) de pe un dispozitiv de calcul,memorie”Cuvântul cheie din Solidity alocă memorie pentru o anumită variabilă. În acest caz, acea variabilă este acoperită de o funcție specifică. Memoria este ștearsă odată ce funcția a fost executată, dar ar putea rămâne dacă conținutul acelei memorii este împins în stocare înainte ca funcția să revină.
"depozitare”Cuvântul cheie din Solidity permite variabilelor să acționeze ca un indicator în stocarea datelor în mapări sau structuri de date. Datele de stocare sunt persistente între apelurile funcționale și tranzacții. Sub capotă, stocarea este în esență un depozit de valori cheie care mapează cuvinte de 256 de biți pe cuvinte de 256 de biți.
Rețineți că EVM nu este o mașină de înregistrare, ci o mașină de stivă - astfel toate calculele sunt efectuate pe o zonă de date numită stiva. Stiva are o capacitate maximă de 1024 articole, dar doar primele 16 sunt ușor accesibile, care pot fi folosite pentru a schimba elementul cel mai de sus cu unul dintre cele 16 elemente de sub acesta și multe altele.
Gandacul
Hackerii au exploatat Blacksmith.sol de la Cover Protocol - un Shield Mining Contract care permite jucătorilor să fie recompensați în jetoanele proiectului sau grupului specific, cum ar fi jetoanele CLAIM și NOCLAIM, în cadrul Protocolului de acoperire.
Pentru a înțelege mai bine eroarea, mai întâi, să ne uităm la public bazine variabilă care este o mapare (adică stocarea datelor):
At line 118, vedem că contractul memorează în cache datele pool-ului în memorie prin intermediul cuvântului cheie „memory”.
Apoi line 121, contractul actualizează pool-ul stocat ca updatePool (adresa _lpToken) funcţie folosește un Piscină depozitare piscină variabilă.
Cu toate acestea, dacă priviți mai jos în depozit (adresa _lpToken, uint256 _amount) funcție, folosește același lucru piscină variabilă de la linia 118 care a fost stocată în memorie în cadrul funcției pentru calcule pentru pool.accRewardsPerToken. În acest moment, piscină variabila a fost copiată din bazine cartografiere și a fost salvat în memorie.
Ca urmare, orice modificare adusă la piscină variabilă în cadrul depozit (adresa _lpToken, uint256 _amount) funcția nu va schimba fișierul bazine maparea în stocarea în lanț a contractului datorită faptului că variabilele care utilizează cuvântul cheie „memorie” sunt cuprinse numai în cadrul funcției în sine. De acolo, contractul actualizează fișierul pool.accRewardsPerToken în cadrul updatePool (adresa _lpToken) funcție, care utilizează stocarea. Deci acum, în cadrul updatePool (adresa _lpToken) funcționează pool.accRewardsPerToken care este actualizat crește considerabil, deoarece era din punct de vedere tehnic un nou pool și nu era asociat cu piscină in memoria.
În urma acestei vulnerabilități și abuzuri între memorie și stocare, miner.rewardWriteoff în cadrul depozit (adresa _lpToken, uint256 _amount) funcția este greșit calculată, precum și utilizarea incorectă pool.accRewardsPerToken, deoarece suntem încă în funcția de depunere care gestionează o instanță în memorie cache piscină.
În plus față de funcția de depunere, oricine, cum ar fi Grap Finance, poate obține o cantitate nebună de jetoane bătute atunci când execută claimRewards (adresa _lpToken) funcţie. Această funcție, care este folosită pentru a le obține recompensele, ajunge să apeleze _claimCoverRewards (Pool de memorie Pool, miner Miner memory) care face referire la miner.rewardWriteoff pe care le-am evidențiat mai sus. Deoarece această variabilă este mult mai mică decât cea reală pool.accRewardsPerToken, contractul are ca rezultat băterea unei abundențe de jetoane.
Intrebari cu cheie
CipherTrace speră că acest fundal al bug-ului exploatat va scoate la iveală importanța unor audituri de securitate aprofundate și a recuzării unor contracte inteligente, oricare ar fi blockchainUn blockchain - tehnologia care stă la baza bitcoinului și a altor c ... Mai Mult se alege să se desfășoare în. În timp ce Grap Finance a returnat fondurile pe care le-a primit prin intermediul exploitului, hackerul inițial a reușit să câștige peste 4 milioane de dolari din protocolul DeFi, iar valoarea simbolului COVER a scăzut de aproape 99%.
Sursa: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/