Testiranje in formalno preverjanje za varnost pametnih pogodb Web3

Testiranje in formalno preverjanje za varnost pametnih pogodb Web3

Testing and Formal Verification for Web3 Smart Contract Security PlatoBlockchain Data Intelligence. Vertical Search. Ai.

Čas branja: 9 min

Predstavljajte si skok s padalom. Preden skočite iz letala, boste stokrat preverili, ali imate padalo, kajne? Preverjanje in testiranje sta sestavni del varnosti; pomislite na vse, kar je povezano z varnostjo. Verjetno bi sledil mehanizem testiranja, ne glede na to, ali gre za namestitev CCTV ali preverjanje črnila v pisalu pred pisnim izpitom v šoli, vsi upoštevamo varnostne ukrepe. Večje kot je tveganje, bolj stvari testiramo. In ko govorimo o pametnih pogodbah, je tveganje OGROMNO. Ne morete biti neprevidni, ko gre za varnost pametnih pogodb.

1. Varnost je vedno potrebna.

Zagotovo lahko zaklenete vrata dvakrat ali trikrat, ni pomembno. Ali ste lahko prepričani, da vaše hiše ne morejo oropati, ko vas ni? Ne morete, ker ne veste, kaj bi lahko naredil ropar, da bi vdrl v hišo – enako velja za vsak varnostni ukrep, ki ga sprejmemo. Ne obstaja popolnoma varna metoda, ki bi zagotavljala varnost. Kljub temu hitro ukrepanje poveča naše možnosti, da smo varni, kar je igra. Z različnimi ukrepi želimo povečati možnosti za varnost.

Svet Web3 ni nič drugačen. Ni varne metode, s katero bi se rešili, vendar lahko izkušeni revizorji iz QuillAudits povečajo verjetnost, da bo vaš protokol izjemno zaščiten, in vam bodo zagotovili posodobljeno varnost. V web3 obstajata dva pomembna mehanizma, ki vam pomagata razumeti, kako varni ste, tako da opravite nekaj testov na svojem protokolu: -

  1. Testiranje pametnih pogodb
  2. Uradno preverjanje pametnih pogodb

Razumejmo jih podrobneje in se naučimo, kako nam pomagajo spoznati šibke točke ali ranljivosti naših pogodb.

2. Testiranje pametnih pogodb

Izkušen razvijalec lahko razloži delo stroju s kodo. Kljub temu včasih stroj ne prikazuje natančnega mehanizma, ki ga je razvijalec imel v mislih zaradi pomanjkljivosti ali logične napake v kodi. Testiranje je postopek, ki pomaga ugotoviti, kje je naša koda neuspešna in kaj je mogoče storiti, da bo ustrezala dejanju, ki ga moramo izvesti.

Testiranje pametnih pogodb je faza v razvojnem ciklu, v kateri izvedemo podrobno analizo naših pogodb in poskušamo ugotoviti, kje in zakaj naša koda ne uspe. Skoraj vse pametne pogodbe gredo skozi to fazo. Obstajata dva načina testiranja pametnih pogodb. Raziščimo jih.

2.1 Avtomatsko

Kot že ime pove, se ta metoda za testiranje pametnih pogodb uporablja za izvajanje skriptnega testiranja. Vključuje avtomatizirano programsko opremo, ki izvaja ponavljajoče se teste, da bi odkrila morebitne ranljivosti in napake v pametnih pogodbah. Ta avtomatizirana orodja za testiranje je mogoče konfigurirati s testnimi podatki in pričakovanimi rezultati. Nato se dejanski rezultat primerja s pričakovanimi, da se preveri, ali pogodba deluje pravilno. Avtomatsko testiranje lahko nadalje razvrstimo v tri kategorije.

2.1.1. Funkcionalno preskušanje

Recimo, da napišete program, ki vzame dve števili, a in b, in nato vrne seštevek obeh števil. Torej, da preverite ta program, podate 2 in 8 in nastavite pričakovani rezultat na 10. Zdaj, ko se program izvaja, bi moral vrniti tudi 10. Če se, potem deluje dobro in naša koda je pravilna, če pa ne, potem je prišlo do napake v naši kodi. 

Funkcionalno testiranje zahteva razumevanje, kako naj se vaša pogodba obnaša v določenih pogojih. Preizkusimo ga lahko tako, da izvedemo izračun z izbranimi vrednostmi in primerjamo vrnjeni rezultat. Funkcionalno testiranje ima tri razrede: -

  1. Preizkušanje enot:- To se ukvarja s testiranjem pravilnosti posameznih komponent pametne pogodbe. Je asertiven ali zahteva izjave o spremenljivkah.
  1. Integracija besedilang: – Ti obravnavajo skupno testiranje več posameznih komponent. Integracijsko testiranje je v hierarhiji višja stopnja kot testiranje enote. Pomaga nam ugotoviti napake, ki izhajajo iz interakcije različnih funkcij, ki so lahko del drugih pametnih pogodb.
  1. sistem besedilang: – To je najvišje v hierarhiji. Pri tem preizkusimo celotno pogodbo kot en popolnoma integriran sistem, da ugotovimo, ali deluje v skladu z našimi potrebami. Izvaja se z vidika uporabnika in najboljši način za to je, da ga namestite v testna omrežja.

2.1.2. Statična analiza

Statično analizo je mogoče opraviti brez zagona programa. Vključuje analizo izvorne kode ali bajtne kode pametne pogodbe pred izvedbo. Zaradi tega imena lahko statična analiza povzroči odkrivanje nekaterih pogostih ranljivosti.

2.1.3. Dinamična analiza

Za razliko od statične analize se dinamična analiza izvaja med časom izvajanja pametnih pogodb za prepoznavanje težav v kodi. Dinamični analizatorji kode opazujejo tekoče stanje pogodbe in ustvarijo podrobno poročilo o ranljivostih in kršitvah lastnosti. Fuzzing spada pod analizo DYnamic. Fuzzing je dovajanje nepravilnih ali zlonamernih vnosov, ki povzročijo nenamerno izvajanje kode.

2.2 Priročnik

Kot že ime pove, ta metoda testiranja pametnih pogodb vključuje redno interakcijo s človeškim razvijalcem. Revizije kode, kjer razvijalci pregledajo vrstice kod, spadajo v ročni način testiranja pametnih pogodb.

Ročni način zahteva veliko časa, spretnosti, denarja in truda. Kljub temu je rezultat pogosto vreden, saj s tem identificiramo ranljivosti, ki lahko ostanejo neopažene pri samodejnem testiranju. Obstajata dve bistveni vrsti ročnega testiranja: -

2.2.1 Revizije kode:- 

Najboljši način, da preverite, ali vaš varnostni ukrep deluje pravilno, je, da ga poskusite zlomiti. Na primer, če želite preveriti, ali ključavnica vašega avtomobila deluje pravilno, jo poskusite zlomiti. Zdaj lahko vprašate, da lahko spreten tat brez težav vlomi v moj avto. Morda ne, zato je rešitev, da najamete nekoga, ki je spreten v vlamljanju, da vas bo lahko vodil!

 Da, govorim o QuillAudits. Smo ekipa usposobljenih revizorjev, ki vas lahko vodijo. Revizije kode zahtevajo miselnost napadalca, da najde vse možne ranljivosti v izvorni kodi. Revizija kode je podrobna ocena kode pametne pogodbe za odkrivanje potencialnih ranljivosti in pomanjkljivosti.

2.2.2 Nagrada za hrošče:-

Če menite, da so v vaši izvorni kodi morda nekatere varnostne napake (kar večinoma so) in jih ne najdete, lahko to delo oddate zunanjim sodelavcem, tako da ustvarite sistem nagrajevanja. To je bolj podobno razglasitvi nagrade za vsakogar, ki lahko vdre v vašo pametno pogodbo. S tem spoznate ranljivost vaše pametne pogodbe, da jo lahko bolje zaščitite in svoje uporabnike zaščitite pred izgubo.

3. Formalno preverjanje pametnih pogodb

Formalno preverjanje je postopek ocenjevanja pravilnosti pogodbe na podlagi formalnih specifikacij. To pomeni, da formalno preverjanje oceni, ali koda dela tisto, kar je predvideno. Formalno preverjanje uporablja formalne metode za določanje, načrtovanje in preverjanje programov.

3.1 Kaj je formalna specifikacija?

V kontekstu pametnih pogodb se formalne specifikacije nanašajo na lastnosti, ki morajo ostati enake v vseh možnih okoliščinah. To so lastnosti »invariant«, ker se ne morejo spremeniti in predstavljajo logične trditve o izvajanju pogodbe.

Formalna specifikacija je zbirka stavkov, napisanih v formalnem jeziku. Specifikacije zajemajo različne lastnosti in opisujejo, kako naj se lastnosti pogodbe obnašajo v drugih okoliščinah. Formalne specifikacije so ključnega pomena, ker če pogodbe ne vsebujejo nespremenljivih spremenljivk ali lastnosti, ki se spremenijo med izvajanjem, lahko to privede do možnega izkoriščanja lastnine, kar lahko privede do velike izgube.

Lahko nam pomaga ugotoviti, ali pametna pogodba izpolnjuje specifikacije ali ima nepričakovano vedenje. Formalno preverjanje ima tri komponente: specifikacijo, model in mehanizem preverjanja.

3.1.1 Specifikacija

Specifikacija je jasen, nedvoumen in popoln opis zahtev za pametno pogodbo. Opisuje naj, kaj naj bi pogodba naredila in česa ne bi smela. Tukaj je primer specifikacije za preprosto pametno pogodbo, ki doda dve številki:

// Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
// Implementation details are not relevant to the specification
// …
}

Model 3.1.2

Model formalno predstavlja pametno pogodbo, ki jo je mogoče uporabiti za sklepanje o njenem vedenju. Eden priljubljenih modelov za pametne pogodbe je programski jezik Solidity. Tukaj je primer modela za zgoraj opisano funkcijo dodajanja:

// Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public view returns (uint) {
return a + b;
}

3.1.3 Motor za preverjanje

Mehanizem za preverjanje je orodje, ki lahko analizira model in preveri njegovo pravilnost glede na dano specifikacijo. Za pametne pogodbe je na voljo več mehanizmov za preverjanje, vključno z:

Mythril: odprtokodno simbolno izvršilno orodje, ki lahko odkrije široko paleto varnostnih ranljivosti v pametnih pogodbah Solidity.

Remix IDE: integrirano razvojno okolje, ki vključuje formalno orodje za preverjanje, ki lahko preveri pravilnost pametnih pogodb.

Certora Prover: komercialno orodje, ki lahko preveri pravilnost pametnih pogodb z avtomatiziranim matematičnim sklepanjem. Tukaj je primer, kako se lahko formalno preverjanje uporabi za preverjanje pravilnosti pametne pogodbe z uporabo Certora Prover:

pragma solidity 0.7.6; // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint)
function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Model: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function add(uint a, uint b) public pure returns (uint) {
return a + b;
} // Specification: Adds two numbers
// Inputs: a, b (uint)
// Outputs: the sum of a and b (uint) function test_add(uint a, uint b) public pure returns (bool) {
uint expected = a + b;
uint actual = add(a, b);
return expected == actual;
} // Verification: Verify the correctness of the add function contract TestAdd {
function test_add(uint a, uint b) public view returns (bool) {
return CertoraProver.verify(test_add, a, b);
}
}

V zgornjem primeru definiramo pametno pogodbo Solidity, ki vključuje model funkcije dodajanja, specifikacijo za funkcijo in mehanizem za preverjanje (Certora Prover), ki lahko preveri pravilnost funkcije. Definiramo tudi testno funkcijo (test_add), s katero lahko preverimo pravilnost funkcije.

3.2 Testiranje VS Formalno preverjanje

Kot smo razpravljali, testiranje vrne pričakovani rezultat za nekatere bot vhodnih podatkov, ki mu manjkajo, ker ne moremo reči o podatkih, na katerih ni bil preizkušen. Praktično ga je nemogoče preveriti na vseh možnih vnosih. Tako nismo prepričani o njegovi »funkcionalni pravilnosti«. Tu pride na vrsto formalno preverjanje. Formalne metode preverjanja uporabljajo stroge matematične tehnike za določanje in preverjanje programske opreme ali pametnih pogodb.

3.3 Tehnike za formalno preverjanje

Formalno preverjanje ima širok nabor tehnik za izboljšanje varnost pametne pogodbe. V tem delu bloga bomo raziskali nekaj posameznih.

3.3.1 Preverjanje modela

Ko smo razpravljali o tem, kaj je formalna specifikacija, preverimo pametno pogodbo glede na njeno specifikacijo v tej formalni tehniki preverjanja. Te pametne pogodbe so predstavljene kot sistemi prehoda stanja, lastnosti pa so opredeljene z uporabo časovne logike. 

Ta tehnika se uporablja predvsem za ocenjevanje časovnih lastnosti, ki prikazujejo vedenje pametnih pogodb skozi čas. Lastnost nadzora dostopa (klicanje skrbnika samouničenje) lahko zapišemo kot formalno logiko. Nato lahko algoritem za preverjanje modela preveri, ali pogodba izpolnjuje to formalno preverjanje.

Preverjanje modela uporablja tehniko, imenovano raziskovanje prostora stanja, ki v bistvu preizkuša vsa možna stanja, v katerih je lahko naša pametna pogodba, in nato preverja, ali katero od njih povzroči kršitev lastnosti. Vendar pa lahko to vodi v neskončno veliko stanj; zato se preverjevalci modelov zanašajo na tehnike abstrakcije, da omogočijo učinkovito analizo pametnih pogodb.

3.3.2 Dokaz izreka

Pri dokazovanju izrekov gre za matematično razmišljanje o pravilnosti programov. Ukvarja se z ustvarjanjem logičnega vtisa pogodbenega sistema in specifikacij ter preverjanjem »logične enakovrednosti« med izjavami. Logična enakovrednost je matematično razmerje, ki pravi, da je izjava A resnična, če in samo če je trditev B resnična.

Kot smo se naučili pri tehniki preverjanja modela, modeliramo pogodbe kot prehodne sisteme s končnimi stanji. Dokazovanje izrekov lahko obravnava analizo sistemov z neskončnimi stanji. Vendar pa avtomatizirani dokazovalnik izrekov ne more vedno vedeti, ali je logični problem odločljiv; zato je pogosto potrebna človeška pomoč, ki vodi dokazovalca izrekov pri pridobivanju dokazov pravilnosti.

4. Zaključek

Testiranje in formalno preverjanje sta sestavna dela razvoja pametne pogodbe. To so metode, ki se uporabljajo za zagotavljanje varnosti pametnih pogodb in pomoč pri pripravi pogodb za uvedbo. A kot veste, varnosti ni nikoli dovolj. Številne pametne pogodbe so bile vlomljene samo zato, ker ni bilo ustreznega testiranja. Skupnost web3 bolj kot kdaj koli prej potrebuje varnejše protokole. 

Mi pri QuillAudits smo na misiji pomagati zaščititi vaše protokole. Z našo spretno in izkušeno ekipo poskrbimo, da niti ena ranljivost ne ostane neopažena. Obiščite našo spletno stran in zaščitite svoj projekt Web3!

28 Ogledov

Časovni žig:

Več od Quillhash