Smart kontrakty są samowykonalnymi umowami, w których warunki umowy między kupującym a sprzedającym są bezpośrednio zapisane w liniach kodu. Kod i zawarte w nim umowy są przechowywane i replikowane w sieci blockchain.
Jako specjaliści w tworzeniu smart kontraktów, przygotowaliśmy listę powszechnych podatności smart kontraktów, które mogą dotknąć użytkowników oraz kroki, które można podjąć w celu ich zabezpieczenia.
Ataki Reentrancy
Ataki te pozwalają atakującemu na wielokrotne wywoływanie funkcji w inteligentnym kontrakcie i drenaż środków kontraktu.
W ataku reentrancji, atakujący tworzy złośliwy kontrakt, który wywołuje podatny kontrakt, a następnie czeka, aż podatny kontrakt wykona funkcję, która wysyła fundusze do kontraktu atakującego. Kontrakt atakującego natychmiast ponownie wywołuje podatny kontrakt, zanim ten zdąży zaktualizować swój stan wewnętrzny. Proces ten może być powtarzany wielokrotnie, co pozwala atakującemu na wydrenowanie funduszy podatnego kontraktu.
Ataki reentrancyjne mogą być szczególnie niebezpieczne, ponieważ często są trudne do wykrycia i mogą być przeprowadzane ukradkiem przez dłuższy czas. Mogą być również trudne do zapobieżenia, ponieważ często opierają się na lukach w projekcie podatnego kontraktu.
Aby zabezpieczyć się przed atakami reentrancji, twórcy inteligentnych kontraktów powinni wdrożyć środki takie jak użycie muteksów (mechanizmów blokujących), aby zapobiec wielokrotnemu wywoływaniu funkcji kontraktu, a także starannie przejrzeć kod kontraktu pod kątem wszelkich potencjalnych luk.
Niezamknięta wysyłka
Ta luka umożliwia atakującemu wysłanie dużej ilości tokenów do inteligentnego kontraktu, potencjalnie powodując, że zabraknie mu gazu i zawiedzie.
W przypadku ataku typu "unchecked send", atakujący tworzy złośliwy kontrakt, który wysyła dużą liczbę tokenów do podatnego kontraktu w pojedynczej transakcji. Wrażliwy kontrakt może nie mieć odpowiednich zabezpieczeń, aby obsłużyć duży napływ tokenów, co potencjalnie może spowodować, że zabraknie mu paliwa i zawiedzie. Może to spowodować, że kontrakt stanie się bezużyteczny, potencjalnie prowadząc do utraty funduszy lub aktywów przez użytkowników, którzy są zależni od kontraktu.
Niekontrolowane ataki wysyłania mogą być szczególnie niebezpieczne, ponieważ mogą być trudne do wykrycia i mogą mieć poważne konsekwencje dla użytkowników. Aby chronić przed atakami typu unchecked send, twórcy inteligentnych kontraktów powinni wdrożyć zabezpieczenia zapobiegające dużemu napływowi tokenów, takie jak ustalenie limitów ilości tokenów, które można wysłać w pojedynczej transakcji.
Przepełnienie/niedopełnienie liczby całkowitej
Ta luka występuje, gdy inteligentny kontrakt nie obsługuje poprawnie operacji arytmetycznych z udziałem liczb całkowitych, potencjalnie umożliwiając atakującemu manipulowanie stanem kontraktu.
Przepełnienie liczby całkowitej występuje, gdy wartość całkowita przekracza maksymalną wartość, która może być przechowywana w przydzielonej liczbie bitów. Może to spowodować, że wartość "zawinie się" i stanie się bardzo małą liczbą ujemną. Niedopełnienie liczby całkowitej występuje, gdy wartość całkowita spada poniżej minimalnej wartości, która może być przechowywana w przydzielonej liczbie bitów. Może to spowodować, że wartość "zawinie się" i stanie się bardzo dużą liczbą dodatnią.
Te luki mogą być wykorzystane przez atakującego do manipulowania stanem kontraktu i potencjalnie uzyskania nieautoryzowanego dostępu do funduszy lub aktywów. Na przykład, atakujący może być w stanie użyć przepełnienia liczby całkowitej, aby spowodować, że kontrakt przeleje więcej środków niż zamierzano, lub użyć niedopełnienia liczby całkowitej, aby spowodować, że kontrakt przeleje mniej środków niż zamierzano.
Aby zapobiec podatności na przepełnienie i niedopełnienie liczb całkowitych w inteligentnych kontraktach, deweloperzy powinni dokładnie przejrzeć kod i wprowadzić zabezpieczenia. Jednym ze sposobów na to jest użycie bibliotek lub narzędzi, które mogą obsługiwać operacje arytmetyczne z udziałem dużych liczb całkowitych. Inną opcją jest użycie typów danych, które są w stanie przechowywać duże wartości całkowite bez doświadczania przepełnienia lub niedopełnienia. Ważne jest, aby programiści wdrożyli te środki w celu ochrony przed podatnościami, które mogłyby zostać wykorzystane przez atakujących.
Brak kontroli dostępu
Jeśli inteligentny kontrakt nie ma odpowiednich środków kontroli dostępu, może być podatny na nieautoryzowane modyfikacje lub ataki.
Jeśli inteligentny kontrakt nie posiada odpowiednich środków kontroli dostępu, może być podatny na ataki lub nieautoryzowane modyfikacje. Na przykład, osoba atakująca może być w stanie manipulować stanem kontraktu lub uzyskać dostęp do wrażliwych danych, jeśli kontrakt nie posiada odpowiednich zabezpieczeń przed nieautoryzowanym dostępem.
W celu ochrony przed lukami związanymi z brakiem kontroli dostępu, twórcy inteligentnych kontraktów powinni wdrożyć środki takie jak użycie modyfikatorów dostępu (np. "public", "private", "internal") w celu kontroli dostępu do funkcji i danych kontraktu oraz użycie kontroli dostępu opartej na rolach w celu przyznania dostępu do określonych funkcji lub danych określonym grupom lub osobom.
Brak walidacji danych wejściowych
Jeśli inteligentny kontrakt nie weryfikuje prawidłowo danych wejściowych, może być podatny na złośliwe dane wstrzykiwane do kontraktu, potencjalnie umożliwiając atakującemu manipulowanie stanem kontraktu.
Jeśli inteligentny kontrakt nie weryfikuje prawidłowo danych wejściowych, może być podatny na wstrzyknięcie do kontraktu złośliwych danych, co potencjalnie pozwala atakującemu na manipulowanie stanem kontraktu. Na przykład, atakujący może być w stanie wykorzystać brak walidacji danych wejściowych, aby spowodować, że kontrakt przeleje środki na nieautoryzowany adres lub uzyskać dostęp do wrażliwych danych.
Aby zabezpieczyć się przed lukami związanymi z brakiem walidacji danych wejściowych, twórcy inteligentnych kontraktów powinni wdrożyć środki służące do walidacji danych, które są wprowadzane do kontraktu. Może to obejmować użycie bibliotek lub narzędzi do sprawdzania poprawności typów, zakresów i formatów danych, a także wdrożenie kontroli w celu zapewnienia, że dane spełniają określone kryteria, zanim zostaną zaakceptowane przez kontrakt.
Podsumowanie
Luki w smart kontraktach mogą mieć poważne konsekwencje dla użytkowników, w tym utratę funduszy, niemożność dostępu do aktywów oraz narażenie wrażliwych informacji osobistych lub finansowych. Ważne jest, aby deweloperzy i użytkownicy byli świadomi potencjalnych podatności i podejmowali kroki w celu ochrony przed nimi. W tym artykule omówiliśmy sposoby zabezpieczania smart kontraktów, w tym wdrażanie muteksów w celu zapobiegania wielokrotnym wywołaniom funkcji kontraktu, ustalanie limitów ilości tokenów, które można przesłać w pojedynczej transakcji, korzystanie z bibliotek lub narzędzi obsługujących operacje arytmetyczne obejmujące duże liczby całkowite, wdrażanie środków kontroli dostępu oraz walidację danych wprowadzanych do kontraktu.