Защита смарт-контрактов Solidity с помощью Echidna Fuzzer

Защита смарт-контрактов Solidity с помощью Echidna Fuzzer

21 октября 2022 г.

Приветствую вас, дорогие читатели! Сегодняшнее эссе является следующим в серии, посвященной творческим решениям проблем, с которыми может столкнуться одитор. В моей предыдущей статье я описал Slither и как им пользоваться; но сегодня я хотел бы обсудить фаззинг и инструмент для него, Echidna.

<цитата>

Но сначала небольшой отказ от ответственности: я, Officer_CIA, в настоящее время являюсь сотрудником Pessimistic.io и изначально написал эту статью в корпоративном блоге, чтобы привлечь интерес к проекту.

Я хочу быть честным со своими читателями, поэтому сразу упомяну об этом факте, надеюсь, я смог принести пользу сообществу и не переступить черту недобросовестной рекламы. Спасибо за внимание.

Прежде всего, я хотел бы выразить нашу искреннюю благодарность создателям этого инструмента, всем, кто его поддерживает, авторам всех ресурсных материалов и, конечно же, штатным аудиторам, которые помогли мне раскрыть столь необходимую информацию и поднять завеса тайны.

И сегодня, дорогие читатели, он будет доступен для вас. В этой серии я сосредоточусь только на тех аспектах, которые могут быть действительно полезны для аудита и хакерского вознаграждения за обнаружение ошибок и которые не описаны где угодно!


I — Фаззинг: запуск

Давайте ознакомимся с основами, прежде чем переходить к сложному материалу. Что это за фаззинг и как его могут использовать исследователи безопасности, этичные хакеры и охотники за ошибками?

researchgate.net/figure/Working-process-of-fuzzing_fig1_334986695

Нечеткое тестирование, также известное как фаззинг, представляет собой метод автоматизированного тестирования программного обеспечения, используемый для выявления недостатков приложений, угроз безопасности и уязвимостей. Целью использования инструмента фаззинга является введение в приложение ошибочных, неподходящих или неожиданных входных данных и отслеживание реакции системы на них (например, исключения, утечка информации или сбои приложения).

Фаззеры для традиционного программного обеспечения (например, LibFuzzer) известны своей эффективностью. инструменты для поиска ошибок. Помимо чисто случайного создания входных данных, существует множество методов и стратегий для получения хороших входных данных, в том числе:

* Получайте отзывы о каждом выполнении и направляйте генерацию с их помощью. Например, если вновь сгенерированный ввод приводит к открытию нового пути, имеет смысл сгенерировать новые входы, наиболее близкие к нему. * Генерация входных данных относительно структурного ограничения. Например, если ваши входные данные содержат заголовок с контрольной суммой, имеет смысл позволить фаззеру генерировать входные данные для проверки контрольной суммы. * Используйте известные входные данные для создания новых входных данных. Если у вас есть доступ к большому набору данных действительных входных данных, ваш фаззер может генерировать из них новые входные данные, а не начинать с нуля для каждого поколения. Обычно они называются идентификаторами.

tutorialspoint.com/software_testing_dictionary/fuzz_testing.htm

Ехидна является частью семейства фаззинга, называемого фаззингом на основе свойств. Это программа Haskell, предназначенная для фаззинга/тестирования на основе свойств смарт-контрактов Ethereum, в которой используются сложные кампании фаззинга на основе грамматики на основе контракт с ABI для фальсификации пользовательских предикатов или Утверждения надежности.

Вместо того чтобы искать сбои, как традиционный фаззер, Echidna попытается сломать пользовательские инварианты.

researchgate.net/publication/343048222_Echidna_effective_usable_and_fast_fuzzing_for_smart_contracts

Особенности Ехидны:

  • Создает входные данные, адаптированные к вашему фактическому коду.
  • Необязательный сбор корпуса, изменение и руководство по покрытию для поиска более глубоких ошибок.
  • Разработано Slither, чтобы извлечь полезную информацию перед фаззинговой кампанией.
  • Интеграция исходного кода для определения того, какие строки будут обработаны после кампании фаззинга.
  • Ретро-интерфейс на основе Curses, только текст или вывод в формате JSON.
  • Автоматическая минимизация тестовых наборов для быстрой сортировки.
  • Полная интеграция в рабочий процесс разработки, но, судя по нашему опыту в этом случае, инструмент может вести себя непредсказуемо и успех не гарантирован.
  • Отчеты о максимальном потреблении газа в кампании фаззинга.

II — Фаззинг с Ехидной

В смарт-контрактах инвариантами являются функции Solidity, которые могут представлять любое неправильное или недопустимое состояние, которое может достичь контракт, в том числе:

* Некорректный контроль доступа: злоумышленник стал владельцем контракта. * Неправильный конечный автомат: токены могут быть переданы, пока контракт приостановлен. * Неверная арифметика: пользователь может уменьшить свой баланс и получить неограниченное количество бесплатных токенов.

https://www.youtube.com/watch?v=vCTnI2nDnAw&feature =emb_imp_woyt?embedable=true

Echidna может тестировать контракты, скомпилированные с помощью различных систем сборки смарт-контрактов, включая Hardhat, Foundry, Truffle и даже те, которые написаны на Vyper, — все, что поддерживается crytic-compile. Echidna также поддерживает два режима тестирования сложных контрактов:

* Во-первых, можно описать процедуру инициализации с помощью Truffle и Etheno и использовать ее в качестве базового состояния для Echidna. * Во-вторых, Ехидна может вызвать любой контракт с известным ABI, передав соответствующий источник твердости в CLI. * Echidna поддерживает три различных драйвера вывода. Существует текстовый драйвер по умолчанию, драйвер json и драйвер без драйверов, который должен подавлять весь вывод stdout.


III — Установка и установка Боевое применение ехидны

Информация, представленная ниже, в основном основана на данных, полученных нами в ходе аудитов Pessimistic.io, некоторые из них достаточно подробны, чтобы вы могли их изучить и лучше понять суть нашей работы и применение в ней фаззинга. Запомните несколько важных утверждений. Они пригодятся вам при запуске программы:

* Slither требуется для корректного запуска Echidna. * Установка производится в зависимости от используемой ОС. * Обратите внимание на устанавливаемую версию, всегда устанавливайте последнюю версию (и не забывайте обновлять).

Мы рекомендуем эту процедуру для фаззинга контрактов с Ехидной. Он заблаговременно обнаруживает ошибки конфигурации и помогает бесперебойно запускать Echidna:

* Скомпилируйте целевой проект. * Выполнить Slither. Если не запускается, внесите изменения в проект/решите проблему любым другим способом. * Запустите Ехидну. Запустите echidna без каких-либо свойств следующим образом: « n — echinda-test . — контракт контракт — утверждение тестового режима. » * Если не запускается, модифицируйте/обновите echidna в соответствии с сообщениями терминала. * Создайте тестовый контракт. Наследуйте целевой контракт, напишите простое базовое свойство, попробуйте еще раз. * Напишите полноценное свойство, а затем начните фаззинг.

Также узнайте, как оптимизировать Echidna, в этой статье из Trail of Bits! Имейте в виду, что оптимизация программ на Haskell сильно отличается от оптимизации императивных программ, поскольку порядок выполнения часто сильно отличается от порядка написания кода!


IV — Ограничения и ограничения Известные проблемы

Ехидна имеет довольно много ограничений в последней версии. Некоторые из них унаследованы от hevm, а некоторые являются результатом решений по дизайну/производительности или просто ошибками в код.

Проблемы перечислены ниже:

  • Информации об отладке может быть недостаточно.
  • Vyper ограничена.
  • Ограниченная поддержка библиотек для тестирования.
  • Если контракт не связан должным образом, Echidna выйдет из строя.
  • Утверждения не обнаруживаются во внутренних транзакциях.
  • Создание значения может завершиться ошибкой в ​​режиме мульти-аби, так как хэш функции недостаточно точен.

Также имейте в виду, что Brownie строит интерфейсы по-своему, поэтому это невозможно< /strong> для запуска Slither непосредственно на этой платформе (проблема на стороне slither) из-за к ошибкам критической компиляции. Решение состоит в том, чтобы перейти на другую платформу (Truffle, Hardhat, Foundry).

Также могут возникнуть следующие проблемы:

  • Утверждение тестового режима не работает для контрактов ^0.8, если установлена ​​версия Echidna старше 2.0.0.
  • Если в проекте используются библиотеки, все функции в них должны быть внутренними.
  • Slither борется с тернарными выражениями, вам часто придется переписывать их как обычные if .
  • Если проект не находит ошибку в простом свойстве, то он требует/отменяется внутри проекта. Попробуйте перенастроить проект так, чтобы требовались проходы.
  • Ехидна IllegalOverflow ошибка появляется, когда вы хотите ограничить параметры затрат газа на вызовы функций в конфиге.

При этом следует также отметить, что ни один инструмент тестирования/фаззинга не является идеальным, поскольку эмуляция и тестирование EVM являются крепким орешком. Однако Echidna — отличный инструмент для работы со сложными смарт-контрактами.


V — Дополнительные советы

Приведенных выше советов достаточно для начала. Если у вас возникли проблемы, не стесняйтесь спрашивать нас об этом в комментариях!

Если вы хотите получить больше информации о трюках с ехиднами, просмотрите этот репозиторий и выберите надежную операционную систему для своей работы.

Просмотрите все перечисленные ресурсы — большинство из они являются настоящими драгоценностями и предоставляют отличные информация о том, как запустить Echidna, с примерами.

https://www.youtube.com/watch?v=EA8_9x4D3Vk?embedable=true

Используйте и другие инструменты! Например. Мантиктор (дополнительная информация) — или просто посмотрите на этот выбор и отдельно в этом сверхспециальном инструменте (2); их так много.

Самое главное, даже превосходно выполненные ручные модульные тесты не находят странные критические ошибки, которые ищут злоумышленники.

https://youtu.be/sJJaSGq0Q3Q?embedable=true

Ниже вы найдете список используемых ресурсов — они содержат много хороших руководств, которые помогут вам в работе вашего аудитора. Пользуясь случаем, отдаю дань уважения авторам!

Источники:


VI — Заключение

В заключение хотим сказать, что надеемся, что данная статья была для вас информативной и полезной! Спасибо за чтение! 🙂

Самое главное, что мы хотели вам сказать и показать, это то, что новый инструмент не значит хороший, а старый инструмент не значит плохой. Все дело в том, чтобы знать, как его использовать, и быть готовым искать что-то новое. Надеемся, мы вас заинтересовали!

:::информация Также опубликовано здесь.

:::


Оригинал