Lietuvių

Išsami išmaniųjų sutarčių audito analizė, sutelkiant dėmesį į dažniausias saugumo spragas, audito metodikas ir geriausias saugios blokų grandinės kūrimo praktikas.

Išmaniųjų sutarčių auditas: saugumo spragų atskleidimas blokų grandinėje

Išmaniosios sutartys yra savaime vykdomi susitarimai, parašyti kodu ir įdiegti blokų grandinėje. Jų nekintamumas ir decentralizuota prigimtis paverčia jas galingais įrankiais įvairiems procesams automatizuoti, pradedant finansinėmis operacijomis ir baigiant tiekimo grandinės valdymu. Tačiau tos pačios savybės, kurios daro išmaniąsias sutartis patrauklias, taip pat sukelia didelių saugumo rizikų. Įdiegus išmaniąsias sutartis, jas pakeisti yra itin sunku, o kartais ir neįmanoma. Todėl nuodugnus auditas yra būtinas norint nustatyti ir sušvelninti pažeidžiamumus prieš įdiegimą, taip išvengiant potencialiai pražūtingų pasekmių, tokių kaip lėšų praradimas, duomenų pažeidimai ir reputacijos sugadinimas. Šiame vadove pateikiama išsami išmaniųjų sutarčių audito apžvalga, sutelkiant dėmesį į dažniausiai pasitaikančius pažeidžiamumus, audito metodikas ir geriausias praktikas saugiam blokų grandinės kūrimui, skirta pasaulinei auditorijai su įvairiu techniniu pasirengimu.

Kodėl išmaniųjų sutarčių auditas yra svarbus?

Išmaniųjų sutarčių audito svarbos negalima pervertinti. Skirtingai nuo tradicinės programinės įrangos, išmaniosios sutartys dažnai valdo didelės vertės finansinį turtą ir yra reglamentuojamos nekintamu kodu. Viena spraga gali būti išnaudota milijonams dolerių pavogti, decentralizuotų programų (dApps) veiklai sutrikdyti ir pasitikėjimui visa blokų grandinės ekosistema pakenkti. Štai kodėl auditas yra būtinas:

Dažniausiai pasitaikančios išmaniųjų sutarčių spragos

Dažniausiai pasitaikančių spragų supratimas yra pirmas žingsnis link efektyvaus išmaniųjų sutarčių audito. Štai išsamesnis žvilgsnis į kai kurias labiausiai paplitusias saugumo rizikas:

Pakartotinis įėjimas (Reentrancy)

Aprašymas: Pakartotinis įėjimas įvyksta, kai sutartis iškviečia kitą sutartį prieš atnaujindama savo būseną. Iškviesta sutartis gali rekursyviai iškviesti pradinę sutartį, potencialiai išsiurbdama lėšas ar manipuliuodama duomenimis. Tai viena iš geriausiai žinomų ir pavojingiausių išmaniųjų sutarčių spragų. Įsivaizduokite supaprastintą skolinimo protokolą, kuriame vartotojas gali atsiimti savo lėšas. Jei lėšų atsiėmimo funkcija neatnaujina vartotojo balanso prieš siunčiant lėšas, piktavališka sutartis gali pakartotinai įeiti į atsiėmimo funkciją kelis kartus, atsiimdama daugiau lėšų, nei jai priklauso.

Pavyzdys: DAO įsilaužimas išnaudojo pakartotinio įėjimo spragą savo lėšų atsiėmimo funkcijoje. Piktavalis veikėjas rekursyviai iškvietė atsiėmimo funkciją, išsiurbdamas DAO lėšas anksčiau, nei galėjo būti atnaujintas balansas.

Mažinimo priemonės:

Sveikųjų skaičių perpildymas ir nepakankamas užpildymas

Aprašymas: Sveikųjų skaičių perpildymas įvyksta, kai aritmetinė operacija sukuria vertę, didesnę už maksimalią, kurią gali talpinti duomenų tipas. Sveikųjų skaičių nepakankamas užpildymas įvyksta, kai aritmetinė operacija sukuria vertę, mažesnę už minimalią, kurią gali talpinti duomenų tipas. Solidity versijose, ankstesnėse nei 0.8.0, šios sąlygos galėjo lemti netikėtą elgseną ir saugumo spragas.

Pavyzdys: Jei beženklis 8 bitų sveikasis skaičius (uint8) turi vertę 255 ir prie jo pridėsite 1, jis perpildys ir taps 0. Panašiai, jei uint8 turi vertę 0 ir iš jo atimsite 1, jis nepakankamai užsipildys ir taps 255. Tai gali būti išnaudota manipuliuoti balansais, žetonų atsargomis ar kitais kritiniais duomenimis.

Mažinimo priemonės:

Priklausomybė nuo laiko žymos

Aprašymas: Pasikliauti bloko laiko žyma (`block.timestamp`) kritinei logikai gali būti rizikinga, nes kasėjai (miners) turi tam tikrą laiko žymos kontrolę. Tai gali būti išnaudota manipuliuoti laiko atžvilgiu jautrių operacijų, tokių kaip loterijos ar aukcionai, rezultatais. Kasėjai skirtingose geografinėse vietovėse gali turėti šiek tiek skirtingus laikrodžio nustatymus, bet svarbiausia, kad kasėjai gali strategiškai koreguoti laiko žymą tam tikrame diapazone.

Pavyzdys: Loterijos išmanioji sutartis, kuri naudoja bloko laiko žymą nugalėtojui nustatyti, gali būti manipuliuojama kasėjų, siekiant palankumo tam tikriems dalyviams. Kasėjas galėtų šiek tiek pakoreguoti laiko žymą, kad užtikrintų, jog pageidaujamo dalyvio pateikta transakcija būtų įtraukta į bloką su laiko žyma, kuri jį paverčia nugalėtoju.

Mažinimo priemonės:

Prieigos kontrolės spragos

Aprašymas: Netinkama prieigos kontrolė gali leisti neįgaliotiems vartotojams atlikti privilegijuotus veiksmus, tokius kaip sutarties parametrų keitimas, lėšų atsiėmimas ar duomenų trynimas. Tai gali sukelti katastrofiškų pasekmių, jei piktavaliai veikėjai perima kritinių sutarties funkcijų kontrolę.

Pavyzdys: Išmanioji sutartis, leidžianti bet kam pakeisti savininko adresą, gali būti išnaudota puolėjo, kuris pakeičia savininką į savo adresą, suteikdamas sau visišką sutarties kontrolę.

Mažinimo priemonės:

Dujų (Gas) optimizavimas

Aprašymas: Dujų optimizavimas yra labai svarbus siekiant sumažinti transakcijų išlaidas ir išvengti paslaugos trikdymo (DoS) atakų. Neefektyvus kodas gali sunaudoti per daug dujų, todėl transakcijos tampa brangios ar net neįmanomos įvykdyti. DoS atakos gali išnaudoti dujų neefektyvumą, kad išsiurbtų sutarties lėšas arba neleistų teisėtiems vartotojams su ja sąveikauti.

Pavyzdys: Išmanioji sutartis, kuri iteruoja per didelį masyvą naudojant ciklą, neoptimizuotą dujų suvartojimui, gali sunaudoti per daug dujų, todėl transakcijos, susijusios su ciklu, tampa brangios. Puolėjas gali tai išnaudoti siųsdamas transakcijas, kurios paleidžia ciklą, išsiurbdamas sutarties lėšas arba neleisdamas teisėtiems vartotojams su ja sąveikauti.

Mažinimo priemonės:

Paslaugos trikdymo (Denial of Service, DoS) atakos

Aprašymas: DoS atakos siekia padaryti išmaniąją sutartį nepasiekiamą teisėtiems vartotojams. Tai galima pasiekti išnaudojant dujų neefektyvumą, manipuliuojant sutarties būsena arba užtvindant sutartį neteisingomis transakcijomis. Kai kurios DoS spragos gali būti atsitiktinės, atsiradusios dėl prastos kodavimo praktikos.

Pavyzdys: Sutartis, kuri leidžia vartotojams įnešti Ether ir tada iteruoja per visus indėlininkus, kad jiems grąžintų lėšas, gali būti pažeidžiama DoS atakai. Puolėjas galėtų sukurti daugybę mažų indėlių, todėl grąžinimo procesas taptų neįperkamai brangus ir neleistų teisėtiems vartotojams gauti savo lėšų grąžinimo.

Mažinimo priemonės:

Delegatecall spragos

Aprašymas: Funkcija `delegatecall` leidžia sutarčiai vykdyti kodą iš kitos sutarties, veikiant kviečiančiosios sutarties saugyklos kontekste. Tai gali būti pavojinga, jei iškviesta sutartis yra nepatikima arba joje yra piktavališko kodo, nes ji gali potencialiai perrašyti kviečiančiosios sutarties saugyklą ir perimti sutarties kontrolę. Tai ypač aktualu naudojant tarpinių serverių (proxy) modelius.

Pavyzdys: Tarpinio serverio sutartis, kuri naudoja `delegatecall` persiųsti iškvietimus į įgyvendinimo sutartį, gali būti pažeidžiama, jei įgyvendinimo sutartis yra pažeista. Puolėjas galėtų įdiegti piktavališką įgyvendinimo sutartį ir apgauti tarpinio serverio sutartį, kad ji deleguotų iškvietimus jai, leisdamas perrašyti tarpinio serverio sutarties saugyklą ir perimti sutarties kontrolę.

Mažinimo priemonės:

Neapdorotos išimtys

Aprašymas: Netinkamai tvarkant išimtis gali kilti netikėta elgsena ir saugumo spragos. Kai įvyksta išimtis, transakcija paprastai atmetama, bet jei išimtis netinkamai apdorojama, sutarties būsena gali likti nenuosekli arba pažeidžiama. Tai ypač svarbu sąveikaujant su išorinėmis sutartimis.

Pavyzdys: Sutartis, kuri iškviečia išorinę sutartį žetonams pervesti, bet netikrina klaidų, gali būti pažeidžiama, jei išorinė sutartis atmeta transakciją. Jei kviečianti sutartis neapdoroja klaidos, jos būsena gali likti nenuosekli, potencialiai sukeldama lėšų praradimą.

Mažinimo priemonės:

Aplenkimas (Front Running)

Aprašymas: Aplenkimas įvyksta, kai puolėjas stebi laukiančią transakciją ir pateikia savo transakciją su didesne dujų kaina, kad ji būtų įvykdyta anksčiau nei pradinė transakcija. Tai gali būti naudojama siekiant gauti pelno iš pradinės transakcijos arba manipuliuoti jos rezultatu. Tai paplitę decentralizuotose biržose (DEX).

Pavyzdys: Puolėjas galėtų aplenkti didelį pirkimo pavedimą DEX biržoje, pateikdamas savo pirkimo pavedimą su didesne dujų kaina, taip padidindamas turto kainą prieš įvykdant pradinį pavedimą. Tai leidžia puolėjui pasipelnyti iš kainos padidėjimo.

Mažinimo priemonės:

Trumpo adreso ataka

Aprašymas: Trumpo adreso ataka, taip pat žinoma kaip užpildymo (padding) ataka, išnaudoja spragas, kaip kai kurios išmaniosios sutartys tvarko adresus. Pateikdami trumpesnį adresą nei tikėtasi, puolėjai gali manipuliuoti įvesties duomenimis ir potencialiai peradresuoti lėšas arba sukelti nenumatytą funkcionalumą. Ši spraga ypač aktuali naudojant senesnes Solidity versijas arba sąveikaujant su sutartimis, kurios neįgyvendino tinkamo įvesties patvirtinimo.

Pavyzdys: Įsivaizduokite žetonų pervedimo funkciją, kuri tikisi 20 baitų adreso kaip įvesties. Puolėjas galėtų pateikti 19 baitų adresą, ir EVM galėtų užpildyti adresą nuliniu baitu. Jei sutartis tinkamai nepatikrina ilgio, tai galėtų lemti, kad lėšos būtų išsiųstos ne į tą adresą, kuris buvo numatytas.

Mažinimo priemonės:

Išmaniųjų sutarčių audito metodikos

Išmaniųjų sutarčių auditas yra daugialypis procesas, apimantis rankinės analizės, automatizuotų įrankių ir formalių verifikavimo metodų derinį. Štai pagrindinių metodikų apžvalga:

Rankinė kodo peržiūra

Rankinė kodo peržiūra yra išmaniųjų sutarčių audito pagrindas. Tai apima saugumo eksperto atidų šaltinio kodo nagrinėjimą, siekiant nustatyti galimas spragas, logines klaidas ir nukrypimus nuo geriausių praktikų. Tam reikalingas gilus išmaniųjų sutarčių saugumo principų, dažnų atakų vektorių ir audituojamos sutarties specifinės logikos supratimas. Auditorius turi suprasti numatytą funkcionalumą, kad galėtų tiksliai nustatyti neatitikimus ar spragas.

Pagrindiniai žingsniai:

Automatizuotos analizės priemonės

Automatizuotos analizės priemonės gali padėti supaprastinti audito procesą, automatiškai aptikdamos dažnas spragas ir kodo „kvapus“. Šios priemonės naudoja statinės analizės metodus potencialioms saugumo problemoms nustatyti, faktiškai nevykdant kodo. Tačiau automatizuotos priemonės nepakeičia rankinės kodo peržiūros, nes jos gali nepastebėti subtilių spragų arba pateikti klaidingai teigiamų rezultatų.

Populiarios priemonės:

Fuzzing'as (Fuzz testavimas)

Fuzzing'as yra dinaminio testavimo technika, kuri apima išmaniosios sutarties maitinimą dideliu skaičiumi atsitiktinių arba pusiau atsitiktinių įvesčių, siekiant nustatyti potencialias spragas ar netikėtą elgesį. Fuzzing'as gali padėti atskleisti klaidas, kurias galėjo praleisti statinės analizės įrankiai ar rankinė kodo peržiūra. Tačiau fuzzing'as nėra išsami testavimo technika ir turėtų būti naudojama kartu su kitomis audito metodikomis.

Populiarūs Fuzzing įrankiai:

Formali verifikacija

Formali verifikacija yra griežčiausias metodas išmaniųjų sutarčių teisingumui ir saugumui užtikrinti. Ji apima matematinių metodų naudojimą, siekiant formaliai įrodyti, kad išmanioji sutartis atitinka iš anksto nustatytą specifikacijų rinkinį. Formali verifikacija gali suteikti aukštą patikinimo lygį, kad išmanioji sutartis neturi klaidų ir spragų, tačiau tai taip pat yra sudėtingas ir daug laiko reikalaujantis procesas.

Pagrindiniai žingsniai:

Įrankiai:

Klaidų medžiojimo programos (Bug Bounty Programs)

Klaidų medžiojimo programos skatina saugumo tyrėjus ieškoti ir pranešti apie spragas išmaniosiose sutartyse. Siūlydamos atlygį už pagrįstus pranešimus apie klaidas, klaidų medžiojimo programos gali padėti nustatyti spragas, kurias galėjo praleisti vidinės audito pastangos. Šios programos sukuria nuolatinį grįžtamojo ryšio ciklą, dar labiau sustiprindamos išmaniosios sutarties saugumo poziciją. Užtikrinkite, kad klaidų medžiojimo programos apimtis būtų aiškiai apibrėžta, nurodant, kurios sutartys ir spragų tipai yra programos apimtyje, taip pat dalyvavimo ir atlygio paskirstymo taisyklės. Platformos, tokios kaip Immunefi, palengvina klaidų medžiojimo programų vykdymą.

Geriausios praktikos saugiam išmaniųjų sutarčių kūrimui

Spragų prevencija iš pat pradžių yra efektyviausias būdas užtikrinti išmaniųjų sutarčių saugumą. Štai keletas geriausių praktikų saugiam išmaniųjų sutarčių kūrimui:

Kaip pasirinkti išmaniųjų sutarčių auditorių

Tinkamo auditoriaus pasirinkimas yra labai svarbus jūsų išmaniųjų sutarčių saugumui užtikrinti. Štai keletas veiksnių, į kuriuos reikia atsižvelgti renkantis auditorių:

Išmaniųjų sutarčių audito ateitis

Išmaniųjų sutarčių audito sritis nuolat vystosi, atrandant naujas spragas ir atsirandant naujoms technologijoms. Štai keletas tendencijų, kurios formuoja išmaniųjų sutarčių audito ateitį:

Išvada

Išmaniųjų sutarčių auditas yra kritinis procesas, užtikrinantis blokų grandinės programų saugumą ir patikimumą. Suprasdami dažniausiai pasitaikančias spragas, įgyvendindami saugaus kodavimo praktikas ir atlikdami nuodugnius auditus, kūrėjai gali sumažinti saugumo pažeidimų riziką ir apsaugoti savo vartotojų turtą. Blokų grandinės ekosistemai toliau augant, išmaniųjų sutarčių audito svarba tik didės. Proaktyvios saugumo priemonės, kartu su besivystančiomis audito metodikomis, yra būtinos norint skatinti pasitikėjimą ir skatinti blokų grandinės technologijos pritaikymą visame pasaulyje. Atminkite, kad saugumas yra nuolatinis procesas, o ne vienkartinis įvykis. Reguliarūs auditai, kartu su nuolatiniu stebėjimu ir priežiūra, yra labai svarbūs ilgalaikiam jūsų išmaniųjų sutarčių saugumui palaikyti.