Testare și verificare formală pentru Web3 Smart Contract Security

Testare și verificare formală pentru Web3 Smart Contract Security

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

Timp de citit: 9 minute

Imaginează-ți că mergi cu parașutism. Înainte de a sări din avion, îți vei verifica parașuta de o sută de ori, nu? Verificarea și testarea sunt o parte integrantă a securității; gândiți-vă la orice lucru legat de securitate. Probabil că ar exista un mecanism de testare după aceea, fie că este vorba de instalarea unui CCTV sau de verificarea cernelii în stilou înainte de o examinare scrisă la școală, cu toții respectăm măsurile de siguranță. Cu cât riscul implicat este mai mare, cu atât mai mult testăm lucrurile. Și când vorbim despre contracte inteligente, riscul este URIAȘ. Nu poți fi neglijent când vine vorba de securitatea unui contract inteligent.

1. Securitatea este întotdeauna necesară.

Cu siguranță poți încuia ușa de două sau de trei ori, nu contează. Poți fi sigur că casa ta nu poate fi jefuită în timp ce ești plecat? Nu poți pentru că nu știi ce ar putea face tâlharul pentru a pătrunde în casă – același lucru este valabil pentru fiecare măsură de siguranță pe care o luăm. Nu există o metodă complet sigură care să garanteze siguranța. Totuși, acțiunea pe care o întreprindem rapid crește șansele noastre de a fi în siguranță, ceea ce este jocul. Dorim să creștem șansele de a fi în siguranță prin folosirea diferitelor măsuri.

Lumea Web3 nu este diferită. Nu există o metodă sigură de a te salva, dar a avea auditori cu experiență de la QuillAudits poate crește șansele ca protocolul tău să fie securizat enorm și îți va asigura securitatea la zi. În web3, există două mecanisme importante care vă ajută să înțelegeți cât de sigur sunteți, efectuând câteva teste pe protocolul dvs.: -

  1. Testarea inteligentă a contractelor
  2. Verificarea formală a contractelor inteligente

Să le înțelegem în detaliu și să aflăm cum ne ajută să cunoaștem punctele slabe sau vulnerabilitățile contractelor noastre.

2. Testarea inteligentă a contractelor

Un dezvoltator cu experiență poate explica munca unei mașini cu cod. Cu toate acestea, uneori, mașina nu descrie mecanismul exact pe care dezvoltatorul l-a avut în vedere din cauza unui defect sau a unei erori logice a codului. Testarea este procesul care ajută la identificarea unde codul nostru eșuează și ce se poate face pentru ca acesta să corespundă cu acțiunea pe care trebuie să o efectuăm.

Testarea inteligentă a contractelor este o fază a ciclului de dezvoltare în care efectuăm o analiză detaliată a contractelor noastre și încercăm să aflăm unde și de ce eșuează codul nostru. Aproape toate contractele inteligente trec prin această fază. Există două moduri în care se realizează testarea inteligentă a contractelor. Să le explorăm.

2.1 Automatizat

După cum sugerează și numele, această metodă de testare a contractelor inteligente este utilizată pentru a efectua teste scriptate. Acesta implică un software automat care execută teste repetate pentru a găsi orice vulnerabilități și defecte în contractele inteligente. Aceste instrumente automate de testare pot fi configurate cu datele de testare și rezultatele așteptate. Apoi rezultatul real este comparat cu cel așteptat pentru a verifica dacă contractul funcționează corect. Testarea automată poate fi în continuare clasificată în trei categorii.

2.1.1. Testarea funcțională

Să presupunem că scrieți un program pentru a lua două numere, a și b și apoi returnați suma ambelor numere. Deci, pentru a verifica acel program, dați 2 și 8 și alimentați rezultatul așteptat să fie 10. Acum, când programul rulează, ar trebui să returneze și 10. Dacă da, atunci funcționează bine, iar codul nostru este corect, dar dacă nu, atunci există o eroare cu codul nostru. 

Testarea funcțională necesită înțelegerea modului în care contractul dvs. ar trebui să se comporte în anumite condiții. Îl putem testa rulând un calcul cu valorile selectate și comparând rezultatul returnat. Testarea funcțională are trei clase: -

  1. Testarea unității:- Aceasta se ocupă cu testarea componentelor individuale ale contractului inteligent pentru corectitudine. Este asertiv sau necesită declarații asupra variabilelor.
  1. Integrare Testing: – Acestea se ocupă cu testarea mai multor componente individuale împreună. Testarea de integrare este un nivel mai înalt în ierarhie decât testarea unitară. Ne ajută să determinăm erorile care decurg din interacțiunea diferitelor funcții, care pot face parte din alte contracte inteligente.
  1. Sistem testng: – Acesta este cel mai înalt în ierarhie. În acest sens, testăm întregul contract ca un sistem complet integrat pentru a vedea dacă funcționează conform nevoilor noastre. Se face din punctul de vedere al utilizatorului, iar cea mai bună modalitate de a o face este să o implementezi pe rețele de testare.

2.1.2. Analiza Statica

Analiza statică se poate face fără a rula programul. Aceasta implică analiza codului sursă sau a bytecode-ului contractului inteligent înainte de executare. Dându-și astfel numele, analiza statică poate avea ca rezultat detectarea unor vulnerabilități comune.

2.1.3. Analiza dinamică

Spre deosebire de analiza statică, analiza dinamică este efectuată în timpul de rulare a contractelor inteligente pentru a identifica problemele din cod. Analizatorii de cod dinamic observă starea de funcționare a contractului și generează un raport detaliat al vulnerabilităților și încălcărilor proprietății. Fuzzing face obiectul analizei DYnamic. Fuzzing furnizează intrări incorecte sau rău intenționate pentru a provoca execuția neintenționată a codului.

2.2 manual

După cum sugerează și numele, această metodă de testare a contractelor inteligente implică interacțiunea regulată cu un dezvoltator uman. Auditurile de cod, în care dezvoltatorii trec prin linii de coduri, intră în modul Manual de testare a contractelor inteligente.

Modul manual necesită timp, pricepere, bani și efort considerabil. Totuși, rezultatul merită adesea pentru că, prin aceasta, identificăm vulnerabilități care pot trece neobservate în testarea automată. Există două tipuri esențiale de testare manuală: -

2.2.1 Audituri de cod:- 

Cel mai bun mod de a testa dacă măsura de siguranță funcționează corect este să încercați să o rupeți. De exemplu, dacă doriți să verificați dacă încuietoarea mașinii funcționează corect, încercați să o spargeți. Acum puteți întreba că un hoț de mașini priceput poate pătrunde cu ușurință în mașina mea. S-ar putea să nu, așa că soluția este să angajezi pe cineva priceput la spargere, ca să te poată ghida!

 Da, vorbesc despre QuillAudits. Suntem o echipă de auditori calificați care vă pot îndruma. Auditurile de cod necesită mentalitatea unui atacator pentru a găsi toate vulnerabilitățile posibile în codul sursă. Un audit de cod este o evaluare detaliată a codului unui contract inteligent pentru a descoperi potențialele vulnerabilități și defecte.

2.2.2 Bug Bounty:-

Dacă credeți că ar putea exista unele defecte de securitate în codul dvs. sursă (care sunt în mare parte) și nu le puteți găsi, puteți externaliza această muncă liber profesioniști prin crearea unui sistem de recompense. Este mai mult ca și cum ai anunța o recompensă pentru oricine îți poate sparge contractul inteligent. Făcând acest lucru, aflați despre vulnerabilitatea prezentă în contractul dvs. inteligent, astfel încât să îl puteți proteja mai bine și să vă salvați utilizatorii de la pierdere.

3. Verificarea formală a contractelor inteligente

Verificarea formală este procesul de evaluare a corectitudinii unui contract pe baza specificațiilor formale. Aceasta înseamnă că verificarea formală evaluează dacă codul face ceea ce este intenționat. Verificarea formală utilizează metode formale pentru specificarea, proiectarea și verificarea programelor.

3.1 Care este specificația formală?

În contextul contractelor inteligente, specificațiile formale se referă la proprietățile care trebuie să rămână aceleași în orice circumstanță posibilă. Acestea sunt proprietăți „invariante” deoarece nu se pot modifica și reprezintă afirmații logice despre executarea contractului.

Specificația formală este o colecție de declarații scrise în limbaj formal. Specificațiile acoperă diferite proprietăți și descriu cum ar trebui să se comporte proprietățile contractului în alte circumstanțe. Specificațiile formale sunt critice deoarece, dacă contractele nu reușesc să aibă variabile invariante sau proprietățile se modifică în timpul execuției, aceasta poate duce la o posibilă exploatare a proprietății, ceea ce poate duce la o pierdere uriașă.

Ne poate ajuta să stabilim dacă un contract inteligent îndeplinește specificațiile sau are comportamente neașteptate. Verificarea formală are trei componente: o specificație, un model și un motor de verificare.

3.1.1 Specificații

O specificație este o descriere clară, lipsită de ambiguitate și completă a cerințelor pentru un contract inteligent. Ar trebui să descrie ce ar trebui să facă contractul și ce nu trebuie să facă. Iată un exemplu de specificație pentru un contract simplu, inteligent, care adaugă două numere:

// 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

Un model reprezintă în mod oficial contractul inteligent care poate fi folosit pentru a raționa comportamentul său. Un model popular pentru contractele inteligente este limbajul de programare Solidity. Iată un exemplu de model pentru funcția de adăugare descrisă mai sus:

// 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 de verificare

Un motor de verificare este un instrument care poate analiza un model și verifica corectitudinea acestuia cu privire la o specificație dată. Există mai multe motoare de verificare disponibile pentru contractele inteligente, inclusiv:

Mitril: un instrument de execuție simbolică open-source care poate detecta o gamă largă de vulnerabilități de securitate în contractele inteligente Solidity.

Remix IDE: un mediu de dezvoltare integrat care include un instrument formal de verificare care poate verifica corectitudinea contractelor inteligente.

Certora Prover: un instrument comercial care poate verifica corectitudinea contractelor inteligente folosind raționamentul matematic automat. Iată un exemplu despre cum poate fi utilizată verificarea formală pentru a verifica corectitudinea unui contract inteligent folosind 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);
}
}

În exemplul de mai sus, definim un contract inteligent Solidity care include un model al funcției de adăugare, o specificație pentru funcție și un motor de verificare (Certora Prover) care poate verifica corectitudinea funcției. De asemenea, definim o funcție de testare (test_add) care poate fi folosită pentru a verifica corectitudinea funcției.

3.2 Testare VS Verificare formală

După cum am discutat, testarea returnează rezultatul așteptat pentru un bot de date de intrare care îi lipsește, deoarece nu putem spune despre datele pe care nu a fost testat. Este practic imposibil să-l verifici pe fiecare intrare posibilă. Prin urmare, nu suntem siguri de „corectitudinea funcțională” a acesteia. Aici intervine verificarea formală. Metodele de verificare formală folosesc tehnici matematice riguroase pentru specificarea și verificarea software-ului sau a contractelor inteligente.

3.3 Tehnici de verificare formală

Verificarea formală are o gamă largă de tehnici de îmbunătățire securitatea contractului inteligent. În această parte a blogului, vom explora câteva în mod individual.

3.3.1 Verificarea modelului

Pe măsură ce am discutat despre ce este o specificație formală, verificăm contractul inteligent cu specificația sa în această tehnică de verificare formală. Aceste contracte inteligente sunt reprezentate ca sisteme de tranziție de stat, iar proprietățile sunt definite folosind logica temporală. 

Această tehnică este folosită în principal pentru a evalua proprietățile temporale care descriu comportamentul contractelor inteligente în timp. Proprietatea controlului accesului (apel de administrator autodistrugere) poate fi scrisă ca logică formală. Apoi algoritmul de verificare a modelului poate verifica dacă contractul satisface această verificare formală.

Verificarea modelului folosește o tehnică numită explorarea spațiului de stat, care practic încearcă să încerce toate stările posibile în care se poate afla contractul nostru inteligent și apoi verifică dacă vreuna dintre ele duce la o încălcare a proprietății. Totuși, acest lucru poate duce la infinit de stări; prin urmare, verificatorii de modele se bazează pe tehnici de abstractizare pentru a face posibilă o analiză eficientă a contractelor inteligente.

3.3.2 Demonstrarea teoremei

Demonstrarea teoremei se referă la raționamentul matematic privind corectitudinea programelor. Se ocupă de crearea unei impresii logice asupra sistemului și specificației contractului și de verificarea „echivalenței logice” dintre declarații. Echivalența logică este o relație matematică care spune că afirmația A este adevărată dacă și numai dacă afirmația B este adevărată.

După cum am învățat în tehnica de verificare a modelelor, modelăm contractele ca sisteme de tranziție cu stări finite. Demonstrarea teoremei poate gestiona analiza sistemelor cu stări infinite. Cu toate acestea, un demonstrator automat de teoreme nu poate ști întotdeauna dacă o problemă logică este decidabilă; astfel, asistența umană este adesea necesară pentru a ghida demonstratorul de teoreme în obținerea dovezilor de corectitudine.

4. Concluzie

Testarea și verificarea formală sunt ambele părți integrante ale dezvoltării unui contract inteligent. Acestea sunt metodele folosite pentru a securiza contractele inteligente și pentru a ajuta la pregătirea contractelor pentru implementare. Dar, după cum știți, securitatea nu este niciodată suficientă. Multe contracte inteligente au fost piratate doar pentru că nu au existat teste adecvate. Acum, mai mult decât oricând, comunitatea web3 are nevoie de protocoale mai sigure. 

Noi, cei de la QuillAudits, avem misiunea de a vă ajuta să vă protejați protocoalele. Cu echipa noastră pricepută și experimentată, ne asigurăm că nici măcar o singură vulnerabilitate nu trece neobservată. Vizitați site-ul nostru web și asigurați-vă proiectul Web3!

28 Vizualizări

Timestamp-ul:

Mai mult de la Quillhash