Перейти к основному контенту

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

смарт-контракты
безопасность
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). Этот инструмент мгновенно выявляет отклонения от шести распространенных спецификаций.
  • Интегрируете ли вы сторонние токены? Изучите наш контрольный список интеграции токенов, прежде чем полагаться на внешние контракты.

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

  • Изучите принтер 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. Непройденные тесты могут блокировать коммиты.

Наконец, помните о проблемах, которые автоматизированные инструменты не могут легко обнаружить:

  • Недостаток приватности: все остальные могут видеть ваши транзакции, пока они находятся в очереди в пуле
  • Фронтраннинг транзакций
  • Криптографические операции
  • Рискованные взаимодействия с внешними компонентами децентрализованных финансов (DeFi)

Обратитесь за помощью

Приемные часы Эфириума (opens in a new tab) проходят каждый вторник во второй половине дня. Эти часовые сессии один на один — возможность задать нам любые вопросы о безопасности, устранить неполадки с помощью наших инструментов и получить отзывы от экспертов о вашем текущем подходе. Мы поможем вам разобраться в этом руководстве.

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