Przejdź do głównej treści

Lista kontrolna integracji tokenów

Solidity
inteligentne kontrakty
bezpieczeństwo
tokeny
Średniozaawansowany
Trailofbits
13 sierpnia 2020
4 minut czytania

Postępuj zgodnie z tą listą kontrolną podczas interakcji z dowolnymi tokenami. Upewnij się, że rozumiesz ryzyko związane z każdym punktem i uzasadnij wszelkie wyjątki od tych reguł.

Dla wygody wszystkie narzędzia (opens in a new tab) Slither można uruchomić bezpośrednio na adresie tokena, na przykład:

Samouczek korzystania ze Slither

slither-check-erc 0xdac17f958d2ee523a2206206994597c13d831ec7 TetherToken

Aby postępować zgodnie z tą listą kontrolną, będziesz potrzebować następujących danych wyjściowych ze Slither dla tokena:

- slither-check-erc [target] [contractName] [optional: --erc ERC_NUMBER]
- slither [target] --print human-summary
- slither [target] --print contract-summary
- slither-prop . --contract ContractName # wymaga konfiguracji oraz użycia Echidny i Manticore

Kwestie ogólne

  • Kontrakt przeszedł audyt bezpieczeństwa. Unikaj interakcji z kontraktami, które nie mają audytu bezpieczeństwa. Sprawdź długość oceny (tzw. „poziom wysiłku”), reputację firmy zajmującej się bezpieczeństwem oraz liczbę i wagę wykrytych problemów.
  • Skontaktowałeś się z programistami. Możesz potrzebować powiadomić ich zespół o incydencie. Poszukaj odpowiednich kontaktów na blockchain-security-contacts (opens in a new tab).
  • Mają listę mailingową dotyczącą bezpieczeństwa dla krytycznych ogłoszeń. Ich zespół powinien informować użytkowników (takich jak Ty!), gdy zostaną znalezione krytyczne problemy lub gdy nastąpią aktualizacje.

Zgodność z ERC

Slither zawiera narzędzie slither-check-erc (opens in a new tab), które sprawdza zgodność tokena z wieloma powiązanymi standardami ERC. Użyj slither-check-erc, aby sprawdzić, czy:

  • Funkcje transfer i transferFrom zwracają wartość logiczną (boolean). Wiele tokenów nie zwraca wartości logicznej w tych funkcjach. W rezultacie ich wywołania w kontrakcie mogą się nie powieść.
  • Funkcje name, decimals i symbol są obecne, jeśli są używane. Te funkcje są opcjonalne w standardzie ERC-20 i mogą nie być obecne.
  • Funkcja decimals zwraca uint8. Wiele tokenów nieprawidłowo zwraca uint256. Jeśli tak jest, upewnij się, że zwracana wartość jest mniejsza niż 255.
  • Token łagodzi znany wyścig (race condition) w ERC-20 (opens in a new tab). Standard ERC-20 ma znany problem wyścigu, który musi zostać złagodzony, aby zapobiec kradzieży tokenów przez atakujących.
  • Token nie jest tokenem ERC-777 i nie ma wywołań funkcji zewnętrznych w transfer i transferFrom. Zewnętrzne wywołania w funkcjach transferu mogą prowadzić do ataków typu reentrancy.

Slither zawiera narzędzie slither-prop (opens in a new tab), które generuje testy jednostkowe i właściwości bezpieczeństwa mogące odkryć wiele typowych błędów ERC. Użyj slither-prop, aby sprawdzić, czy:

Wreszcie, istnieją pewne cechy, które trudno zidentyfikować automatycznie. Sprawdź te warunki ręcznie:

  • Funkcje transfer i transferFrom nie powinny pobierać opłaty. Tokeny deflacyjne mogą prowadzić do nieoczekiwanego zachowania.
  • Potencjalne odsetki zarobione z tokena są brane pod uwagę. Niektóre tokeny dystrybuują odsetki do posiadaczy tokenów. Odsetki te mogą zostać uwięzione w kontrakcie, jeśli nie zostaną wzięte pod uwagę.

Kompozycja kontraktu

  • Kontrakt unika niepotrzebnej złożoności. Token powinien być prostym kontraktem; token ze złożonym kodem wymaga wyższego standardu przeglądu. Użyj human-summary printer (opens in a new tab) w Slither, aby zidentyfikować złożony kod.
  • Kontrakt używa SafeMath. Kontrakty, które nie używają SafeMath, wymagają wyższego standardu przeglądu. Ręcznie sprawdź kontrakt pod kątem użycia SafeMath.
  • Kontrakt ma tylko kilka funkcji niezwiązanych z tokenem. Funkcje niezwiązane z tokenem zwiększają prawdopodobieństwo wystąpienia problemu w kontrakcie. Użyj contract-summary printer (opens in a new tab) w Slither, aby ogólnie przejrzeć kod użyty w kontrakcie.
  • Token ma tylko jeden adres. Tokeny z wieloma punktami wejścia do aktualizacji salda mogą zepsuć wewnętrzną księgowość opartą na adresie (np. balances[token_address][msg.sender] może nie odzwierciedlać rzeczywistego salda).

Uprawnienia właściciela

  • Token nie jest aktualizowalny (upgradeable). Aktualizowalne kontrakty mogą z czasem zmieniać swoje zasady. Użyj human-summary printer (opens in a new tab) w Slither, aby określić, czy kontrakt można aktualizować.
  • Właściciel ma ograniczone możliwości wybijania. Złośliwi lub skompromitowani właściciele mogą nadużywać możliwości wybijania. Użyj human-summary printer (opens in a new tab) w Slither, aby przejrzeć możliwości wybijania i rozważ ręczne przejrzenie kodu.
  • Token nie ma możliwości wstrzymania (pausable). Złośliwi lub skompromitowani właściciele mogą uwięzić kontrakty polegające na wstrzymywanych tokenach. Zidentyfikuj ręcznie kod umożliwiający wstrzymanie.
  • Właściciel nie może umieścić kontraktu na czarnej liście. Złośliwi lub skompromitowani właściciele mogą uwięzić kontrakty polegające na tokenach z czarną listą. Zidentyfikuj ręcznie funkcje czarnej listy.
  • Zespół stojący za tokenem jest znany i może zostać pociągnięty do odpowiedzialności za nadużycia. Kontrakty z anonimowymi zespołami programistów lub znajdujące się w rajach prawnych powinny wymagać wyższego standardu przeglądu.

Rzadkość tokena

Przegląd pod kątem problemów z rzadkością tokena wymaga ręcznej weryfikacji. Sprawdź następujące warunki:

  • Żaden użytkownik nie posiada większości podaży. Jeśli kilku użytkowników posiada większość tokenów, mogą oni wpływać na operacje w oparciu o podział tokena.
  • Całkowita podaż jest wystarczająca. Tokeny o niskiej całkowitej podaży mogą być łatwo manipulowane.
  • Tokeny znajdują się na więcej niż kilku giełdach. Jeśli wszystkie tokeny znajdują się na jednej giełdzie, kompromitacja giełdy może skompromitować kontrakt polegający na tym tokenie.
  • Użytkownicy rozumieją powiązane ryzyko związane z dużymi funduszami lub pożyczkami błyskawicznymi (flash loans). Kontrakty polegające na saldzie tokenów muszą dokładnie brać pod uwagę atakujących dysponujących dużymi funduszami lub ataki za pomocą pożyczek błyskawicznych.
  • Token nie pozwala na błyskawiczne wybijanie (flash minting). Błyskawiczne wybijanie może prowadzić do znacznych wahań salda i całkowitej podaży, co wymaga rygorystycznych i kompleksowych kontroli pod kątem przepełnienia w działaniu tokena.