Kun DeFi-protokollat lämpenevät edelleen Ethereum-ekosysteemissä, CipherTrace näkee yhä enemmän hyväksikäyttöjä ja hyökkäysvektoreita. Viime viikolla, 28. joulukuuta 2020, Cover Protocolin kilpakaivosopimus, Blacksmith, hyödynnettiin. Hakkerit käyttivät kaivosopimuksessa olevaa virhettä lyömään loputtoman määrän COVER-rahakkeita ja valuttamaan yli 4.4 miljoonaa dollaria projektista.
Cover Protokolla julkaistu Heidän post-Mortem -tapahtumassaan todettiin, että Devsille tuntematon virhe oli ollut olemassa sepäsopimuksen alkuperäisen käyttöönoton jälkeen, korostaen perusteellisten tietoturvatarkastusten ja pentestien tärkeyttä älykkäät sopimuksetMitä ovat älykkäät sopimukset? Älykäs sopimus on tietokoneohjelma… Lisää:.
Aikajana äärettömästä rahapajasta
Alkuperäinen hyökkääjän aikajana
- New Balancerin likviditeettisarja oli lisä- Blacksmith.sol -sopimukseen.
- hyökkääjä talletukset 1,326,879.99 XNUMX BPT-tunnusta Blacksmith.sol-sopimukseen.
- Sama hyökkääjä sitten teloitettiin hyödyntää vetämällä varoja sopimuksesta.
- Hyökkääjä pystyi jatkaa lyödä palkkioita ja nostaa varoja noin 4.4 miljoonaa dollaria.
Mielenkiintoisessa käännekohdassa väitetyt "valkoiset hakkerit", jotka liittyivät Grap Financeen, hyödynsivät myös virhettä lyödä noin 4 miljoonan dollarin arvosta COVER-tunnuksia. Grap Finance palautti lopulta varat Cover Protocolille.
Grap Finance Deployerin ulkoisesti omistaman tilin (EOA) aikajana
- Uusi likviditeettipooli oli hyväksytty likviditeetin louhintaan.
- Grap Finance Deployer EOA talletettu 15,255.55 BPT (DAI / Basis) Cover-altaaseen Blacksmith.sol-sopimuksen kautta.
- Noin neljä minuuttia myöhemmin varat olivat peruutettu kannella jättäen 1 Wei Grap Finance Deployerin EOA-saldoon.
- Toinen ulkopuolinen käyttäjä vetäytyi suurin osa saldostaan Blacksmith.sol-sopimuksesta samaan aikaan, mikä johti Grap Financeen kaikella likviditeetillä Blacksmith.sol-sopimuksen DAI / Basis-pooliin.
- Grap Finance Deployer talletettu takaisin 15,255.55 BPT (DAI / Basis) altaaseen.
- Sitten Grap Finance Deployer vaatimukset palkkiot ja hyödyntämisen vuoksi lyö 40,796,131,214,802,500,000.21 XNUMX XNUMX XNUMX XNUMX XNUMX XNUMX XNUMX XNUMX. XNUMX KANSI.
- Jonkin verran lyötyjen rahakkeiden polttamisen jälkeen Grap Finance Deployer lähettää takana Eetteri kansi toteaa "Ensi kerralla pidä huolta omasta paskaasi."
Kuinka lyödä äärettömiä rahakkeita - tekninen analyysi
Tausta
Tämä hyödyntäminen vie meidät takaisin Solidity-ohjelmointikielen perusteisiin, jota käytetään älykkäiden sopimusten toteuttamiseen Ethereumissa. Kun nämä sopimukset on koottu, Ethereum Virtual Machine (EVM) pystyy ymmärtämään ohjeet (ts. Opkoodit), joita käytetään erilaisten toimintojen suorittamiseen sekä muistin ja tallennustilan käsittelyyn. EVM: llä on kolme eri aluetta, joihin se voi tallentaa tietoja: muisti, tallennustila ja pino. Näiden alueiden ymmärtäminen on tärkeää, jotta ymmärrettäisiin, kuinka virhettä hyödynnettiin.
Samoin kuin tietokonelaitteen RAM-muistissa, “muisti”Avainsana Solidityssä varaa muistin tietylle muuttujalle. Tässä tapauksessa kyseinen muuttuja rajataan tiettyyn toimintoon. Muisti tyhjennetään, kun toiminto on suoritettu, mutta se voi jäädä, jos muistin sisältö työnnetään varastoon ennen toiminnon paluuta.
"Levytila”Avainsana Solidityssä sallii muuttujien toimia osoittimena tietojen tallennukseen kartoituksissa tai tietorakenteissa. Tallennustiedot ovat pysyviä toimintokutsujen ja tapahtumien välillä. Konepellin alla tallennus on pohjimmiltaan avainarvovarasto, joka kartoittaa 256-bittiset sanat 256-bittisiin sanoihin.
Huomaa, että EVM ei ole rekisterikone vaan pinokone - kaikki laskelmat suoritetaan siis kutsutulle data-alueelle pino. Pinon enimmäiskapasiteetti on 1024 kappaletta, mutta vain yläosaan 16 pääsee helposti käsiksi, joita voidaan käyttää vaihtamaan ylin elementti yhteen sen alapuolella olevista 16 elementistä ja muilla.
Bug
Hakkerit käyttivät hyväkseen Cover Protocolin Blacksmith.sol-kilpikaivosopimusta, jonka avulla sidosryhmiä voidaan palkita tietyn projektin tai poolin tunnuksilla, kuten CLAIM- ja NOCLAIM-tunnuksilla Cover Protocolissa.
Katsokaa ensin yleisöä ymmärtääksemme virheen paremmin altaat muuttuja, joka on kartoitus (eli tietojen tallennus):
At line 118, näemme, että sopimus tallentaa välimuistitiedot muistiin "memory" -avainsanan kautta.
Sitten line 121, sopimus päivittää varaston poolin updatePool (osoite _lpToken) toiminto käyttää a Allasvarasto-allas muuttuja.
Kuitenkin, jos katsot kauempana alaspäin talletus (osoite _lpToken, uint256 _määrä) toiminto, se käyttää samaa pool muuttuja riviltä 118, joka on tallennettu välimuistiin funktion sisällä laskennalle pool.accRewardsPerToken. Tässä vaiheessa pool muuttuja kopioitiin altaat kartoitus ja tallennettiin muistiin.
Tämän seurauksena kaikki pool muuttuja talletus (osoite _lpToken, uint256 _määrä) toiminto ei muuta altaat kartoitus sopimuksen ketjutallennustilassa johtuen siitä, että muuttujat, jotka käyttävät "muisti" -avainsanaa, ovat vain itse toiminnon sisällä. Sieltä sopimus päivittää pool.accRewardsPerToken puitteissa updatePool (osoite _lpToken) toiminto, joka käyttää tallennustilaa. Joten nyt, sisällä updatePool (osoite _lpToken) toiminto pool.accRewardsPerToken Päivitetty päivitys kasvaa huomattavasti, koska se oli teknisesti uusi pooli eikä liittynyt pool muistissa.
Tämän haavoittuvuuden ja muistin ja tallennustilan väärinkäytön seurauksena Miner.rewardWriteoff puitteissa talletus (osoite _lpToken, uint256 _määrä) toiminto lasketaan väärin ja käytetään väärää pool.accRewardsPerToken, koska olemme edelleen talletustoiminnossa, joka käsittelee muistivälimuistissa olevaa tapausta pool.
Talletustoiminnon lisäksi kuka tahansa, kuten Grap Finance, voi saada mielettömän määrän lyötyjä rahakkeita suorittaessaan ClaireRewards (osoite _lpToken) toiminto. Tämä toiminto, jota käytetään heidän palkintojensa hankkimiseen, lopulta soittaa _claimCoverRewards (Pool-muistivarasto, Miner-muistimineraali) joka viittaa Miner.rewardWriteoff jonka korostimme edellä. Koska muuttuja on paljon pienempi kuin todellinen pool.accRewardsPerToken, sopimus johtaa lyömään runsaasti rahakkeita.
Keskeiset ostokset
CipherTrace toivoo, että tämä hyödynnetyn virheen tausta tuo esiin perusteellisten tietoturvatarkastusten ja älykkäiden sopimusten tekemisen tärkeyden kumpi tahansa blockchainLohkoketju - bitcoinin ja muun c: n taustalla oleva tekniikka… Lisää: yksi päättää ottaa käyttöön. Vaikka Grap Finance palautti hyödyntämisen kautta saamansa varat, alkuperäinen hakkeri pystyi silti nettouttamaan yli 4 miljoonaa dollaria DeFi-protokollasta, ja COVER-tunnuksen arvo on sittemmin pudonnut lähes 99%.
Lähde: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/