Ahogy a DeFi protokollok tovább melegednek az Ethereum ökoszisztémán belül, a CipherTrace egyre több kizsákmányolást és támadási vektort lát napvilágra. A múlt héten, 28. december 2020-án a Cover Protocol pajzsbányászati szerződését, a Blacksmith-t kihasználták. A hackerek a bányászati szerződés egy hibáját felhasználva végtelen mennyiségű COVER tokent vertek, és több mint 4.4 millió dollárt vontak el a projektből.
Fedőprotokoll felszabaduló a tegnapi Post Mortem azt állítja, hogy a fejlesztők számára ismeretlen módon a hiba a Blacksmith-szerződés kezdeti bevezetése óta jelen volt, kiemelve az alapos biztonsági ellenőrzések és a fejlesztők tesztelésének fontosságát. intelligens szerződésekMik azok az intelligens szerződések? Az okos szerződés számítógépes profi… Több.
A végtelen pénzverés idővonala
A kezdeti támadó idővonala
- New Balancer likviditási pool volt hozzáadott a Kovács.sol szerződéshez.
- Támadó betétek 1,326,879.99 XNUMX XNUMX BPT token a Blacksmith.sol szerződésbe.
- Akkor ugyanaz a támadó végrehajt a kiaknázást a szerződésből származó pénzeszközök megvonásával.
- A támadó képes volt rá folytatódik nagyjából 4.4 millió dollár összegű jutalmak pénzverése és pénzfelvétel.
Az események egy érdekes fordulata során a Grap Finance-hez köthető állítólagos „fehér hackerek” is kihasználták a hibát, és nagyjából 4 millió dollár értékű COVER tokeneket vertek. A Grap Finance végül visszaadta az alapokat a Cover Protocolnak.
Grap Finance Deployer külső tulajdonú fiók (EOA) idővonala
- Új likviditási pool volt jóváhagyott likviditásbányászathoz.
- Grap Finance Deployer EOA letétbe 15,255.55 XNUMX BPT (DAI/Basis) a Blacksmith.sol szerződésen keresztül a Cover medencéjébe.
- Nagyjából négy perccel később az alapok megvoltak visszavont a borítón 1 Wei marad a Grap Finance Deployer EOA egyenlegében.
- Egy másik külső felhasználó visszavonta a Blacksmith.sol szerződésből származó egyenlegük nagy része nagyjából ugyanebben az időben vezette a Grap Finance-t a DAI/Basis pool teljes likviditásával a Blacksmith.sol szerződésen.
- Grap Finance Deployer letétbe vissza 15,255.55 XNUMX BPT (DAI/Basis) a medencébe.
- Ezután a Grap Finance Deployer követelések a jutalmakat és a kizsákmányolás miatt 40,796,131,214,802,500,000.21 XNUMX XNUMX XNUMX XNUMX XNUMX XNUMX FEEDEZET.
- A vert tokenek elégetése után a Grap Finance Deployer küld vissza Ether to Cover kijelentve – Legközelebb foglalkozz a saját szaroddal.
Végtelen token verés – Technikai elemzés
Háttér
Ez az exploit visszavezet minket a Solidity programozási nyelv alapjaihoz, amelyet az Ethereumon belüli intelligens szerződések megvalósítására használnak. Miután ezeket a szerződéseket összeállították, az Ethereum Virtual Machine (EVM) képes lesz megérteni a különféle funkciók végrehajtására, valamint a memória és tárhely manipulálására használt utasításokat (azaz műveleti kódokat). Az EVM három különböző területtel rendelkezik, ahol adatokat tárolhat: memória, tárhely és a verem. Ezeknek a területeknek a megértése fontos a hiba kihasználásának megértéséhez.
A számítástechnikai eszközök véletlen elérésű memóriájához (RAM) hasonlóan a „emlékezet” kulcsszó a Solidity-n belül, memóriát foglal le egy adott változó számára. Ebben az esetben ez a változó egy adott függvényre van hatóköre. A memória törlődik a függvény végrehajtása után, de megmaradhat, ha a memória tartalma a tárolóba kerül, mielőtt a függvény visszatérne.
Aztárolás” kulcsszó a Solidityben lehetővé teszi, hogy a változók mutatóként működjenek az adatok leképezésekben vagy adatstruktúrákban történő tárolására. A tárolási adatok állandóak a függvényhívások és a tranzakciók között. A motorháztető alatt a tároló alapvetően egy kulcsérték tároló, amely a 256 bites szavakat 256 bites szavakra képezi le.
Vegye figyelembe, hogy az EVM nem egy regisztergép, hanem egy veremgép – így minden számítás egy adatterületen, az ún. a verem. A köteg maximális kapacitása 1024 elem, de csak a felső 16 érhető el könnyen, amivel a legfelső elemet fel lehet cserélni az alatta lévő 16 elem valamelyikére és még sok másra.
A hiba
A hackerek kihasználták a Cover Protocol Blacksmith.sol-ját – egy pajzsbányászati szerződést, amely lehetővé teszi, hogy az érdekeltek jutalmat kapjanak az adott projekt vagy pool tokenjeiben, például a CLAIM és NOCLAIM tokenekben a Cover Protokollon belül.
A hiba jobb megértése érdekében először nézzük meg a nyilvánosságot medencék változó, amely egy leképezés (azaz adatok tárolása):
At 118 sor, azt látjuk, hogy a szerződés a „memory” kulcsszón keresztül gyorsítótárazza a készletadatokat a memóriában.
Aztán tovább 121 sor, a szerződés frissíti a tárolóban lévő készletet, mint a updatePool(cím _lpToken) funkció használja a Medence tároló medence változót.
Ha azonban lejjebb nézel a letét(cím _lpToken, uint256 _összeg) funkciót, ugyanazt használja medence változó a 118. sorból, amely gyorsítótárazott volt a függvényen belül a számításokhoz pool.accRewardsPerToken. Ezen a ponton a medence változót a medencék leképezés, és mentve lett a memóriába.
Ennek eredményeként a medence változó a letét(cím _lpToken, uint256 _összeg) funkció nem változtatja meg a medencék leképezés a szerződés láncon belüli tárolójában, mivel a „memória” kulcsszót használó változók csak magán a függvényen belül vannak hatókörükben. Innentől kezdve a szerződés frissíti a pool.accRewardsPerToken belül updatePool(cím _lpToken) funkció, amely tárhelyet használ. Tehát most, belül updatePool(cím _lpToken) függvény a pool.accRewardsPerToken Ez a frissítés jelentősen megnő, mivel technikailag egy új készlet volt, és nem kapcsolódik a medence emlékül.
Ezt a sebezhetőséget, valamint a memória és a tárhely közötti visszaélést követően a bányász.jutalomLeírás belül letét(cím _lpToken, uint256 _összeg) függvényt rosszul számították ki, valamint a helytelenül használta pool.accRewardsPerToken, mivel még mindig a letéti funkción belül vagyunk, amely a memóriában tárolt példányát kezeli medence.
A letéti funkció mellett bárki, például a Grap Finance, őrült mennyiségű vert tokenhez juthat, amikor végrehajtja a igénylés Jutalmak (cím _lpToken) funkció. Ez a funkció, amelyet a jutalmaik megszerzésére használnak, a hívást végződik _claimCoverRewards (Pool memóriakészlet, Miner memóriabányász) amely utal a bányász.jutalomLeírás amit fentebb kiemeltünk. Mivel ez a változó sokkal kisebb, mint a tényleges pool.accRewardsPerToken, a szerződés rengeteg zsetont eredményez.
Kulcs elvezetések
A CipherTrace reméli, hogy a kihasznált hiba háttere rávilágít az alapos biztonsági auditok és az intelligens szerződések pentesztelésének fontosságára. blockchainA blokklánc – a bitcoin és más c… Több az ember úgy dönt, hogy telepíti. Míg a Grap Finance visszaadta a kizsákmányolás révén kapott pénzt, az eredeti hacker még így is több mint 4 millió dollárt tudott begyűjteni a DeFi protokollból, és a COVER token értéke azóta közel 99%-ot zuhant.
Forrás: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/