Kokios yra dažniausios tiltų saugumo spragos?
Pradžia
Straipsniai
Kokios yra dažniausios tiltų saugumo spragos?

Kokios yra dažniausios tiltų saugumo spragos?

Paskelbta Mar 22, 2023Naujinta Jun 15, 2023
9m

Šis straipsnis yra bendruomenės pasiūlymas. Jo autorius – „CertiK“ auditorius Minzhi He.

Šiame straipsnyje pateikiamos bendraautoriaus / autoriaus nuomonės, kurios nebūtinai atspindi Binance Academy požiūrį.

TL;DR

Blokų grandinių tiltai yra labai svarbūs siekiant funkcinio suderinamumo blokų grandinių erdvėje. Taigi tilto saugumas yra itin svarbus. Tarp dažniausių tiltų saugumo spragų yra silpnas grandinės ir užgrandininių sandorių patvirtinimas, netinkamas vietinių žetonų tvarkymas ir netinkamos konfigūracijos. Siekiant užtikrinti patikimą tikrinimo logiką, rekomenduojama tikrinti visus tiltams naudojamus atakų vektorius.

Įvadas 

Blokų grandinių tiltas – tai protokolas, jungiantis dvi blokų grandines ir leidžiantis vykti sąveikoms tarp jų. Jei turite bitkoinų, bet norite dalyvauti DeFi veikloje Ethereum tinkle, blokų grandinių tiltas leidžia tai padaryti neparduodant savo bitkoinų. 

Blokų grandinių tiltai yra itin svarbūs siekiant funkcinio suderinamumo blokų grandinių erdvėje. Jie naudoja įvairius grandinės ir užgrandininių sandorių patvirtinimus, todėl turi įvairių saugumo spragų.

Kodėl tilto saugumas yra toks svarbus? 

Tilte paprastai laikomas žetonas, kurį vartotojas nori perkelti iš vienos grandinės į kitą. Tiltai dažnai diegiami kaip išmanieji sandoriai. Kaupiantis kryžminiams grandinių perkėlimams, tiltuose laikomi dideli kiekiai žetonų, todėl jie tampa pelningais taikiniais įsilaužėliams. 

Be to, blokų grandinių tiltai turi didelę erdvę atakoms, nes juos sudaro daug komponentų. Atsižvelgdami į tai, piktavališkai nusiteikę veikėjai yra labai motyvuoti taikytis į kryžminių grandinių programas, kad galėtų pasisavinti dideles fondų sumas. 

„CertiK“ skaičiavimais, 2022 m. dėl tiltų atakų patirta daugiau nei 1,3 mlrd. USD nuostolių, o tai sudaro 36 % visų metinių nuostolių. 

Dažniausios tiltų saugumo spragos

Norint padidinti tiltų saugumą, svarbu suprasti, kokios yra dažniausios tiltų saugumo spragos, ir tikrinti tiltus prieš juos paleidžiant. Šias spragas galima suskirstyti į keturias kategorijas. 

Silpnas grandinės sandorių patvirtinimas

Diegiant paprastus tiltus, ypač tuos, kurie skirti konkrečioms DApp programoms, grandinės patvirtinimas yra minimalus. Tokios pagrindinės šių tiltų operacijos, kaip monetų kaldinimas, deginimas ir žetonų perkėlimai, priklauso nuo centralizuotų vidinių procesų, o visi patikrinimai atliekami užgrandininių sandorių metu.

Palyginimui, kitų tipų tiltai pranešimams patvirtinti ir tikrinimams grandinėje atlikti naudoja išmaniuosius sandorius. Tokiu atveju, kai vartotojas deponuoja fondus grandinėje, išmanusis sandoris sugeneruoja pasirašytą pranešimą ir grąžina parašą operacijoje. Šis parašas yra deponavimo įrodymas, naudojamas vartotojo išėmimo prašymui kitoje grandinėje patikrinti. Šis procesas turėtų padėti išvengti įvairių saugumo atakų, įskaitant pakartotines atakas ir suklastotus deponavimo įrašus. 

Vis dėlto, jei grandinės patvirtinimo procese yra spraga, įsilaužėlis gali padaryti daug žalos. Pavyzdžiui, jei operacijos įrašui patvirtinti tiltas naudoja Merkle medį, įsilaužėlis gali sugeneruoti suklastotus įrodymus. Tai reiškia, kad patvirtinimo procese esant sprangų, įsilaužėlis gali apeiti įrodymų patvirtinimą ir nukaldinti naujų žetonų į savo sąskaitą.

Tam tikruose tiltuose taikoma Wrapped žetonų koncepcija. Pavyzdžiui, kai vartotojas perkelia DAI iš Ethereum į BNB grandinę, jo DAI yra paimami iš Ethereum sandorio, o BNB grandinėje išduodamas lygiavertis Wrapped DAI kiekis. 

Tačiau jei ši operacija nėra tinkamai patvirtinta, įsilaužėlis, manipuliuodamas funkciją, gali sudaryti kenkėjišką sandorį ir nukreipti Wrapped žetonus iš tilto į neteisingą adresą. 

Įsilaužėliams taip pat reikia, kad aukos patvirtintų tilto sandorį – tada jie gali perkelti žetonus naudodami funkciją „transferFrom“ ir taip pasisavinti tilto sandorio turtą. 

Deja, situacija blogina tai, kad daugelis tiltų iš DApp vartotojų reikalauja neriboto žetonų patvirtinimo. Tai yra įprasta praktika, dėl kurios sumažėja kuro mokesčiai, tačiau kyla papildoma rizika, nes išmanusis sandoris gali naudotis neribotu vartotojo piniginėje esančių žetonų skaičiumi. Įsilaužėliai gali pasinaudoti patvirtinimo nebuvimu ir per daug griežtu patvirtinimu, kad galėtų perkelti kitų vartotojų žetonus sau.

Silpnas užgrandininių sandorių patvirtinimas

Kai kuriose tiltų sistemose užgrandininių sandorių vidinis serveris atlieka svarbų vaidmenį tikrinant iš blokų grandinės siunčiamų pranešimų teisėtumą. Šiuo atveju daugiausia dėmesio skiriame deponavimo operacijų tikrinimui. 

Blokų grandinių tiltas su užgrandininių sandorių patvirtinimu veikia toliau aprašytu būdu. 

  1. Vartotojai sąveikauja su DApp deponuodami žetonus išmaniajame sandoryje šaltinio grandinėje.

  2. Tada DApp per API siunčia deponavimo operacijos maišą į vidinį serverį.

  3. Serveris atlieka kelis operacijos maišos patvirtinimus. Jei nustatoma, kad operacija teisėta, pasirašiusysis pasirašo pranešimą ir per API grąžina parašą į vartotojo sąsają.

  4. Gavusi parašą, DApp jį patikrina ir leidžia vartotojui atsiimti savo žetonus iš tikslinės grandinės.

Vidinis serveris turi užtikrinti, kad jo apdorojama deponavimo operacija iš tikrųjų įvyko ir nebuvo suklastota. Šis vidinis serveris nustato, ar vartotojas gali atsiimti žetonus tikslinėje grandinėje, todėl yra aukštos vertės įsilaužėlių taikinys.

Vidinis serveris turi patvirtinti operacijos suaktyvinto įvykio struktūrą ir įvykį suaktyvinusį sandorio adresą. Jei tai nepadaroma, įsilaužėlis gali įdiegti kenkėjišką sandorį, kad suklastotų deponavimo įvykį, kurio struktūra būtų tokia pati kaip teisėto deponavimo įvykio. 

Jei vidinis serveris nepatikrins, kuris adresas suaktyvino įvykį, jis laikys tai galiojančia operacija ir pasirašys pranešimą. Tada įsilaužėlis gali nusiųsti operacijos maišą į vidinę sistemą, taip apeidamas patikrinimą ir galėdamas atsiimti žetonus iš tikslinės grandinės.

Netinkamas vietinių žetonų tvarkymas

Tiltai skirtingai tvarko vietinius ir paslaugų žetonus. Pavyzdžiui, Ethereum tinkle vietinis žetonas yra ETH, o dauguma paslaugų žetonų atitinka ERC-20 standartą. 

Kai vartotojas ketina perkelti savo ETH į kitą grandinę, pirmiausia jis turi deponuoti juos tilto sandoryje. Norėdamas tai padaryti vartotojas tiesiog prideda ETH prie operacijos, o ETH sumą galima gauti nuskaičius operacijos lauką „msg.value“.

ERC-20 žetonų deponavimas labai skiriasi nuo ETH deponavimo. Norėdamas deponuoti ERC-20 žetoną, vartotojas pirmiausia turi leisti tilto sandoriui išleisti jo žetonus. Jam tai patvirtinus ir deponavus žetonus tilto sandoryje, sandoris sudegins vartotojo žetonus naudodamas funkciją „burnFrom()“ arba perkels vartotojo žetonus į sandorį naudodamas funkciją „transferFrom()“. 

Vienas iš būdų tai atskirti – toje pačioje funkcijoje naudoti teiginį „if-else“. Kitas būdas – sukurti dvi atskiras funkcijas kiekvienam scenarijui tvarkyti. Bandant deponuoti ETH naudojant ERC-20 deponavimo funkciją, galima prarasti šiuos fondus.

Tvarkydami ERC-20 deponavimo užklausas, vartotojai paprastai kaip įvesties duomenis deponavimo funkcijai pateikia žetono adresą. Tai kelia didelę riziką, nes operacijos metu gali atsirasti nepatikimų išorinių iškvietimų. Norint sumažinti riziką, įprasta naudoti baltąjį sąrašą, kuriame yra tik tilto palaikomi žetonai. Kaip argumentus leidžiama perduoti tik į baltąjį sąrašą įtrauktus adresus. Taip užkertamas kelias išoriniams iškvietimams, nes projekto komanda jau yra atlikusi filtravimą pagal žetono adresą.

Vis dėlto, problemų gali kilti ir tada, kai tiltai atlieka kryžminį vietinių žetonų perdavimą tarp grandinių, nes vietiniai žetonai neturi adreso. Nulinis adresas (0x000...0) reiškia vietinį žetoną. Tai gali būti problemiška, nes perduodant nulinį adresą į funkciją galima apeiti baltojo sąrašo patikrinimą, net jei tai įvykdoma netinkamai. 

Kai tilto sandoris iškviečia funkciją „transferFrom“, kad vartotojo turtas būtų perkeltas į sandorį, išorinis iškvietimas į nulinį adresą grąžina „false“, nes nuliniame adrese nėra įvykdyta funkcija „transferFrom“. Tačiau operacija vis tiek gali įvykti, jei sandoryje nėra tinkamai tvarkoma grąžinama vertė. Tai suteikia galimybę įsilaužėliams įvykdyti operaciją neperkeliant jokių žetonų į sandorį.

Netinkama konfigūracija

Daugumoje blokų grandinių tiltų privilegijuotasis vaidmuo yra atsakingas už žetonų ir adresų įtraukimą į baltąjį arba juodąjį sąrašą, pasirašančiųjų priskyrimą arba keitimą ir kitas svarbias konfigūracijas. Labai svarbu užtikrinti, kad visos konfigūracijos būtų tikslios, nes net iš pirmo žvilgsnio nereikšmingos klaidos gali lemti didelius nuostolius.

Buvo atvejis, kai dėl netinkamos konfigūracijos įsilaužėlis sėkmingai apėjo perkėlimo įrašo patikrinimą. Likus kelioms dienoms iki įsilaužimo,projekto komanda įdiegė protokolo atnaujinimą, kurio metu buvo pakeistas kintamasis. Kintamasis buvo naudojamas patikimo pranešimo numatytajai reikšmei nurodyti. Dėl šio pakeitimo visi pranešimai buvo automatiškai laikomi įrodytais, todėl įsilaužėlis galėjo pateikti atsitiktinį pranešimą ir sėkmingai praeiti tikrinimo procesą.

Kaip pagerinti tilto saugumą

Keturios ankščiau paaiškintos dažniausios tiltų spragos rodo, kokie iššūkiai kyla siekiant užtikrinti saugumą tarpusavyje sujungtų blokų grandinių ekosistemoje. Sprendžiant kiekvieną iš šių spragų reikia skirti ypatingą dėmesį, ir nėra vienos instrukcijos, kuri tiktų visoms. 

Pavyzdžiui, nėra lengva pateikti bendras gaires, kaip užtikrinti, kad tikrinimo procesas vyktų be klaidų, nes kiekvienam tiltui taikomi unikalūs tikrinimo reikalavimai. Veiksmingiausias būdas išvengti patikrinimo apėjimo – kruopščiai tikrinti visus tiltams naudojamus atakų vektorius ir užtikrinti, kad patikrinimo logika būtų patikima. 

Apibendrinant galima teigti, kad labai svarbu atlikti kruopštų patikrinimą dėl galimų atakų ir atkreipti ypatingą dėmesį į dažniausias tiltų saugumo spragas.  

Baigiamosios mintys 

Dėl didelės vertės kryžminių grandinių tiltai jau seniai yra tapę įsilaužėlių taikiniu. Kūrėjai gali sustiprinti tiltų saugumą atlikdami išsamius patikrinimus prieš diegdami ir dalyvaudami trečiųjų šalių audituose, taip sumažindami pražūtingų įsilaužimų, kurie pastaruosius kelerius metus vyko tiltuose, riziką. Ten, kur yra daug grandinių, tiltai yra labai svarbūs, tačiau projektuojant ir kuriant veiksmingą Web3 infrastruktūrą, svarbiausias rūpestis turi būti saugumas.

Papildoma literatūra

Kas yra blokų grandinės tiltas?

Kas yra kryžminės grandinės funkcinis suderinamumas?

Trys populiarūs kriptovaliutų tiltai ir kaip jie veikia

Kas yra Wrapped žetonai?

Atsakomybės atsisakymas ir įspėjimas dėl rizikos. Šis turinys jums pateikiamas toks, koks yra tik bendro informavimo ir švietimo tikslais ir nesuteikia jokios garantijos bei nieko neteigia. Šis tekstas neturėtų būti suprantamas kaip finansinis, teisinis ar kitoks profesionalo patarimas, taip pat nesiekiama rekomenduoti įsigyti kokį nors konkretų produktą ar paslaugą. Turėtumėte patys kreiptis patarimo į atitinkamus profesionalius patarėjus. Jei straipsnį pateikė trečiosios šalies bendraautorius, atkreipkite dėmesį, kad išsakytos nuomonės priklauso trečiosios šalies bendraautoriui ir nebūtinai atspindi „Binance Academy“ nuomonę. Daugiau informacijos rasite perskaitę visą atsakomybės atsisakymą čia. Skaitmeninių išteklių kainos gali būti nepastovios. Jūsų investicijos vertė gali sumažėti arba padidėti, o investuotos sumos galite ir neatgauti. Tik jūs esate atsakingas už savo investicinius sprendimus, o „Binance Academy“ nėra atsakinga už jokius jūsų patirtus nuostolius. Ši medžiaga neturėtų būti suprantama kaip finansinis, teisinis ar profesionalo patarimas. Jei reikia daugiau informacijos žr. mūsų naudojimo sąlygas ir įspėjimą dėl rizikos.