smart contract
Mar 6

Rimanere al sicuro nella DeFi

Molte cose possono andare storto quando si utilizzano applicazioni decentralizzate su piattaforme come Ethereum o Binance Chain.

Il modo più imprevisto in cui gli utenti perdono le loro criptovalute è l’approvazione di spesa non verificata degli smart contract. Per accedere alla DeFi di Ethereum o agli smart contract compatibili come quelli su Binance Smart Chain si utilizza normalmente Metamask.

Gli smart contract non possono semplicemente prendere denaro dal un wallet se vengono compromessi. Ma quando gli utenti eseguono delle transazioni gli viene spesso chiesto di approvare la spesa dei token dal proprio account. In quel momento non si sta inviando denaro a uno smart contract, ma lo smart contract piuttosto prende denaro con il permesso dell’utente.

Le approvazioni ai token ERC20

Con il token ETH nativo di Ethereum è possibile chiamare una funzione di smart contract e allo stesso tempo inviare ETH al contratto, utilizzando le funzioni di pagamento. Ma poiché i token ERC20 sono essi stessi smart contract, non è possibile inviare direttamente token a uno smart contract chiamando anche una delle sue funzioni.

Invece, lo standard ERC20 consente agli smart contract di trasferire token per conto degli utenti, con l’apposita funzione transferFrom (). Per fare ciò, l’utente deve consentire al smart contract di trasferire quei token per suo conto.

In questo modo, un utente può “depositare” i token in uno smart contract e, allo stesso tempo, lo smart contract può aggiornare il suo stato per riflettere il deposito. Al contrario, se vengono inviati solo token ERC20 al contratto, il contratto non può aggiornare il suo stato (ad esempio per accreditare il deposito sul tuo account).

Ad esempio, se si vuole fare uno scambio su Uniswap di USDS con ETH, prima è necessario consentire allo smart contract di prendere gli USDC necessari per lo scambio dal proprio wallet. Quindi viene chiamata una funzione di smart contract sul contratto di Uniswap in cui viene specificato quanti USDC si vogliono depositare. Il contratto di Uniswap preleva quindi esattamente quell’importo dal portafoglio utilizzando la funzione transferFrom () e accredita la quantità equivalente di ETH.

Se non si controllano queste autorizzazioni, le cose possono andare male, molto male. Un hacker che trova una vulnerabilità nello smart contract può potenzialmente svuotare il wallet degli utenti che hanno autorizzato il prelievo. La soluzione più intelligente sarebbe approvare solo l’importo esatto che si intende spendere. Tuttavia, molte piattaforme costringono l’utente a fare un’approvazione infinita, esponendo il wallet ai vettori di attacco.

Come proteggere il proprio wallet

Ci sono strumenti gratuiti (grazie agli sviluppatori di Ethereum) che permettono di controllare le autorizzazioni che il proprio wallet ha concesso ai vari smart contract, dando la possibilità di revocarle. Se esce la notizia che la piattaforma che si è utilizzato in precedenza è stata compromessa, è meglio andare immediatamente su questi portali per proteggere i propri fondi.

Gli utenti più smaliziati possono effetture la revoca direttamente dall’interfaccia di Etherscan, andando sull’indirizzo dello smart contract e interagendo con lo stesso. Ci sono anche dei portali che rendono l’operazione molto più semplice, tra questi citiamo Revoke per il network di Ethereum o allowance.beefy.finance per Binance Smart Chain (BSC).

C’è anche il portale UNREKT, che permette di verificare contemporaneamente le blockchain di Ethereum e BSC.

Una volta collegato il proprio wallet ad uno di questi portali a volte sono indicati chiaramente i protocolli ai quali sono state concesse le autorizzazioni, mentre a volte non è così chiaro in quanto è visibile solo l’indirizzo dello smart contract. Tuttavia, se non si hanno prestiti, depositi etc. in corso si possono revocare anche tutte le autorizzazioni.

revoke

Esempio di schermata di Revoke da un wallet con autorizzazioni a diversi protocolli di DeFi. In caso di exploit a Uniswap, Kyber, Yearn o Aave sia gli USDC che i USDT potrebbero essere drenati.

L’autorizzazione alla spesa sugli smart contract offre un’esperienza utente superiore perché l’utente non ha bisogno di approvare una nuova indennità ogni volta che desidera depositare token. Impostando un’indennità illimitata, l’utente deve solo approvarla una volta e non ripetere il processo per i depositi successivi.

Tuttavia, questa configurazione presenta notevoli inconvenienti. Gli smart contract possono avere dei bug e gli hacker possono trovare i relativi exploit anche in progetti consolidati. E dando a queste piattaforme un’indennità illimitata, non solo si espongono i propri fondi depositati a questi rischi, ma anche i token che erroneamente si pensa di tenere “al sicuro” nel proprio wallet.

blogposts