Un instrument pentru detectarea contractelor inteligente metamorfice PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Un instrument pentru detectarea contractelor inteligente metamorfice

O ipoteză critică de securitate Ethereum este că codul de contract inteligent este imuabil și, prin urmare, nu poate fi schimbat odată ce este implementat pe blockchain. În practică, unele contracte inteligente poate să schimbare – chiar și după ce au fost implementate. Cu câteva trucuri inteligente, puteți crea contracte inteligente metamorfice care „metamorfoză” în altceva – și înțelegând ceea ce le face posibile, le puteți detecta.

Contractele inteligente metamorfice sunt modificabile, ceea ce înseamnă că dezvoltatorii pot schimba codul din interiorul lor. Aceste contracte inteligente reprezintă un risc serios pentru utilizatorii web3 care își pun încrederea în codul pe care se așteaptă să îl ruleze cu o consistență absolută, mai ales că actorii răi pot exploata această capacitate de schimbare a formei. Imaginați-vă un atacator care folosește tehnica pentru a „copi” oamenii care miză jetoane într-un contract inteligent despre care nu își dau seama că este metamorfic. Atacurile bazate pe această premisă și pe alte premise similare ar putea echipa escrocii să pradă oameni și, în general, să submineze încrederea în promisiunea deplină a sistemelor descentralizate.

Pentru a analiza dacă un contract inteligent conține proprietăți metamorfice, Am construit un simplu Detector de contract metamorfic (inspirat și bazat pe lucrarea originală a lui Jason sculptor, 0 vârstă, și alţii). Oricine poate folosi instrumentul pentru a verifica dacă un anumit contract prezintă semnale roșii care ar putea indica potențialul de metamorfism. Metoda nu este sigură: doar pentru că un contract inteligent arată un steag, nu înseamnă că este neapărat metamorfic; și doar pentru că nu este, nu înseamnă că este sigur. Verificatorul oferă doar o evaluare inițială rapidă a unui contract ar putea fi metamorfic pe baza unor indicatori posibili. 

Utilizatorii Web3 ar trebui să se familiarizeze cu amenințările reprezentate de contractele metamorfice, astfel încât să poată urmări și evita posibilele atacuri. Portofelele și indexatoarele blockchain pot ajuta avertizând utilizatorii înainte de a interacționa cu un contract inteligent care poate conține proprietăți metamorfice. Acest instrument este menit să ajute atât la educarea oamenilor despre această potențială amenințare... cât și la apărarea împotriva ei.

Detectarea contractelor inteligente metamorfice

Detector de contract metamorfic Am construit analize șase proprietăți care pot indica dacă un contract inteligent este metamorfic.

    1. A fost folosit cod metamorfic cunoscut pentru implementarea contractului? Dacă codul octet metamorfic cunoscut – codul de nivel inferior, care poate fi citit de mașina virtuală, în care contractele inteligente Ethereum, scrise de obicei în Solidity, se transformă după compilare – apare într-o tranzacție pentru implementarea unui anumit contract inteligent, acesta este un semnal roșu major. În secțiunile care urmează, vom discuta despre un astfel de exemplu de bytecode metamorfic dezvoltat de 0age. Un avertisment important: există potențial nenumărate variații ale codului de octet metamorfic, ceea ce face dificilă detectarea tuturor varietăților. Scanând, totuși, pentru cazuri bine-cunoscute, detectorul elimină fructele care nu se agățat pentru atacatorii care doar copiază și lipesc exemplele existente.
    2. Se poate autodistruge codul contractului inteligent? Pentru a înlocui codul dintr-un contract – un pas cheie în crearea unui contract metamorfic – un dezvoltator trebuie mai întâi să ștergă codul preexistent. Singura modalitate de a face acest lucru este folosind Cod operațional AUTODESTRUCTARE, o comandă care face exact ceea ce sună – șterge tot codul și stocarea la o anumită adresă de contract. Prezența unui cod care se autodistruge într-un contract nu dovedește că acesta este metamorfic; cu toate acestea, oferă un indiciu că contractul ar putea fii metamorfic și merită să știi, oricum, dacă contractele pe care te bazezi se pot declanșa singure.
    3. Contractul inteligent apelează în cod din altă parte? În cazul în care contractul inteligent în cauză nu se poate autodistruge în mod direct, este posibil să se poată șterge în continuare folosind Cod operațional DELEGATECALL. Acest opcode permite unui contract inteligent să încarce și să execute în mod dinamic codul care se află în interiorul unui alt contract inteligent. Chiar dacă contractul inteligent nu conține codul operațional SELFDESTRUCT, poate folosi DELEGATECALL pentru a încărca codul care se autodistruge din altă parte. Deși funcționalitatea DELEGATECALL nu indică în mod direct dacă un contract inteligent este metamorfic, este un posibil indiciu – și o potențială problemă de securitate – care merită remarcat. Fiți avertizat că acest indicator are potențialul de a genera multe fals pozitive. 
    4. Un alt contract a implementat acest contract? Contractele metamorfice pot fi implementate afară prin alte contracte inteligente. Acest lucru se datorează faptului că contractele metamorfice sunt activate de un alt opcode, utilizabil doar de alte contracte inteligente, numite CREATE2. (Vom discuta CREATE2 – cum funcționează și de ce contează – mai multe într-o secțiune ulterioară.) Această trăsătură este unul dintre cei mai puțin vizibili indicatori ai posibilului metamorfism; este o condiţie prealabilă necesară, dar insuficientă. Scanarea pentru această trăsătură este probabil să aducă multe fals pozitive – dar este o informație valoroasă de știut, deoarece poate ridica suspiciuni și poate oferi un motiv pentru a analiza mai mult un contract, mai ales dacă contractul inteligent conține codul operațional descris în continuare.
    5. Contractul de implementare conține opcode-ul CREATE2? După cum sa menționat mai sus, implementarea prin CREATE2 este o precondiție esențială pentru metamorfism. Dacă un contract de implementare conține codul operațional CREATE2, aceasta poate indica faptul că a folosit CREATE2 pentru a implementa contractul în cauză. Dacă implementatorul a folosit într-adevăr CREATE2 pentru a implementa respectivul contract, deși asta nu înseamnă că contractul este neapărat metamorfic, înseamnă că ar putea fii metamorfic și poate fi înțelept să procedezi cu prudență și să investighezi în continuare. Din nou, atenție la fals pozitive: CREATE2 are destule utilizări legitime, inclusiv întărirea Soluții de scalare „Layer 2”. și facilitează crearea de portofele inteligente cu contracte care pot îmbunătăți web3 integrarea utilizatorului și opțiunile cheie de recuperare.
    6. S-a schimbat codul? Acesta este cel mai evident spun, dar va apărea numai după ce un contract metamorfic s-a transformat deja. Dacă codul hash al contractului inteligent – ​​un identificator unic, criptografic – este diferit de când contractul a fost implementat inițial, atunci este probabil că codul a fost eliminat, înlocuit sau modificat. Dacă hashe-urile nu se mai potrivesc, atunci ceva despre cod s-a schimbat și contractul ar putea fi metamorfic. Acest steag este cel mai sigur indicator al metamorfismului, dar nu va ajuta să prezică sau să prevină transformarea, deoarece verifică doar dacă sa întâmplat deja.

În plus față de construirea unui instrument simplu de linie de comandă pentru Detectorul de contracte metamorfice, am construit câteva exemple de contracte inteligente care demonstrează un scenariu de înșelătorie a contractului metamorfic, pe care îl descriu în secțiunea următoare. Tot codul este disponibil în aceasta GitHub depozit

Cum poate un actor rău intenționat să folosească contracte metamorfice pentru a fura fondurile oamenilor

Iată cum ar putea cineva să folosească un contract inteligent metamorfic ca parte a unei escrocherii. 

Prima este faza de configurare. Atacatorul desfășoară un contract inteligent la o anumită adresă din blockchain folosind două instrumente: bytecode metamorfic și opcode-ul CREATE2. (Vom extinde aceste două concepte mai târziu.) Codul de octet metamorfic face apoi ceea ce sugerează numele său și „se transformă”. Aici, se transformă într-un contract de miza unde utilizatorii pot miza jetoane ERC-20. (Din nou, vom discuta detaliile acestui truc de morphing mai târziu. Promit!)

Urmează momeala și comutatorul. Utilizatorii care nu bănuiesc își pun jetoanele în acest contract, atrași de posibilitatea de a câștiga un randament sau alte avantaje. Atacatorul șterge apoi tot codul de miză și „starea” – stocare sau memorie blockchain – la această adresă de contract inteligent folosind Cod operațional AUTODESTRUCTARE discutată în secțiunea anterioară. (Trebuie remarcat faptul că tokenurile – care există ca parte a unui contract ERC-20 separat – persistă, neafectate de contractul autodistrus.)

În cele din urmă, tragerea covorului. Atacatorul reutiliza același bytecode metamorfic folosit în faza de configurare pentru a „redistribui” un nou contract. Acest nou contract se desfășoară la aceeași adresă eliberată recent de contractul de autodistrugere. De data aceasta, totuși, bytecode-ul „se transformă” (din nou, vom explica mai târziu cum) într-un contract rău intenționat care poate fura toate jetoanele mizate la adresa contractului. Înșelătorie completă. 

Riscurile pe care le prezintă contractele inteligente metamorfice sunt acum clar evidente. Dar s-ar putea să vă întrebați, cum funcționează de fapt acest truc de metamorfism? Pentru a înțelege asta, trebuie să sondați mai profund, la nivel de bytecode. 

Cum CREATE2 deschide posibilitatea metamorfismului 

CREATE2 este o actualizare a codului operațional, introdus la Ethereum în februarie 2019, aceasta oferă o nouă modalitate de implementare a contractelor inteligente. 

CREATE2 oferă dezvoltatorilor mai mult control asupra implementării contractelor lor inteligente decât aveau anterior. Opcode-ul original CREATE face dificil pentru dezvoltatori să controleze adresa de destinație pentru un contract inteligent care urmează să fie implementat. Cu CREATE2, oamenii pot controla și știe adresa unui anumit contract inteligent în avans, înainte de a-l implementa efectiv în blockchain. Această preștiință – plus câteva trucuri inteligente – este ceea ce le permite oamenilor să creeze contracte inteligente metamorfice. 

Cum poate CREATE2 prezice viitorul? Calculul opcode-ului este determinist: atâta timp cât intrările nu se schimbă, adresa determinată de CREATE2 nu se va modifica. (Chiar și cea mai mică schimbare va face ca implementarea să aibă loc în altă parte.)

Mai granular, CREATE2 este o funcție care combină și hash împreună câteva elemente. În primul rând, încorporează adresa deployerului (sau expeditorului): contractul inteligent inițiator care acționează ca părinte pentru cel care urmează să fie creat. Apoi, adaugă un număr arbitrar furnizat de expeditor (sau „sare”), care permite dezvoltatorului să implementeze același cod la adrese diferite (prin schimbarea sarii) și previne suprascrierea contractelor identice existente. În cele din urmă, folosește hash-ul keccak256 al unui bytecode de inițializare a contractului inteligent („init”), care este sămânța care se transformă într-un nou contract inteligent. Această combinație hash-together determină o adresă Ethereum și apoi implementează bytecode dat la acea adresă. Atata timp cat bytecode-ul rămâne exact același, CREATE2 va implementa întotdeauna bytecode-ul dat la aceeași adresă pe blockchain.

Iată cum arată formula CREATE2. (Notă: veți observa un alt element, un „0xFF”, în exemplul de mai jos. Aceasta este doar o constantă pe care o folosește CREATE2 prevenirea coliziunilor cu codul operațional CREATE precedent.)

Acum că avem o modalitate de a implementa codul la o adresă deterministă, cum este posibil Schimbare codul la aceeasi adresa? La început, acest lucru poate părea imposibil. Dacă doriți să implementați cod nou utilizând CREATE2, bytecode-ul trebuie să se schimbe și, prin urmare, CREATE2 se va implementa la o altă adresă. Dar ce se întâmplă dacă un dezvoltator a construit bytecode-ul în așa fel încât să se poată „transforma” în cod diferit atunci când CREATE2 implementează un contract inteligent?

Cum funcționează de fapt un contract metamorfic

Rețeta pentru a transforma un contract inteligent într-un contract metamorfic necesită trei contracte inteligente în total, fiecare jucând un rol unic.

Una dintre aceste componente necesare este Fabrica de Contract Metamorfic, creierul operației. Această „Fabrică” este responsabilă pentru implementarea Contractului Metamorfic, precum și a unui alt contract inteligent numit Contractul de Implementare, numit astfel deoarece codul său devine în cele din urmă implementat în Contractul Metamorfic. O coregrafie subtilă între aceste trei contracte are ca rezultat metamorfism, așa cum este prezentat în diagrama de mai jos.

Un instrument pentru detectarea contractelor inteligente metamorfice PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Să discutăm în detaliu fiecare pas, 1-7, pentru a lumina operațiunile de la locul de muncă.

Pasul 1: Un dezvoltator pune totul în mișcare

Un programator proiectează un cod de contract inteligent – ​​codul octet al contractului de implementare – care va ajunge în cele din urmă în Contractul metamorfic. Dezvoltatorul trimite acest cod către Metamorphic Contract Factory, un contract inteligent al cărui scop principal este implementarea altor contracte inteligente. Această acțiune pune în mișcare întregul proces de creare a Contractului Metamorfic.

Tot ce urmează este rezultatul acestui pas inițial. Intr-adevar, Pașii de la 1 la 6 au loc într-o tranzacție atomică pe blockchain, adică aproape toți deodată. Acești pași pot fi repeți din nou și din nou, la infinit, pentru a înlocui codul din interiorul Contractului Metamorfic și a-l menține în continuă transformare.

Pasul 2: Fabrica implementează Contractul de implementare

Primul contract pe care îl implementează Fabrica este Contractul de implementare, care conține codul de implementare. (Creativ, știm.) Gândiți-vă la Contractul de implementare ca la un andocare de încărcare, sau un punct de trecere, care conține un cod înainte de a fi expediat către destinația sa finală, care va fi, în acest caz, în interiorul Contractului metamorfic. 

Pasul 3: Adresa contractului de implementare a magazinelor din fabrică

După implementarea sa în blockchain, Contractul de implementare va exista în mod necesar la o anumită adresă blockchain. Fabrica stochează această adresă de contract în propria memorie (pentru a fi folosită ulterior, la Pasul 5). 

Pasul 4: Fabrica implementează Contractul metamorfic

Fabrica implementează Contractul metamorfic folosind CREATE2 și codul de octet metamorfic. Puteți găsi o prezentare tehnică și aprofundată a modului în care funcționează bytecode metamorfic aici, dar este suficient să spunem că atunci când se execută bytecode metamorfic, acesta copiază codul dintr-o altă locație din lanț - în acest caz, din contractul de implementare - în contractul metamorfic. Așa cum am vorbit în ultima secțiune, deoarece CREATE2 este determinist – atâta timp cât se utilizează același expeditor, sare și bytecode – atunci adresa Contractului metamorfic rămâne aceeași indiferent de câte ori se repetă acești pași.

Mai jos este un exemplu de cum arată bytecode metamorfic, din repo metamorfic până la 0 vârstă. Acesta este doar un exemplu de bytecode metamorfic - există potențial nenumărate variații, complicând foarte mult detectarea contractelor metamorfice.

Un instrument pentru detectarea contractelor inteligente metamorfice PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Pasul 5: interogări de cod de octet metamorfic Factory pentru adresa contractului de implementare

Codul octet metamorfic solicită Fabricii adresa contractului de implementare (cum este stocată în Pasul 3). Nu contează dacă adresa Contractului de implementare se schimbă atâta timp cât bytecode metamorfic care solicită adresa rămâne același. Într-adevăr, dacă dezvoltatorul implementează ulterior un nou Contract de implementare – cum ar fi unul rău intenționat conceput pentru a fura jetoane – acesta va fi neapărat implementat la o altă adresă blockchain, conform Pasului 2. Acest lucru nu are niciun impact asupra creării Contractului metamorfic.

Pasul 6: Codul contractului de implementare este copiat în contractul metamorfic

Folosind adresa blockchain învățată în Pasul 5, bytecode-ul metamorfic localizează codul în Contractul de Implementare și copiază acel cod în stocarea locală a Contractului Metamorfic. Așa se schimbă forma Contractului metamorfic: prin copierea codului din Contractul de implementare. 

Pasul 7: Clătiți și repetați

Un dezvoltator poate repeta pașii de la 1 la 6 din nou și din nou și poate înlocui codul din Contractul metamorfic cu orice dorește prin intermediul unui nou Contract de implementare. Tot ceea ce este necesar este să folosiți codul operațional SELFDESTRUCT – sau, mai înțelept, codurile operaționale DELEGATECALL care în cele din urmă au ca rezultat o AUTODESTRUCȚIE – pentru a elimina codul preexistent din Contractul metamorfic. Prin repetarea ciclului cu noul cod octet al Contractului de Implementare, Contractul Metamorfic va, ca prin magie, transformare!

Folosind această tehnică pentru a crea contracte metamorfice, un dezvoltator inteligent poate schimba constant terenul sub picioarele utilizatorilor web3. Luați în considerare, de exemplu, scenariul înșelătoriei din nou. Un dezvoltator ar putea implementa mai întâi contractul de implementare cu cod de staking de simboluri care, prin calea ocolită descrisă în grafic și elaborat în pașii de mai sus, ajunge în Contractul metamorfic. Escrocul ar putea ulterior să autodistrugă acest cod și să-l înlocuiască prin implementarea unui nou Contract de implementare care să conțină token-furat cod. 

Orice este implementat în Contractul de Implementare va ajunge în cele din urmă în Contractul Metamorfic. Aceasta este esența trucului. 

***

Contractele inteligente metamorfice rupe contractul social implicit web3 conform căruia ceea ce vezi este ceea ce primești. Similar cu modul în care jocul cu ochiuri folosește trei cupe în mișcare pentru a ascunde o minge, interacțiunea celor trei contracte în crearea unui contract metamorfic face dificilă urmărirea adevăratei funcție a contractului. Jocul shell este o comparație deosebit de potrivită, deoarece smecherii încrezători vor folosi adesea mâna și direcția greșită pentru a se asigura că câștigă. În versiunea web3, scriitorii de contracte metamorfici pot face în mod similar „mingea” – codul de implementare, adică – să dispară (a se citi: autodistrugere) și o pot înlocui cu orice le place.

Existența unor contracte metamorfice înseamnă că este posibil ca utilizatorii web3 să încheie contracte care se pot schimba după bunul plac – de aceea este atât de importantă înțelegere și apărare împotriva acestei amenințări. Detectorul meu de contract metamorfic oferă doar un prim pas către identificarea contractelor metamorfice prin delectarea mâinii pe care o folosesc. Există mai multe moduri în care detectorul ar putea fi îmbunătățit în viitor. De exemplu, verificând recursiv Fabrica (sau contractul de implementare) care a creat Contractul Metamorfic, se poate vedea dacă Fabrica este ea însăși metamorfică. Această caracteristică ar fi o completare utilă la o versiune actualizată 2 a detectorului.

Merită să repetăm ​​încă o dată: acest instrument Detector nu este sigur. Steagurile pe care le prinde nu sunt toate semne revelatoare ale potențialului metamorfic, dar oferă indicii. Identificarea acestor steaguri este doar începutul pentru o anchetă mai amănunțită. De aceea am extins Detectorul pentru a căuta semnale care ar putea genera cu ușurință false pozitive, cum ar fi prezența codurilor operaționale CREATE2 sau DELEGATECALL. Dacă aveți sugestii pentru îmbunătățirea instrumentului sau doriți să construiți sau să adăugați această lucrare inițială, contactați-mă la .

Analizați contractele inteligente pentru trăsături metamorfice folosind instrumentul Detector și vizitați GitHub repo pentru mai multe

Editor: Robert Hackett @rhhackett

***

Mulțumiri: Vreau să le mulțumesc și le mulțumesc lui Robert Hackett, Eddy Lazzarin, Sam Ragsdale, Riyaz Faizullabhoy, Noah Citron, Mason Hall și Daejun Park pentru feedback și sfaturi valoroase în realizarea acestei postări și instrumente. 

***

Părerile exprimate aici sunt cele ale personalului individual AH Capital Management, LLC („a16z”) citat și nu sunt punctele de vedere ale a16z sau ale afiliaților săi. Anumite informații conținute aici au fost obținute din surse terțe, inclusiv de la companii de portofoliu de fonduri administrate de a16z. Deși este luat din surse considerate a fi de încredere, a16z nu a verificat în mod independent astfel de informații și nu face nicio declarație cu privire la acuratețea durabilă a informațiilor sau adecvarea lor pentru o anumită situație. În plus, acest conținut poate include reclame de la terți; a16z nu a revizuit astfel de reclame și nu aprobă niciun conținut publicitar conținut în acestea.

Acest conținut este furnizat doar în scop informativ și nu ar trebui să fie bazat pe consiliere juridică, de afaceri, de investiții sau fiscală. Ar trebui să vă consultați propriii consilieri cu privire la aceste aspecte. Referințele la orice titluri de valoare sau active digitale au doar scop ilustrativ și nu constituie o recomandare de investiții sau o ofertă de a oferi servicii de consiliere în materie de investiții. În plus, acest conținut nu este îndreptat și nici nu este destinat utilizării de către niciun investitor sau potențial investitor și nu poate fi bazat în nicio circumstanță atunci când se ia o decizie de a investi într-un fond administrat de a16z. (Ofertă de a investi într-un fond a16z va fi făcută numai prin memoriul de plasament privat, acordul de subscriere și alte documente relevante ale oricărui astfel de fond și trebuie citită în întregime.) Orice investiții sau companii de portofoliu menționate, la care se face referire sau descrise nu sunt reprezentative pentru toate investițiile în vehicule administrate de a16z și nu poate exista nicio asigurare că investițiile vor fi profitabile sau că alte investiții realizate în viitor vor avea caracteristici sau rezultate similare. O listă a investițiilor realizate de fondurile gestionate de Andreessen Horowitz (excluzând investițiile pentru care emitentul nu a oferit permisiunea ca a16z să dezvăluie public, precum și investițiile neanunțate în active digitale tranzacționate public) este disponibilă la https://a16z.com/investments /.

Diagramele și graficele furnizate în cadrul sunt doar în scop informativ și nu trebuie să se bazeze pe acestea atunci când se ia vreo decizie de investiție. Performanța trecută nu indică rezultatele viitoare. Conținutul vorbește doar de la data indicată. Orice previziuni, estimări, prognoze, obiective, perspective și/sau opinii exprimate în aceste materiale pot fi modificate fără notificare și pot diferi sau pot fi contrare opiniilor exprimate de alții. Vă rugăm să consultați https://a16z.com/disclosures pentru informații suplimentare importante.

Timestamp-ul:

Mai mult de la Andreessen Horowitz