Uno strumento per rilevare contratti intelligenti metamorfici PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Uno strumento per il rilevamento di contratti intelligenti metamorfici

Un presupposto fondamentale per la sicurezza di Ethereum è che il codice del contratto intelligente è immutabile e quindi non può essere modificato una volta distribuito sulla blockchain. In pratica, alcuni smart contract può cambiamento, anche dopo che sono stati distribuiti. Con pochi astuti accorgimenti, puoi creare contratti intelligenti metamorfici che “metamorfosi” in qualcos'altro – e comprendendo cosa li rende possibili, puoi individuarli.

I contratti intelligenti metamorfici sono mutevoli, il che significa che gli sviluppatori possono modificare il codice al loro interno. Questi contratti intelligenti rappresentano un serio rischio per gli utenti di web3 che ripongono la loro fiducia nel codice che si aspettano venga eseguito con assoluta coerenza, soprattutto perché i malintenzionati possono sfruttare questa capacità di mutaforma. Immagina un aggressore che usa la tecnica per "coprire" le persone che stanno scommettendo token in uno smart contract di cui non si rendono conto è metamorfico. Attacchi basati su questa e altre premesse simili potrebbero fornire ai truffatori la possibilità di depredare le persone e in generale minare la fiducia nella piena promessa di sistemi decentralizzati.

Per analizzare se uno smart contract contiene proprietà metamorfiche, Ho costruito un semplice Rilevatore di contratti metamorfici (ispirato e basato sul lavoro originale di Jason Carver, 0etàe altri). Chiunque può utilizzare lo strumento per verificare se un determinato contratto presenta segnali di pericolo che potrebbero indicare il potenziale di metamorfismo. Il metodo non è infallibile: solo perché uno smart contract mostra una bandiera, non significa che sia necessariamente metamorfico; e solo perché non è così, non significa che sia sicuro. Il controllore offre semplicemente una rapida valutazione iniziale che un contratto forza essere metamorfici sulla base di possibili indicatori. 

Gli utenti di Web3 dovrebbero familiarizzare con le minacce poste dai contratti metamorfici in modo da poter prestare attenzione ed evitare possibili attacchi. I portafogli e gli indicizzatori blockchain possono aiutare avvisando gli utenti prima che interagiscano con uno smart contract che potrebbe contenere proprietà metamorfiche. Questo strumento ha lo scopo di aiutare sia a educare le persone su questa potenziale minaccia... sia a difendersi da essa.

Rilevamento di contratti intelligenti metamorfici

I Rilevatore di contratti metamorfici Ho costruito analizza sei proprietà che possono indicare se uno smart contract è metamorfico.

    1. È stato utilizzato codice metamorfico noto per distribuire il contratto? Se il bytecode metamorfico noto, il codice leggibile dalla macchina virtuale di livello inferiore in cui gli smart contract di Ethereum, in genere scritti in Solidity, si trasformano dopo essere stati compilati, viene visualizzato in una transazione per l'implementazione di un determinato smart contract, questa è una grande bandiera rossa. Nelle sezioni che seguono, discuteremo uno di questi esempi di bytecode metamorfico sviluppato da 0age. Un avvertimento importante: ci sono potenzialmente innumerevoli variazioni del bytecode metamorfico, il che rende difficile il rilevamento di tutte le varietà. Eseguendo la scansione di istanze note, tuttavia, il rilevatore elimina la frutta a basso contenuto per gli aggressori che si limitano a copiare e incollare esempi esistenti.
    2. Il codice del contratto intelligente può autodistruggersi? Per sostituire il codice in un contratto, un passaggio chiave nella creazione di un contratto metamorfico, uno sviluppatore deve prima eliminare il codice preesistente. L'unico modo per farlo è usare il AUTODISTRUZIONE codice operativo, un comando che fa esattamente quello che sembra: cancella tutto il codice e l'archiviazione in un determinato indirizzo di contratto. La presenza di codice autodistruttivo in un contratto non prova che sia metamorfico; tuttavia, offre un indizio che il contratto forza essere metamorfico e vale la pena sapere, comunque, se i contratti su cui ti affidi possono distruggersi.
    3. Lo smart contract chiama in codice da altrove? Se lo smart contract in questione non può autodistruggersi direttamente, potrebbe comunque essere in grado di cancellarsi utilizzando il DELEGATECALL codice operativo. Questo codice operativo consente a uno smart contract di caricare ed eseguire dinamicamente il codice che risiede all'interno di un altro smart contract. Anche se lo smart contract non contiene il codice operativo SELFDESTRUCT, può utilizzare DELEGATECALL per caricare codice autodistruggente da qualche altra parte. Sebbene la funzionalità DELEGATECALL non indichi direttamente se uno smart contract è metamorfico, è un possibile indizio e un potenziale problema di sicurezza che vale la pena notare. Tieni presente che questo indicatore ha il potenziale per generare molti falsi positivi. 
    4. Un altro contratto ha implementato questo contratto? È possibile distribuire contratti metamorfici esclusivamente da altri contratti intelligenti. Questo perché i contratti metamorfici sono abilitati da un altro codice operativo, utilizzabile solo da altri contratti intelligenti, chiamato CREATE2. (Discuteremo CREATE2 – come funziona e perché è importante – più in una sezione successiva.) Questo tratto è uno degli indicatori meno evidenti di un possibile metamorfismo; è una precondizione necessaria ma insufficiente. È probabile che la scansione di questo tratto sollevi molti falsi positivi, ma è un'informazione preziosa da sapere in quanto può sollevare sospetti e fornire un motivo per esaminare ulteriormente un contratto, soprattutto se lo smart contract contiene l'opcode descritto di seguito.
    5. Il contratto del distributore contiene il codice operativo CREATE2? Come accennato in precedenza, la distribuzione tramite CREATE2 è una precondizione essenziale per il metamorfismo. Se un contratto di distribuzione contiene il codice operativo CREATE2, ciò potrebbe indicare che ha utilizzato CREATE2 per distribuire il contratto in questione. Se il distributore ha effettivamente utilizzato CREATE2 per distribuire detto contratto, anche se ciò non significa che il contratto sia necessariamente metamorfico, significa che forza essere metamorfico e potrebbe essere saggio procedere con cautela e indagare ulteriormente. Ancora una volta, attenzione ai falsi positivi: CREA2 ha un sacco di usi legittimi, compreso il rafforzamento Soluzioni di ridimensionamento "Layer 2". e semplificando la creazione di portafogli smart contract in grado di migliorare web3 inserimento degli utenti e opzioni di ripristino chiave.
    6. Il codice è cambiato? Questo è il segnale più ovvio, ma apparirà solo dopo che un contratto metamorfico si è già trasformato. Se l'hash del codice del contratto intelligente, un identificatore crittografico univoco, è diverso da quello che era quando il contratto è stato inizialmente distribuito, è probabile che il codice sia stato rimosso, sostituito o alterato. Se gli hash non corrispondono più, allora qualcosa nel codice è cambiato e il contratto potrebbe essere metamorfico. Questa bandiera è l'indicatore più sicuro del metamorfismo, ma non aiuterà a prevedere o prevenire il morphing poiché controlla solo che sia già accaduto.

Oltre a creare un semplice strumento da riga di comando per Metamorphic Contract Detector, ho creato alcuni contratti intelligenti di esempio che dimostrano uno scenario di staking di contratti metamorfici di truffa, che descrivo nella sezione successiva. Tutto il codice è disponibile in questo Repository GitHub

Come un attore malintenzionato può utilizzare contratti metamorfici per rubare i fondi delle persone

Ecco come qualcuno potrebbe utilizzare uno smart contract metamorfico come parte di una truffa. 

La prima è la fase di configurazione. L'attaccante implementa uno smart contract a un indirizzo specifico sulla blockchain utilizzando due strumenti: il bytecode metamorfico e l'opcode CREATE2. (Analizzeremo entrambi questi concetti in seguito.) Il bytecode metamorfico fa quindi ciò che suggerisce il nome e "si trasforma". Qui si trasforma in a contratto di picchettamento dove gli utenti possono mettere in staking i token ERC-20. (Ancora una volta, discuteremo i dettagli di questo trucco di morphing più avanti. Prometto!)

Poi arriva l'esca e l'interruttore. Utenti ignari scommettono i loro token in questo contratto, attirati dalla possibilità di guadagnare un rendimento o qualche altro vantaggio. L'attaccante quindi elimina tutto il codice di staking e lo "stato" - archiviazione blockchain o memoria - a questo indirizzo di smart contract utilizzando il AUTODISTRUZIONE codice operativo discusso nella sezione precedente. (Va notato che i token - che esistono come parte di un contratto ERC-20 separato - persistono, inalterati dal contratto autodistrutto.)

Infine, il rug-pull. L'attaccante riutilizza lo stesso bytecode metamorfico utilizzato nella fase di configurazione per "ridistribuire" un nuovo contratto. Questo nuovo contratto viene distribuito allo stesso indirizzo recentemente lasciato libero dal contratto autodistruttivo. Questa volta, tuttavia, il bytecode si "trasforma" (di nuovo, spiegheremo come più avanti) in un contratto dannoso che può rubare tutti i token puntati all'indirizzo del contratto. Truffa completa. 

I rischi che pongono i contratti intelligenti metamorfici sono ormai chiaramente evidenti. Ma potresti ancora chiederti, come funziona effettivamente questo trucco del metamorfismo? Per capirlo, devi sondare più a fondo, a livello di bytecode. 

Come CREATE2 apre la possibilità del metamorfismo 

CREA2 è un aggiornamento del codice operativo, introdotto in Ethereum a febbraio 2019, offre un nuovo modo di implementare contratti intelligenti. 

CREATE2 offre agli sviluppatori un maggiore controllo sull'implementazione dei loro contratti intelligenti rispetto a quanto avevano in precedenza. Il codice operativo CREATE originale rende difficile per gli sviluppatori controllare l'indirizzo di destinazione per uno smart contract da distribuire. Con CREATE2, le persone possono controllare e conoscere l'indirizzo di un particolare contratto intelligente in anticipo, prima di implementarlo effettivamente sulla blockchain. Questa preconoscenza, oltre ad alcuni trucchi intelligenti, è ciò che consente alle persone di creare contratti intelligenti metamorfici. 

In che modo CREATE2 può prevedere il futuro? Il calcolo dell'opcode è deterministico: finché gli input non cambiano, l'indirizzo determinato da CREATE2 non cambierà. (Anche il più piccolo cambiamento farà sì che la distribuzione avvenga da qualche altra parte.)

Più in dettaglio, CREATE2 è una funzione che combina e esegue l'hashing di alcuni elementi. In primo luogo, incorpora l'indirizzo del deployer (o mittente): lo smart contract iniziale che funge da genitore per quello da creare. Successivamente, aggiunge un numero arbitrario fornito dal mittente (o "sale"), che consente allo sviluppatore di distribuire lo stesso codice a indirizzi diversi (modificando il sale) e impedisce la sovrascrittura di contratti identici esistenti. Infine, utilizza l'hash keccak256 di alcuni bytecode di inizializzazione di contratti intelligenti ("init"), che è il seme che si trasforma in un nuovo contratto intelligente. Questa combinazione di hash determina un indirizzo Ethereum e quindi distribuisce il bytecode specificato a quell'indirizzo. Fino a quando il bytecode rimane esattamente lo stesso, CREATE2 distribuirà sempre il bytecode fornito allo stesso indirizzo sulla blockchain.

Ecco come appare la formula CREATE2. (Nota: noterai un altro elemento, un "0xFF", nell'esempio seguente. Questa è solo una costante che CREATE2 usa prevenire le collisioni con il codice operativo CREATE precedente.)

Ora che abbiamo un modo per distribuire il codice a un indirizzo deterministico, come è possibile il cambiamento il codice allo stesso indirizzo? All'inizio, questo può sembrare impossibile. Se si desidera distribuire nuovo codice utilizzando CREATE2, il bytecode deve cambiare e, pertanto, CREATE2 verrà distribuito a un indirizzo diverso. Ma cosa accadrebbe se uno sviluppatore costruisse il bytecode in modo tale che potesse "trasformarsi" in codice diverso quando CREATE2 distribuisce uno smart contract?

Come funziona effettivamente un contratto metamorfico

La ricetta per trasformare uno smart contract in un contratto metamorfico prevede tre smart contract in totale, ognuno dei quali svolge un ruolo unico.

Uno di questi componenti necessari è la Metamorphic Contract Factory, il cervello dell'operazione. Questa "fabbrica" ​​è responsabile della distribuzione del contratto metamorfico e di un altro contratto intelligente chiamato contratto di attuazione, così chiamato perché il suo codice alla fine viene implementato all'interno del contratto metamorfico. Una sottile coreografia tra questi tre contratti si traduce in metamorfismo, come illustrato nel diagramma seguente.

Uno strumento per rilevare contratti intelligenti metamorfici PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Discutiamo ogni passaggio, 1-7, in dettaglio per illuminare le operazioni al lavoro.

Passaggio 1: uno sviluppatore mette tutto in moto

Un programmatore progetta un codice di contratto intelligente - il bytecode del contratto di implementazione - che alla fine finirà nel contratto metamorfico. Lo sviluppatore invia questo codice alla Metamorphic Contract Factory, uno smart contract il cui scopo principale è distribuire altri smart contract. Questa azione mette in moto l'intero processo di creazione del contratto metamorfico.

Tutto ciò che segue è il risultato di questo primo passo. Infatti, I passaggi da 1 a 6 si verificano in una transazione atomica sulla blockchain, ovvero quasi tutti in una volta. Questi passaggi possono essere ripetuti più e più volte, all'infinito, per sostituire il codice all'interno del contratto metamorfico e mantenerlo in continuo mutamento.

Passaggio 2: la fabbrica distribuisce il contratto di implementazione

Il primo contratto che la fabbrica distribuisce è il contratto di implementazione, che contiene il codice di implementazione. (Creativo, lo sappiamo.) Pensa al contratto di implementazione come a una banchina di carico, o waypoint, che contiene del codice prima di essere spedito alla sua destinazione finale, che sarà, in questo caso, all'interno del contratto metamorfico. 

Passaggio 3: la fabbrica memorizza l'indirizzo del contratto di implementazione

Dopo la sua distribuzione alla blockchain, il contratto di implementazione esisterà necessariamente in un indirizzo blockchain. La Fabbrica memorizza questo indirizzo di contratto nella propria memoria (da utilizzare successivamente, al punto 5). 

Passaggio 4: la fabbrica distribuisce il contratto metamorfico

La fabbrica distribuisce il contratto metamorfico utilizzando CREATE2 e il bytecode metamorfico. È possibile trovare una procedura dettagliata tecnica e approfondita su come funziona il bytecode metamorfico qui, ma è sufficiente dire che quando il bytecode metamorfico viene eseguito, copia il codice da qualche altra posizione sulla catena, in questo caso, dal contratto di attuazione, nel contratto metamorfico. Come abbiamo detto nell'ultima sezione, poiché CREATE2 è deterministico, purché vengano utilizzati lo stesso mittente, sale e bytecode, l'indirizzo del contratto metamorfico rimane lo stesso, indipendentemente da quante volte vengono ripetuti questi passaggi.

Di seguito è riportato un esempio di come appare il bytecode metamorfico, da repository metamorfico di 0 anni. Questo è solo un esempio di bytecode metamorfico: esistono potenzialmente innumerevoli variazioni, che complicano enormemente il rilevamento dei contratti metamorfici.

Uno strumento per rilevare contratti intelligenti metamorfici PlatoBlockchain Data Intelligence. Ricerca verticale. Ai.

Passaggio 5: il bytecode metamorfico interroga la fabbrica per l'implementazione dell'indirizzo del contratto

Il bytecode metamorfico richiede alla fabbrica l'indirizzo del contratto di attuazione (come memorizzato nel passaggio 3). Non importa se l'indirizzo del Contratto di Esecuzione cambia purché il bytecode metamorfico che richiede l'indirizzo rimanga lo stesso. In effetti, se lo sviluppatore distribuisce in seguito un nuovo contratto di implementazione, ad esempio uno dannoso progettato per rubare token, verrà necessariamente distribuito a un indirizzo blockchain diverso, secondo il passaggio 2. Ciò non ha alcun impatto sulla creazione del contratto metamorfico.

Passo 6: Il codice del contratto di implementazione viene copiato nel contratto metamorfico

Utilizzando l'indirizzo blockchain appreso nel passaggio 5, il bytecode metamorfico individua il codice nel contratto di implementazione e copia quel codice nella memoria locale del contratto metamorfico. Ecco come cambia forma il contratto metamorfico: copiando il codice dal contratto di attuazione. 

Passaggio 7: risciacquare e ripetere

Uno sviluppatore può ripetere i passaggi da 1 a 6 più e più volte e sostituire il codice nel contratto metamorfico con qualsiasi cosa desideri tramite un nuovo contratto di implementazione. Tutto ciò che serve è utilizzare il codice operativo SELFDESTRUCT – o, più subdolamente, codici operativi DELEGATECALL che alla fine si traducono in un SELFDESTRUCT – per rimuovere il codice preesistente nel contratto metamorfico. Ripetendo il ciclo con il nuovo bytecode del contratto di attuazione, il contratto metamorfico, come per magia, metamorfosi!

Utilizzando questa tecnica per creare contratti metamorfici, uno sviluppatore intelligente può costantemente spostare il terreno sotto i piedi degli utenti di web3. Si consideri, ad esempio, di nuovo lo scenario della truffa. Uno sviluppatore potrebbe prima distribuire il contratto di implementazione con codice di token staking che, attraverso il percorso tortuoso illustrato nella grafica ed elaborato nei passaggi precedenti, finisce nel contratto metamorfico. Il truffatore potrebbe in seguito autodistruggere questo codice e sostituirlo distribuendo un nuovo contratto di implementazione contenente token-furto codice. 

Tutto ciò che viene distribuito nel contratto di attuazione finirà alla fine nel contratto metamorfico. Questa è l'essenza del trucco. 

***

I contratti intelligenti metamorfici rompono il contratto sociale implicito di web3 secondo cui ciò che vedi è ciò che ottieni. Simile al modo in cui il gioco a conchiglia utilizza tre coppe mobili per nascondere una palla, l'interazione dei tre contratti nella creazione di un contratto metamorfico rende difficile seguire la vera funzione del contratto. Il gioco delle conchiglie è un paragone particolarmente azzeccato perché i truffatori della fiducia spesso usano destrezza di mano e depistaggio per assicurarsi di vincere. Nella versione web3, gli autori di contratti metamorfici possono allo stesso modo far svanire la “palla” – il codice di implementazione, cioè – (leggi: autodistruzione), e possono sostituirlo con quello che vogliono.

L'esistenza di contratti metamorfici significa che è possibile per gli utenti web3 stipulare contratti che possono cambiare a piacimento: ecco perché questa minaccia è così importante da comprendere e da cui difendersi. Il mio rilevatore di contratti metamorfici offre solo un primo passo verso l'identificazione dei contratti metamorfici con il gioco di prestigio che impiegano. Ci sono diversi modi in cui il rilevatore potrebbe essere migliorato in futuro. Ad esempio, controllando ricorsivamente la fabbrica (o il contratto di distribuzione) che ha creato il contratto metamorfico, si potrebbe vedere se la fabbrica stessa è metamorfica. Questa funzione sarebbe un'utile aggiunta a una versione aggiornata 2 del Detector.

Vale la pena ribadirlo ancora una volta: questo strumento Detector non è infallibile. Le bandiere che cattura non sono tutti segni rivelatori di potenziale metamorfico, ma offrono indizi. L'identificazione di questi flag è solo l'inizio di un'indagine più approfondita. Ecco perché abbiamo ampliato il Detector per cercare i flag che potrebbero facilmente generare falsi positivi, come la presenza di codici operativi CREATE2 o DELEGATECALL. Se hai suggerimenti per migliorare lo strumento o desideri ampliare o aggiungere a questo lavoro iniziale, contattami all'indirizzo .

Analizza i contratti intelligenti per i tratti metamorfici utilizzando lo strumento Rilevatore e visitare il Repository GitHub per maggiori

Editore: Robert Hackett @rhhackett

***

Ringraziamenti: voglio fare un GRANDE ringraziamento e ringraziare Robert Hackett, Eddy Lazzarin, Sam Ragsdale, Riyaz Faizullabhoy, Noah Citron, Mason Hall e Daejun Park per i preziosi feedback e consigli nel dare vita a questo post e strumento. 

***

Le opinioni qui espresse sono quelle del personale di AH Capital Management, LLC ("a16z") citato e non sono le opinioni di a16z o delle sue affiliate. Alcune informazioni qui contenute sono state ottenute da fonti di terze parti, incluse società in portafoglio di fondi gestiti da a16z. Sebbene tratti da fonti ritenute affidabili, a16z non ha verificato in modo indipendente tali informazioni e non fornisce dichiarazioni sull'accuratezza duratura delle informazioni o sulla loro adeguatezza per una determinata situazione. Inoltre, questo contenuto può includere pubblicità di terze parti; a16z non ha esaminato tali annunci pubblicitari e non approva alcun contenuto pubblicitario in essi contenuto.

Questo contenuto viene fornito solo a scopo informativo e non deve essere considerato come consulenza legale, commerciale, di investimento o fiscale. Dovresti consultare i tuoi consulenti in merito a tali questioni. I riferimenti a qualsiasi titolo o risorsa digitale sono solo a scopo illustrativo e non costituiscono una raccomandazione di investimento o un'offerta per fornire servizi di consulenza in materia di investimenti. Inoltre, questo contenuto non è diretto né destinato all'uso da parte di investitori o potenziali investitori e non può in alcun caso essere invocato quando si decide di investire in qualsiasi fondo gestito da a16z. (Un'offerta per investire in un fondo a16z sarà fatta solo dal memorandum di collocamento privato, dal contratto di sottoscrizione e da altra documentazione pertinente di tale fondo e dovrebbe essere letta nella sua interezza.) Eventuali investimenti o società in portafoglio menzionati, citati o descritti non sono rappresentativi di tutti gli investimenti in veicoli gestiti da a16z, e non si può garantire che gli investimenti saranno redditizi o che altri investimenti effettuati in futuro avranno caratteristiche o risultati simili. Un elenco degli investimenti effettuati da fondi gestiti da Andreessen Horowitz (esclusi gli investimenti per i quali l'emittente non ha autorizzato a16z a divulgare pubblicamente e gli investimenti non annunciati in asset digitali quotati in borsa) è disponibile all'indirizzo https://a16z.com/investments /.

Grafici e grafici forniti all'interno sono esclusivamente a scopo informativo e non dovrebbero essere presi in considerazione quando si prende una decisione di investimento. I rendimenti passati non sono indicativi di risultati futuri. Il contenuto parla solo a partire dalla data indicata. Eventuali proiezioni, stime, previsioni, obiettivi, prospettive e/o opinioni espresse in questi materiali sono soggette a modifiche senza preavviso e possono differire o essere contrarie alle opinioni espresse da altri. Si prega di consultare https://a16z.com/disclosures per ulteriori informazioni importanti.

Timestamp:

Di più da Andreessen Horowitz