Terwijl DeFi-protocollen binnen het Ethereum-ecosysteem steeds warmer worden, ziet CipherTrace steeds meer exploits en aanvalsvectoren aan het licht komen. Afgelopen week, op 28 december 2020, werd het schildmijncontract van Cover Protocol, Blacksmith, uitgebuit. Hackers gebruikten een bug in het mijncontract om een oneindig aantal COVER-tokens te slaan en meer dan $ 4.4 miljoen uit het project te halen.
Dekkingsprotocol uitgebracht hun Post-Mortem gisteren waarin staat dat, onbekend bij Devs, de bug aanwezig was sinds de eerste implementatie van het Blacksmith-contract, wat het belang onderstreept van grondige beveiligingsaudits en pentesting van slimme contractenWat zijn slimme contracten? Een slim contract is een computerpro ... Meer.
Een tijdlijn van oneindig slaan
De tijdlijn van de aanvaller
- Nieuwe liquiditeitspool van Balancer was toegevoegd aan het Blacksmith.sol-contract.
- Aanvaller deposito's 1,326,879.99 BPT-tokens in het Blacksmith.sol-contract.
- Dezelfde aanvaller dan wordt uitgevoerd de exploitatie, door geld op te nemen uit het contract.
- De aanvaller is erin geslaagd voortzetten het slaan van beloningen en het opnemen van fondsen voor een bedrag van ongeveer $ 4.4 miljoen.
In een interessante gang van zaken maakten vermeende "witte hackers" die aan Grap Finance gelinkt waren, ook gebruik van de bug om COVER-tokens ter waarde van ongeveer $ 4 miljoen te slaan. Grap Finance heeft het geld uiteindelijk teruggegeven aan Cover Protocol.
Tijdlijn voor extern eigendom van Grap Finance Deployer (EOA)
- Nieuwe liquiditeitspool was goedgekeurd voor liquiditeitsmining.
- EOA van Grap Finance Deployer gedeponeerd 15,255.55 BPT (DAI / Basis) in de pool op Cover via het Blacksmith.sol-contract.
- Ongeveer vier minuten later waren de fondsen teruggetrokken op Cover en laat 1 Wei achter in het EOA-saldo van de Grap Finance Deployer.
- Een andere externe gebruiker trok zich terug het grootste deel van hun saldo van het Blacksmith.sol-contract rond dezelfde tijd dat Grap Finance met alle liquiditeit voor de DAI / Basis-pool op het Blacksmith.sol-contract leidde.
- Grap Finance-implementator gedeponeerd terug 15,255.55 BPT (DAI / Basis) in de pool.
- Dan is Grap Finance Deployer vorderingen de beloningen en, als gevolg van de exploitatie, pepermuntjes 40,796,131,214,802,500,000.21 COVER.
- Na wat verbranding van de geslagen tokens, Grap Finance Deployer verzendt terug Ether tot Cover met vermelding "Zorg de volgende keer voor je eigen spullen."
Hoe u oneindige tokens kunt slaan - een technische analyse
Achtergrond
Deze exploit brengt ons terug naar de fundamenten van de programmeertaal Solidity, die wordt gebruikt voor het implementeren van slimme contracten binnen Ethereum. Zodra deze contracten zijn samengesteld, kan de Ethereum Virtual Machine (EVM) de instructies (dwz opcodes) begrijpen die worden gebruikt om verschillende functies uit te voeren en geheugen en opslag te manipuleren. De EVM heeft drie verschillende gebieden waar het gegevens kan opslaan: geheugen, opslag en de stapel. Het begrijpen van deze gebieden is belangrijk om te begrijpen hoe de bug is misbruikt.
Vergelijkbaar met Random Access Memory (RAM) op een computer, de "geheugen”Sleutelwoord binnen Solidity wijst geheugen toe voor een specifieke variabele. In dit geval is die variabele gericht op een specifieke functie. Het geheugen wordt gewist zodra de functie is uitgevoerd, maar kan blijven staan als de inhoud van dat geheugen naar de opslag wordt geduwd voordat de functie terugkeert.
De "mediaopslag”Sleutelwoord binnen Solidity stelt variabelen in staat om te fungeren als een aanwijzer in de opslag van gegevens in mappings of datastructuren. Opslaggegevens zijn persistent tussen functieaanroepen en transacties. Onder de motorkap is opslag in wezen een sleutelwaardeopslag waarin 256-bits woorden worden toegewezen aan 256-bits woorden.
Merk op dat de EVM geen registratiemachine is, maar een stapelmachine - alle berekeningen worden dus uitgevoerd op een datagebied dat wordt genoemd de stapel. De stapel heeft een maximale capaciteit van 1024 items, maar alleen de bovenste 16 zijn gemakkelijk toegankelijk en kunnen worden gebruikt om het bovenste element te verwisselen met een van de 16 elementen eronder en meer.
The Bug
Hackers maakten gebruik van Blacksmith.sol van Cover Protocol - een Shield Mining Contract waarmee stakers kunnen worden beloond in de tokens van het specifieke project of de specifieke pool, zoals CLAIM- en NOCLAIM-tokens, binnen Cover Protocol.
Laten we, om de bug beter te begrijpen, eerst naar het publiek kijken zwembaden variabele die een afbeelding is (dwz opslag van gegevens):
At lijn 118zien we dat het contract de poolgegevens in het geheugen opslaat via het sleutelwoord "geheugen".
Toen verder lijn 121, werkt het contract de pool in opslag bij als de updatePool (adres _lpToken) functie gebruikt een Zwembad opslag zwembad variabel.
Als u echter verder naar beneden kijkt in het aanbetaling (adres _lpToken, uint256 _amount) functie, het gebruikt hetzelfde zwembad variabele uit regel 118 die in het geheugen was opgeslagen in de functie voor berekeningen voor pool.accRewardsPerToken. Op dit punt is de zwembad variabele is gekopieerd van de zwembaden mapping en werd in het geheugen opgeslagen.
Als gevolg hiervan kunnen eventuele wijzigingen in de zwembad variabele binnen de aanbetaling (adres _lpToken, uint256 _amount) functie zal de zwembaden mapping in de on-chain opslag van het contract vanwege het feit dat variabelen die het sleutelwoord "geheugen" gebruiken alleen binnen de functie zelf vallen. Van daaruit werkt het contract het pool.accRewardsPerToken in de updatePool (adres _lpToken) functie, die opslag gebruikt. Dus nu, binnen de updatePool (adres _lpToken) functie de pool.accRewardsPerToken dat is bijgewerkt stijgt enorm omdat het technisch gezien een nieuwe pool was en niet geassocieerd met de zwembad in het geheugen.
Na deze kwetsbaarheid en misbruik tussen geheugen en opslag, kan het mijnwerker.beloningAfschrijven in de aanbetaling (adres _lpToken, uint256 _amount) functie is verkeerd berekend, evenals het gebruik van de incorrecte pool.accRewardsPerToken, omdat we ons nog steeds binnen de deposit-functie bevinden die een in het geheugen gecachte exemplaar van zwembad.
Naast de stortingsfunctie kan iedereen, zoals Grap Finance, een waanzinnig aantal geslagen tokens krijgen wanneer ze de claimRewards (adres _lpToken) functie. Deze functie, die wordt gebruikt om hun beloningen te pakken, belt uiteindelijk _claimCoverRewards (poolgeheugenpool, mijnwerker) die verwijst naar het mijnwerker.beloningAfschrijven die we hierboven hebben benadrukt. Omdat die variabele veel kleiner is dan de werkelijke pool.accRewardsPerToken, resulteert het contract in het slaan van een overvloed aan tokens.
Key Takeaways
CipherTrace hoopt dat deze achtergrond in de uitgebuite bug het belang aan het licht brengt van grondige beveiligingsaudits en pentesting van slimme contracten op welke blockchainEen blockchain - de technologie die ten grondslag ligt aan bitcoin en andere c ... Meer men kiest ervoor om in te zetten. Terwijl Grap Finance het geld teruggaf dat ze via de exploit hadden ontvangen, kon de oorspronkelijke hacker nog steeds meer dan $ 4 miljoen halen uit het DeFi-protocol, en de waarde van het COVER-token is sindsdien met bijna 99% gedaald.
Bron: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/