Mentre i protocolli DeFi continuano a surriscaldarsi all'interno dell'ecosistema Ethereum, CipherTrace sta vedendo sempre più exploit e vettori di attacco venire alla luce. La scorsa settimana, il 28 dicembre 2020, il contratto per l'estrazione di scudi del protocollo Cover, Blacksmith, è stato sfruttato. Gli hacker hanno utilizzato un bug nel contratto minerario per coniare una quantità infinita di token COVER e drenare più di 4.4 milioni di dollari dal progetto.
Protocollo di copertura rilasciato il loro post-mortem di ieri affermando che, sconosciuto agli sviluppatori, il bug era presente sin dal dispiegamento iniziale del contratto Blacksmith, sottolineando l'importanza di controlli di sicurezza approfonditi e smart contractCosa sono gli smart contract? Uno smart contract è un professionista del computer ... Più.
Una linea temporale di conio infinito
Cronologia dell'attaccante iniziale
- Il pool di liquidità di New Balancer era aggiunto al contratto Blacksmith.sol.
- attacchi depositi 1,326,879.99 gettoni BPT nel contratto Blacksmith.sol.
- Lo stesso attaccante allora esegue l'exploit, ritirando i fondi dal contratto.
- L'attaccante è stato in grado di farlo continua conio di premi e prelievo di fondi per circa $ 4.4 milioni.
In una svolta interessante degli eventi, anche i presunti "hacker bianchi" collegati a Grap Finance hanno sfruttato il bug per coniare circa $ 4 milioni di token COVER. Grap Finance ha infine restituito i fondi a Cover Protocol.
Cronologia dell'account di proprietà esterna (EOA) di Grap Finance Deployer
- Il nuovo pool di liquidità era approvato per l'estrazione di liquidità.
- Grap Finance Deployer EOA depositato 15,255.55 BPT (DAI / Base) nel pool su Cover tramite il contratto Blacksmith.sol.
- Circa quattro minuti dopo, i fondi erano ritirata in copertina lasciando 1 Wei nel saldo EOA del Deployer finanziario Grap.
- Un altro utente esterno ritirato la maggior parte del loro saldo dal contratto Blacksmith.sol nello stesso periodo che ha portato Grap Finance con tutta la liquidità per il pool DAI / Basis sul contratto Blacksmith.sol.
- Deployer finanziario di Grap depositato indietro 15,255.55 BPT (DAI / Base) in piscina.
- Poi Grap Finance Deployer i premi e, grazie all'exploit, le zecche 40,796,131,214,802,500,000.21 COPERTURA.
- Dopo aver bruciato i gettoni coniati, Grap Finance Deployer invia indietro Ether per Cover affermando "La prossima volta, prenditi cura della tua merda."
Come coniare infiniti gettoni: un'analisi tecnica
sfondo
Questo exploit ci riporta ai fondamenti del linguaggio di programmazione Solidity, che viene utilizzato per l'implementazione di contratti intelligenti all'interno di Ethereum. Una volta compilati questi contratti, la Ethereum Virtual Machine (EVM) sarà in grado di comprendere le istruzioni (cioè gli opcode) che vengono utilizzate per eseguire varie funzioni e manipolare la memoria e l'archiviazione. L'EVM ha tre diverse aree in cui può memorizzare i dati: memoria, archiviazione e stack. La comprensione di queste aree è importante per capire come è stato sfruttato il bug.
Simile alla memoria ad accesso casuale (RAM) su un dispositivo informatico, il "memoriaLa parola chiave "all'interno di Solidity alloca la memoria per una variabile specifica. In questo caso, quella variabile ha come ambito una funzione specifica. La memoria viene cancellata una volta che la funzione è stata eseguita, ma potrebbe rimanere se il contenuto di quella memoria viene trasferito in memoria prima che la funzione ritorni.
Il "conservazioneLa parola chiave "all'interno di Solidity consente alle variabili di agire come un puntatore nella memorizzazione dei dati in mappature o strutture di dati. I dati di archiviazione sono persistenti tra le chiamate di funzione e le transazioni. Sotto il cofano, l'archiviazione è essenzialmente un archivio di valori-chiave che mappa parole a 256 bit su parole a 256 bit.
Si noti che l'EVM non è una macchina a registro ma una macchina a stack, quindi tutti i calcoli vengono eseguiti su un'area dati chiamata la pila. La pila ha una capacità massima di 1024 elementi, ma solo i primi 16 sono facilmente accessibili che possono essere utilizzati per scambiare l'elemento più in alto con uno dei 16 elementi sottostanti e altro ancora.
Il bug
Gli hacker hanno sfruttato Blacksmith.sol del Cover Protocol, un contratto per l'estrazione di scudi che consente agli stakers di essere ricompensati con i token del progetto o pool specifico, come i token CLAIM e NOCLAIM, all'interno del Cover Protocol.
Per comprendere meglio il bug, prima diamo un'occhiata al pubblico piscine variabile che è una mappatura (ovvero archiviazione dei dati):
At Linea 118, vediamo che il contratto memorizza nella cache i dati del pool tramite la parola chiave "memory".
Poi avanti Linea 121, il contratto aggiorna il pool in archivio come updatePool (indirizzo _lpToken) function utilizza un Pool di stoccaggio della piscina variabile.
Tuttavia, se guardi più in basso nel file deposito (indirizzo _lpToken, uint256 _amount) funzione, usa lo stesso pool variabile dalla riga 118 che è stata memorizzata nella cache all'interno della funzione per i calcoli per pool.accRewardsPerToken. A questo punto, il pool variabile è stata copiata dal file piscine mappatura ed è stato salvato in memoria.
Di conseguenza, tutte le modifiche apportate a pool variabile all'interno del deposito (indirizzo _lpToken, uint256 _amount) la funzione non cambierà la piscine mappatura nell'archiviazione in catena del contratto a causa del fatto che le variabili che utilizzano la parola chiave "memory" sono limitate all'ambito della funzione stessa. Da lì, il contratto aggiorna il file pool.accRewardsPerToken all'interno updatePool (indirizzo _lpToken) funzione, che utilizza l'archiviazione. Quindi ora, all'interno del updatePool (indirizzo _lpToken) funzione il pool.accRewardsPerToken che viene aggiornato aumenta notevolmente in quanto tecnicamente era un nuovo pool e non era associato al pool in memoria.
A seguito di questa vulnerabilità e uso improprio tra memoria e archiviazione, il miner.rewardWriteoff all'interno deposito (indirizzo _lpToken, uint256 _amount) la funzione è calcolata male così come l'utilizzo del file sbagliato pool.accRewardsPerToken, poiché siamo ancora all'interno della funzione di deposito che gestisce un'istanza memorizzata nella cache di pool.
Oltre alla funzione di deposito, chiunque, come Grap Finance, può ottenere una quantità folle di gettoni coniati quando esegue il claimRewards (indirizzo _lpToken) funzione. Questa funzione, che viene utilizzata per ottenere i loro premi, finisce per chiamare _claimCoverRewards (Pool di memoria pool, Miner memory miner) che fa riferimento a miner.rewardWriteoff che abbiamo evidenziato sopra. Poiché quella variabile è molto più piccola dell'attuale pool.accRewardsPerToken, il contratto si traduce nel coniare un'abbondanza di gettoni.
Punti chiave
CipherTrace spera che questo background nel bug sfruttato porti alla luce l'importanza di controlli di sicurezza approfonditi e del pentesting di contratti intelligenti su qualsiasi blockchainUna blockchain: la tecnologia alla base di bitcoin e altri c ... Più si sceglie di distribuire a. Mentre Grap Finance ha restituito i fondi ricevuti attraverso l'exploit, l'hacker originale è stato ancora in grado di guadagnare oltre $ 4 milioni dal protocollo DeFi e il valore del token COVER è crollato di quasi il 99%.
Fonte: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/