Orodje za odkrivanje metamorfnih pametnih pogodb PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Orodje za odkrivanje metamorfnih pametnih pogodb

Ključna varnostna predpostavka Ethereuma je, da je koda pametne pogodbe nespremenljiva in je zato ni mogoče spremeniti, ko je nameščena v verigi blokov. V praksi nekaj pametnih pogodb lahko spremenijo – tudi po tem, ko so bili nameščeni. Z nekaj pametnimi triki lahko ustvarite metamorfne pametne pogodbe, ki "metamorfoza” v nekaj drugega – in z razumevanjem, kaj jih omogoča, jih lahko odkrijete.

Metamorfne pametne pogodbe so spremenljive, kar pomeni, da lahko razvijalci spremenijo kodo v njih. Te pametne pogodbe predstavljajo resno tveganje za uporabnike web3, ki zaupajo kodi, za katero pričakujejo, da se bo izvajala s popolno doslednostjo, zlasti ker lahko slabi igralci izkoristijo to sposobnost spreminjanja oblike. Predstavljajte si napadalca, ki uporablja tehniko za »preprogo« ljudi, ki vlagajo žetone v pametno pogodbo, za katero se ne zavedajo, da je metamorfna. Napadi, ki temeljijo na tej in podobnih izhodiščih, bi lahko prevarante opremili za plen ljudi in na splošno spodkopali zaupanje v popolno obljubo decentraliziranih sistemov.

Za analizo, ali pametna pogodba vsebuje metamorfne lastnosti, Zgradil sem preprosto Detektor metamorfnih pogodb (navdihnjeno in nadgrajeno na izvirnem delu Jason carver, 0 starostin drugi). Vsakdo lahko uporabi orodje za preverjanje, ali dana pogodba kaže rdeče zastavice, ki bi lahko kazale na možnost metamorfizma. Metoda ni zanesljiva: samo zato, ker pametna pogodba prikazuje zastavico, ne pomeni, da je nujno metamorfna; in samo zato, ker ni, še ne pomeni, da je varno. Preverjevalnik ponuja le hitro prvo oceno pogodbe morda biti metamorfen glede na možne indikatorje. 

Uporabniki Web3 se morajo seznaniti z grožnjami, ki jih predstavljajo metamorfne pogodbe, da bodo lahko pozorni na morebitne napade in se jim izognili. Denarnice in indeksatorji blockchain lahko pomagajo tako, da opozorijo uporabnike, preden stopijo v interakcijo s pametno pogodbo, ki lahko vsebuje metamorfne lastnosti. To orodje naj bi pomagalo pri izobraževanju ljudi o tej potencialni grožnji ... in obrambi pred njo.

Odkrivanje metamorfnih pametnih pogodb

O Detektor metamorfnih pogodb Izdelal sem analize šestih lastnosti, ki lahko kažejo, ali je pametna pogodba metamorfna.

    1. Ali je bila za izvedbo pogodbe uporabljena znana metamorfna koda? Če se znana metamorfna bajtna koda – navidezna strojno berljiva koda nižje ravni, v katero se pametne pogodbe Ethereum, običajno napisane v Solidityju, spremenijo po prevedbi – prikaže v transakciji za uvedbo dane pametne pogodbe, je to velika rdeča zastavica. V naslednjih razdelkih bomo razpravljali o enem takem primeru metamorfne bajtne kode, ki jo je razvil 0age. Pomembno opozorilo: obstaja potencialno nešteto različic metamorfne bajtne kode, zaradi česar je težko zaznati vse različice. S skeniranjem za dobro znane primere pa detektor odpravi nizko viseče sadje za napadalce, ki zgolj kopirajo in lepijo obstoječe primere.
    2. Ali se lahko koda pametne pogodbe samouniči? Za zamenjavo kode v pogodbi – ključni korak pri ustvarjanju metamorfne pogodbe – mora razvijalec najprej izbrisati že obstoječo kodo. Edini način za to je uporaba koda SELFDESTRUCT, ukaz, ki naredi točno to, kar se sliši – izbriše vso kodo in shrambo na danem pogodbenem naslovu. Prisotnost samouničujoče kode v pogodbi ne dokazuje, da je metamorfna; vendarle ponuja namig, da pogodba morda biti metamorfen in vsekakor je vredno vedeti, ali se lahko pogodbe, na katere se zanašate, same od sebe uničijo.
    3. Ali pametna pogodba kliče kodo od drugod? Če se zadevna pametna pogodba ne more neposredno samouničiti, se bo morda vseeno lahko izbrisala z uporabo koda DELEGATECALL. Ta operacijska koda omogoča pametni pogodbi dinamično nalaganje in izvajanje kode, ki živi znotraj druge pametne pogodbe. Tudi če pametna pogodba ne vsebuje operacijske kode SELFDESTRUCT, lahko uporabi DELEGATECALL za nalaganje samouničujoče kode od nekje drugje. Čeprav funkcija DELEGATECALL ne nakazuje neposredno, ali je pametna pogodba metamorfna, je to možen namig – in morebitna varnostna težava –, ki jo je vredno omeniti. Upoštevajte, da lahko ta kazalnik povzroči številne lažno pozitivne rezultate. 
    4. Ali je druga pogodba uporabila to pogodbo? Metamorfne pogodbe je mogoče uporabiti samo z drugimi pametnimi pogodbami. To je zato, ker metamorfne pogodbe omogoča druga operacijska koda, ki jo lahko uporabljajo samo druge pametne pogodbe, imenovana CREATE2. (Razpravljali bomo o CREATE2 – kako deluje in zakaj je pomemben – več v kasnejšem razdelku.) Ta lastnost je eden najmanj očitnih indikatorjev možnega metamorfizma; je nujen, a nezadosten predpogoj. Iskanje te lastnosti bo verjetno povzročilo veliko lažnih pozitivnih rezultatov – vendar je informacija dragocena, saj lahko vzbudi sume in zagotovi razlog za nadaljnji pregled pogodbe, zlasti če pametna pogodba vsebuje opcode, opisano v nadaljevanju.
    5. Ali pogodba za razmestitev vsebuje kodo CREATE2? Kot je bilo omenjeno zgoraj, je uvedba prek CREATE2 bistveni predpogoj za metamorfizem. Če pogodba za razmestitev vsebuje kodo CREATE2, to lahko pomeni, da je uporabil CREATE2 za razmestitev zadevne pogodbe. Če je razvijalec res uporabil CREATE2 za uvedbo omenjene pogodbe, čeprav to ne pomeni, da je pogodba nujno metamorfna, pomeni, da morda biti metamorfen, zato je morda pametno nadaljevati previdno in nadaljevati raziskavo. Še enkrat, pazite se lažnih pozitivnih rezultatov: USTVARJANJE2 ima veliko zakonite uporabe, vključno s krepitvijo Rešitve za skaliranje »Layer 2«. in olajšanje ustvarjanja pametnih pogodbenih denarnic, ki lahko izboljšajo web3 vkrcanje uporabnikov in ključne možnosti obnovitve.
    6. Ali se je koda spremenila? To je najbolj očiten znak, vendar se bo pokazal šele, ko se bo metamorfna pogodba že spremenila. Če je zgoščena vrednost kode pametne pogodbe – edinstven, kriptografski identifikator – drugačna, kot je bila ob prvotni uvedbi pogodbe, potem je bila koda verjetno odstranjena, zamenjana ali spremenjena. Če se zgoščeni vrednosti ne ujemajo več, se je nekaj v kodi spremenilo in je pogodba morda metamorfna. Ta zastavica je najzanesljivejši pokazatelj metamorfizma, vendar ne bo pomagala napovedati ali preprečiti preoblikovanja, saj samo preverja, ali se je že zgodilo.

Poleg izdelave preprostega orodja ukazne vrstice za detektor metamorfnih pogodb sem zgradil nekaj primerov pametnih pogodb, ki prikazujejo scenarij metamorfnih pogodb za prevaro, ki ga opisujem v naslednjem razdelku. Vsa koda je na voljo v tem GitHub repozitorij

Kako lahko zlonamerni igralec uporabi metamorfne pogodbe za krajo sredstev ljudi

Evo, kako lahko nekdo uporabi metamorfno pametno pogodbo kot del prevare. 

Prva je faza nastavitve. Napadalec uvede pametno pogodbo na določenem naslovu v verigi blokov z uporabo dveh orodij: metamorfne bajtne kode in opcijske kode CREATE2. (Pozneje bomo razširili oba koncepta.) Metamorfna bajtna koda nato naredi, kar nakazuje njeno ime, in se »preoblikuje«. Tukaj se spremeni v a pogodba o vložku kjer lahko uporabniki vložijo žetone ERC-20. (Pozneje bomo razpravljali o podrobnostih tega trika preoblikovanja. Obljubimo!)

Sledi vaba in stikalo. Nič hudega sluteči uporabniki zastavijo svoje žetone v to pogodbo, privabljeni zaradi možnosti zaslužka donosa ali kakšne druge ugodnosti. Napadalec nato z uporabo koda SELFDESTRUCT razpravljali v prejšnjem razdelku. (Treba je opozoriti, da žetoni – ki obstajajo kot del ločene pogodbe ERC-20 – trajajo, ne da bi jih samouničena pogodba vplivala.)

Končno, vlečenje preproge. Napadalec ponovno uporabi isto metamorfno bajtno kodo, ki je bila uporabljena v fazi namestitve, da "prerazporedi" novo pogodbo. Ta nova pogodba se uporablja na istem naslovu, ki je bil pred kratkim izpraznjen zaradi samouničljive pogodbe. Tokrat pa se bajtna koda »preoblikuje« (znova bomo razložili, kako) v zlonamerno pogodbo, ki lahko ukrade vse žetone, ki so vstavljeni na naslov pogodbe. Prevara končana. 

Tveganja, ki jih predstavljajo metamorfne pametne pogodbe, so zdaj jasno očitna. Toda morda se še vedno sprašujete, kako ta trik metamorfizma dejansko deluje? Da bi to razumeli, morate iti globlje, do ravni bajtne kode. 

Kako CREATE2 odpira možnost metamorfizma 

USTVARJANJE2 je nadgradnja opcode, predstavil Ethereum februarja 2019, ki ponuja nov način za uvajanje pametnih pogodb. 

CREATE2 daje razvijalcem večji nadzor nad uvajanjem njihovih pametnih pogodb, kot so jih imeli prej. Izvirna opcijska koda CREATE otežuje razvijalcem nadzor nad ciljnim naslovom za pametno pogodbo, ki bo uvedena. S CREATE2 lahko ljudje nadzorujejo in poznajo naslov določene pametne pogodbe vnaprej, preden jo dejansko uvedejo v verigo blokov. To vnaprejšnje znanje – in nekaj pametnih trikov – je tisto, kar ljudem omogoča ustvarjanje metamorfnih pametnih pogodb. 

Kako lahko CREATE2 napove prihodnost? Izračun operacijske kode je determinističen: dokler se vhodi ne spremenijo, se naslov, ki ga določi CREATE2, ne bo spremenil. (Tudi najmanjša sprememba bo povzročila, da se bo uvedba zgodila nekje drugje.)

Bolj zrnato je CREATE2 funkcija, ki združuje in zgošča nekaj elementov. Prvič, vključuje naslov izvajalca (ali pošiljatelja): začetno pametno pogodbo, ki deluje kot nadrejena tisti, ki bo ustvarjena. Nato doda poljubno številko, ki jo zagotovi pošiljatelj (ali »sol«), kar razvijalcu omogoča uvedbo iste kode na različne naslove (s spreminjanjem soli) in preprečuje prepisovanje obstoječih enakih pogodb. Nazadnje uporablja zgoščeno vrednost keccak256 neke bajtne kode inicializacije pametne pogodbe (»init«), ki je seme, ki se spremeni v novo pametno pogodbo. Ta zgoščena kombinacija določi naslov Ethereum in nato uvede dano bajtno kodo na ta naslov. Dokler bajtna koda ostane popolnoma enaka, bo CREATE2 vedno uvedel dano bajtno kodo na isti naslov v verigi blokov.

Tukaj je videti formula CREATE2. (Opomba: v spodnjem primeru boste opazili še en element, »0xFF«. To je samo konstanta, ki jo uporablja CREATE2 preprečiti trke s prejšnjo operacijsko kodo CREATE.)

Zdaj, ko imamo način za uvedbo kode na deterministični naslov, kako je to mogoče spremenite kodo na istem naslovu? Sprva se to morda zdi nemogoče. Če želite razmestiti novo kodo z uporabo CREATE2, se mora spremeniti bajtna koda, zato bo CREATE2 razmestil na drug naslov. Kaj pa, če bi razvijalec sestavil bajtno kodo na tak način, da bi se lahko "preoblikovala" v drugo kodo, ko CREATE2 uvede pametno pogodbo?

Kako metamorfna pogodba dejansko deluje

Recept za spreminjanje pametne pogodbe v metamorfno pogodbo zahteva skupno tri pametne pogodbe, od katerih ima vsaka edinstveno vlogo.

Ena od teh potrebnih komponent je Metamorfna pogodbena tovarna, možgani operacije. Ta »Tovarna« je odgovorna za uvedbo Metamorfne pogodbe in druge pametne pogodbe, imenovane Izvedbena pogodba, imenovane tako, ker se njena koda sčasoma implementira znotraj Metamorfne pogodbe. Subtilna koreografija med temi tremi pogodbami povzroči metamorfozo, kot je prikazano na spodnjem diagramu.

Orodje za odkrivanje metamorfnih pametnih pogodb PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Podrobno razpravljajmo o vsakem koraku, 1–7, da osvetlimo operacije pri delu.

1. korak: razvijalec vse sproži

Kodirnik oblikuje neko kodo pametne pogodbe – bajtno kodo izvedbene pogodbe – ki bo na koncu pristala v metamorfni pogodbi. Razvijalec pošlje to kodo v Metamorphic Contract Factory, pametno pogodbo, katere glavni namen je uvajanje drugih pametnih pogodb. To dejanje sproži celoten proces ustvarjanja Metamorfne pogodbe.

Vse, kar sledi, je rezultat tega začetnega koraka. Prav zares, Koraki od 1 do 6 se zgodijo v eni atomski transakciji v verigi blokov, kar pomeni skoraj vsi naenkrat. Te korake je mogoče ponavljati znova in znova, ad infinitum, da zamenjate kodo znotraj Metamorfne pogodbe in jo ohranite v nenehnem spreminjanju.

2. korak: tovarna uvede pogodbo o izvajanju

Prva pogodba, ki jo tovarna uvede, je izvedbena pogodba, ki vsebuje implementacijsko kodo. (Ustvarjalno, vemo.) Izvedbeno pogodbo si predstavljajte kot nakladalno postajo ali točko poti, ki vsebuje neko kodo, preden se pošlje na končni cilj, ki bo v tem primeru znotraj Metamorfne pogodbe. 

3. korak: Naslov pogodbe o izvedbi tovarne

Po uvedbi v verigo blokov bo Izvedbena pogodba nujno obstajala na nekem naslovu verige blokov. Tovarna shrani ta pogodbeni naslov v svoj pomnilnik (za uporabo pozneje, v koraku 5). 

4. korak: Tovarna uvede Metamorphic Contract

Tovarna razmesti metamorfno pogodbo z uporabo CREATE2 in metamorfne bajtne kode. Najdete lahko tehnično, poglobljeno predstavitev delovanja metamorfne bajtne kode tukaj, vendar je dovolj reči, da ko se metamorfna bajtna koda izvaja, kopira kodo z neke druge lokacije v verigi – v tem primeru iz izvedbene pogodbe – v metamorfno pogodbo. Kot smo govorili v prejšnjem razdelku, ker je CREATE2 determinističen – dokler se uporabljajo isti pošiljatelj, sol in bajtna koda – naslov Metamorfne pogodbe ostane enak ne glede na to, kolikokrat se ti koraki ponovijo.

Spodaj je primer, kako izgleda metamorfna bajtna koda iz metamorfni repo po 0 letih. To je samo en primer metamorfne bajtne kode – obstaja potencialno nešteto variacij, ki močno otežijo odkrivanje metamorfnih pogodb.

Orodje za odkrivanje metamorfnih pametnih pogodb PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

5. korak: Metamorfna bajtna koda poizveduje po naslovu pogodbe o izvajanju tovarne

Metamorfna bajtna koda zahteva od tovarne naslov izvedbene pogodbe (kot je shranjen v 3. koraku). Ni pomembno, če se naslov izvedbene pogodbe spremeni, dokler metamorfna bajtna koda, ki zahteva naslov, ostane enaka. Dejansko, če razvijalec pozneje uvede novo implementacijsko pogodbo – na primer zlonamerno, namenjeno kraji žetonov – bo ta nujno uvedena na drugem naslovu verige blokov glede na 2. korak. To ne vpliva na ustvarjanje metamorfne pogodbe.

Korak 6: Koda izvedbene pogodbe se prekopira v metamorfno pogodbo

Z uporabo naslova verige blokov, pridobljenega v 5. koraku, metamorfna bajtna koda poišče kodo v pogodbi o izvajanju in kopira to kodo v lokalno shrambo metamorfne pogodbe. Tako spremeni obliko metamorfne pogodbe: s kopiranjem kode iz izvedbene pogodbe. 

7. korak: Sperite in ponovite

Razvijalec lahko znova in znova ponavlja korake od 1 do 6 in zamenja kodo v Metamorfni pogodbi s katero koli želeno z novo Izvedbeno pogodbo. Vse, kar je potrebno, je uporaba operacijske kode SELFDESTRUCT – ali, bolj zvito, kode DELEGATECALL, ki na koncu povzroči SELFDESTRUCT – za odstranitev že obstoječe kode v Metamorfni pogodbi. S ponavljanjem cikla z novo bajtno kodo izvedbene pogodbe bo metamorfna pogodba kot čarovnija morph!

Z uporabo te tehnike za ustvarjanje metamorfnih pogodb lahko pameten razvijalec nenehno premika tla pod nogami uporabnikov web3. Ponovno razmislite o scenariju prevare. Razvijalec lahko najprej uvede izvedbeno pogodbo s kodo za vstavljanje žetonov, ki se po krožni poti, prikazani na grafiki in podrobno razdelani v zgornjih korakih, konča v metamorfni pogodbi. Prevarant bi lahko pozneje samouničil to kodo in jo nadomestil z uvedbo nove izvedbene pogodbe, ki bi vsebovala žeton-krasti Koda. 

Karkoli bo razporejeno v izvedbeni pogodbi, bo na koncu končalo v metamorfni pogodbi. To je bistvo trika. 

***

Metamorfne pametne pogodbe kršijo implicitno družbeno pogodbo web3, da tisto, kar vidite, to tudi dobite. Podobno kot igra lupine uporablja tri premikajoče se skodelice za skrivanje žogice, medsebojno delovanje treh pogodb pri ustvarjanju metamorfne pogodbe otežuje sledenje resnični funkciji pogodbe. Igra lupine je še posebej primerna primerjava, saj bodo prevaranti s samozavestjo pogosto uporabili spretnost in napačno usmeritev, da bi zagotovili svojo zmago. V različici web3 lahko pisci metamorfnih pogodb na podoben način poskrbijo, da »žoga« – implementacijska koda, to je – izgine (beri: samouniči se) in jo lahko nadomestijo s čimer hočejo.

Obstoj metamorfnih pogodb pomeni, da lahko uporabniki web3 sklepajo pogodbe, ki se lahko poljubno spreminjajo – zato je to grožnjo tako pomembno razumeti in se pred njo braniti. Moj detektor metamorfnih pogodb ponuja le prvi korak k prepoznavanju metamorfnih pogodb s spretnostjo, ki jo uporabljajo. Detektor bi lahko v prihodnosti izboljšali na več načinov. Na primer, z rekurzivnim preverjanjem tovarne (ali pogodbe razmestitve), ki je ustvarila metamorfno pogodbo, lahko vidimo, ali je tovarna sama metamorfna. Ta funkcija bi bila koristen dodatek k nadgrajeni različici 2 detektorja.

Vredno je še enkrat poudariti: to orodje Detector ni zanesljivo. Zastavice, ki jih ujame, niso vse znaki metamorfnega potenciala, vendar ponujajo namige. Prepoznavanje teh zastavic je šele začetek za temeljitejšo preiskavo. Zato smo detektor razširili na iskanje zastavic, ki bi zlahka ustvarile lažne pozitivne rezultate, kot je prisotnost kod CREATE2 ali DELEGATECALL. Če imate predloge za izboljšanje orodja ali želite nadgraditi ali dodati to začetno delo, stopite v stik z mano na .

Analizirajte pametne pogodbe glede metamorfnih lastnosti z uporabo orodja Detector in obisk GitHub repo več

Urednik: Robert Hackett @rhhackett

***

Zahvala: Želim se VELIKO pohvaliti in zahvaliti Robertu Hackettu, Eddyju Lazzarinu, Samu Ragsdaleu, Riyazu Faizullabhoyu, Noahu Citronu, Masonu Hallu in Daejunu Parku za dragocene povratne informacije in nasvete, da sta ta objava in orodje zaživela. 

***

Tukaj izražena stališča so stališča posameznega citiranega osebja družbe AH Capital Management, LLC (»a16z«) in niso stališča družbe a16z ali njenih podružnic. Nekatere informacije, vsebovane tukaj, so bile pridobljene iz virov tretjih oseb, vključno s portfeljskimi družbami skladov, ki jih upravlja a16z. Čeprav so vzeti iz virov, za katere menijo, da so zanesljivi, a16z ni neodvisno preveril takih informacij in ne daje nobenih zagotovil o trajni točnosti informacij ali njihovi ustreznosti za dano situacijo. Poleg tega lahko ta vsebina vključuje oglase tretjih oseb; a16z ni pregledal takšnih oglasov in ne podpira nobene oglaševalske vsebine v njih.

Ta vsebina je na voljo samo v informativne namene in se je ne smete zanašati kot pravni, poslovni, naložbeni ali davčni nasvet. Glede teh zadev se morate posvetovati s svojimi svetovalci. Sklici na katere koli vrednostne papirje ali digitalna sredstva so samo v ilustrativne namene in ne predstavljajo naložbenega priporočila ali ponudbe za zagotavljanje investicijskih svetovalnih storitev. Poleg tega ta vsebina ni namenjena nobenim vlagateljem ali bodočim vlagateljem niti ji ni namenjena in se nanjo v nobenem primeru ne smete zanašati, ko se odločate za vlaganje v kateri koli sklad, ki ga upravlja a16z. (Ponudba za vlaganje v sklad a16z bo podana le z memorandumom o zasebni plasiranju, pogodbo o vpisu in drugo ustrezno dokumentacijo katerega koli takega sklada in jo je treba prebrati v celoti.) Vse naložbe ali portfeljske družbe, omenjene, navedene ali opisane niso reprezentativne za vse naložbe v vozila, ki jih upravlja a16z, in ni nobenega zagotovila, da bodo naložbe donosne ali da bodo imele druge naložbe v prihodnosti podobne značilnosti ali rezultate. Seznam naložb skladov, ki jih upravlja Andreessen Horowitz (razen naložb, za katere izdajatelj ni dal dovoljenja a16z za javno razkritje, ter nenapovedanih naložb v digitalna sredstva, s katerimi se javno trguje), je na voljo na https://a16z.com/investments /.

Grafi in grafi, ki so navedeni znotraj, so izključno informativne narave in se nanje ne bi smeli zanašati pri sprejemanju kakršnih koli investicijskih odločitev. Pretekla uspešnost ni pokazatelj prihodnjih rezultatov. Vsebina govori samo od navedenega datuma. Vse projekcije, ocene, napovedi, cilji, obeti in/ali mnenja, izražena v tem gradivu, se lahko spremenijo brez predhodnega obvestila in se lahko razlikujejo ali so v nasprotju z mnenji, ki so jih izrazili drugi. Za dodatne pomembne informacije obiščite https://a16z.com/disclosures.

Časovni žig:

Več od Andreessen Horowitz