Перейти до основного вмісту

Контрольний список безпеки смарт-контрактів

смарт-контракти
безпека
Solidity
Середній рівень
Trailofbits
7 вересня 2020 р.
2 хвилин на читання

Контрольний список розробки смарт-контрактів

Ось високорівневий процес, якого ми рекомендуємо дотримуватися під час написання смарт-контрактів.

Перевірте на наявність відомих проблем безпеки:

  • Перевірте свої контракти за допомогою Слізер (opens in a new tab). Він має понад 40 вбудованих детекторів поширених вразливостей. Запускайте його під час кожного додавання нового коду та переконайтеся, що звіт не містить помилок (або використовуйте режим сортування, щоб приховати певні проблеми).
  • Перевірте свої контракти за допомогою Crytic (opens in a new tab). Він перевіряє на наявність 50 проблем, які не виявляє Слізер. Crytic також може допомогти вашій команді бути в курсі справ, легко виявляючи проблеми безпеки в Pull Requests на GitHub.

Враховуйте особливості вашого контракту:

  • Чи підтримують ваші контракти можливість оновлення? Перевірте код оновлення на наявність недоліків за допомогою slither-check-upgradeability (opens in a new tab) або Crytic (opens in a new tab). Ми задокументували 17 способів, як оновлення можуть піти не за планом.
  • Чи заявлено, що ваші контракти відповідають стандартам ERC? Перевірте їх за допомогою slither-check-erc (opens in a new tab). Цей інструмент миттєво виявляє відхилення від 6 поширених специфікацій.
  • Чи інтегруєте ви сторонні токени? Перегляньте наш контрольний список інтеграції токенів, перш ніж покладатися на зовнішні контракти.

Візуально перевірте критичні функції безпеки вашого коду:

  • Перегляньте принтер inheritance-graph (opens in a new tab) інструменту Слізер. Уникайте ненавмисного перекриття та проблем з лінеаризацією C3.
  • Перегляньте принтер function-summary (opens in a new tab) інструменту Слізер. Він звітує про видимість функцій та контроль доступу.
  • Перегляньте принтер vars-and-auth (opens in a new tab) інструменту Слізер. Він звітує про контроль доступу до змінних стану.

Задокументуйте критичні властивості безпеки та використовуйте автоматизовані генератори тестів для їх оцінки:

  • Навчіться документувати властивості безпеки для вашого коду. Спочатку це складно, але це найважливіша діяльність для досягнення хорошого результату. Це також є передумовою для використання будь-яких передових методів у цьому посібнику.
  • Визначте властивості безпеки в Solidity для використання з Ехідна (opens in a new tab) та Мантікора (opens in a new tab). Зосередьтеся на вашій машині станів, контролі доступу, арифметичних операціях, зовнішніх взаємодіях та відповідності стандартам.
  • Визначте властивості безпеки за допомогою Python API інструменту Слізер. Зосередьтеся на успадкуванні, залежностях змінних, контролі доступу та інших структурних проблемах.
  • Запускайте тести властивостей під час кожного коміту за допомогою Crytic (opens in a new tab). Crytic може приймати та оцінювати тести властивостей безпеки, щоб кожен у вашій команді міг легко побачити, що вони проходять на GitHub. Тести, які не пройшли, можуть блокувати коміти.

Нарешті, пам'ятайте про проблеми, які автоматизовані інструменти не можуть легко знайти:

  • Відсутність приватності: всі інші можуть бачити ваші транзакції, поки вони стоять у черзі в пулі
  • Випередження транзакцій (front-running)
  • Криптографічні операції
  • Ризиковані взаємодії із зовнішніми компонентами децентралізованих фінансів (DeFi)

Зверніться по допомогу

Робочі години Етеріуму (opens in a new tab) проходять щовівторка у другій половині дня. Ці 1-годинні сесії у форматі 1-на-1 — це можливість поставити нам будь-які запитання щодо безпеки, вирішити проблеми за допомогою наших інструментів та отримати відгук від експертів щодо вашого поточного підходу. Ми допоможемо вам опрацювати цей посібник.

Приєднуйтесь до нашого Slack: Empire Hacking (opens in a new tab). Ми завжди доступні в каналах #crytic та #ethereum, якщо у вас виникнуть запитання.