В Kleros мы очень серьезно относимся к безопасности смарт-контрактов. Раньше было не так много автоматических инструментов, которые помогли бы выявлять уязвимости в ваших смарт-контрактах. Мы разработали обширный внутренний процесс, и мы с гордостью можем сказать, что контракты Kleros никогда не имели уязвимостей в производстве.

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

Член команды Kleros, Данил Дмитриков, в марте 2020 года провел анализ наиболее популярных доступных инструментов и протестировал их в наших контрактах на набор персонала. Мы думаем, что это ценный ресурс, которым можно поделиться с сообществом. Всего нужно было найти 11 уязвимостей. Вот результат его анализа, за которым следует раздел, посвященный инструментам только для визуализации и покрытию тестов. Инструменты расположены в произвольном порядке, и вы можете пропустить их до конца, если просто хотите прочитать наши выводы и рекомендации.

Инструменты статического / динамического анализа

Скользить

Это быстро и легко. Он имеет около 40 проверок безопасности, он применяется к контрактам и показывает, являются ли какие-либо из них положительными. Иногда он отображает ложные срабатывания, хотя их немного, например, возможный повторный вход с передачами или отправками и т. Д. Из всех тестов он правильно решил только 9-й, который имеет низкоуровневый вызов и повторный вход.

Crytic.io

Он работает на движке Slither, но имеет большее количество проверок, поэтому похож на лучшую и более продуманную версию Slither. В целом он имеет аналогичные проблемы, такие как маркировка передаточной функции как небезопасной для повторного входа. По какой-то причине, несмотря на то, что у него намного больше проверок, у него нет простой проверки недополнения / переполнения (те, которые он имеет, применимы только к стандартным функциям ERC). Он правильно решил 9-й и 11-й тест. Кроме того, как и Slither, несмотря на случайные ложные срабатывания, он дает некоторые полезные предложения, такие как «изменить общедоступный на внешний», «в контракте хранится ETH, но нет возможности вывода средств» и т. Д. Однако, тем не менее, этого не произошло. t давать правильные ответы на большинство тестов.

Мантикора

Относительно медленный инструмент. Тестирование простого контракта занимает 5–10 минут, а в случае более сложного контракта просто зависает и перестает отвечать. Во время тестирования создается папка с множеством файлов анализа и одним файлом глобальной сводки. Он правильно решил 5-й (переполнение) и 9-й тесты. Он не дает много ложных срабатываний. Общий итоговый отчет обычно пуст.

Мифрил

Также относительно медленный, но более полезный, чем Мантикора. Он правильно решил около половины тестов, кроме 4-го, 7-го, 8-го, 10-го и 11-го. Замерз и перестал отвечать при анализе более сложных контрактов. Время от времени он дает ложные срабатывания, выделяя строку, в которой нет проблем. В целом это менее продвинутая версия MythX, и на их странице GitHub предлагается использовать последнюю.

MythX

Лучший инструмент среди всех проверенных. Это требует, чтобы вы зарегистрировались на платформе MythX, где вы генерируете ключ API. Вы можете использовать ключ с плагинами VSCode, Truffle или Remix. Он также работает напрямую с MythX CLI. Я перепробовал все четыре варианта. Анализ выполняется относительно быстро, и результаты отображаются на панели инструментов Myx.io. Также есть возможность выполнить углубленный анализ, но он доступен только при обновлении подписки. Согласно описанию, углубленный анализ может занять от 30 до 90 минут. В целом он правильно решил все тесты, кроме 7, 8 и 10. При анализе наших более сложных контрактов он указал на потенциальную проблему отсутствия газа из-за зацикливания, что кажется разумным.

Контрактная библиотека

Это может быть потенциально полезно. В нем есть несколько проверок уязвимостей, которые можно использовать в качестве фильтра для поиска примеров конкретной уязвимости среди развернутых контрактов. Это касается и контрактов на тестовые сети. Вы также можете выбрать уже развернутый контракт, чтобы увидеть, применимы ли к нему какие-либо проверки. Обратной стороной является то, что количество используемых проверок относительно невелико.

Securify

Инструмент онлайн-анализа. Вы загружаете договор и получаете результаты анализа. Это быстро, но количество проверок кажется очень ограниченным. Для каждого проанализированного контракта он давал почти одинаковый тип отчета, например, «контракт блокирует эфир» или «поля, которые могут быть изменены пользователем, должны быть проверены» и т. Д. Иногда дает ложные срабатывания. Правильно решил только 9-й тест (повторный вход). Также была возможность запросить аудит по контракту, но я ею не воспользовался.

SmartCheck

Улучшенная версия Securify. В нем больше проверок (но почему-то нет проверки переполнения). Проверки также носят более описательный характер, а также содержат некоторые примеры и рекомендации. Этот инструмент правильно решил 4-й, 9-й и 11-й тесты и указал на потенциальную проблему отсутствия газа в более сложных контрактах. У него также есть возможность запросить аудит контракта.

"Ехидна"

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

Ойенте

Я кратко проверил этот инструмент, он работает только для компиляторов ниже 0.4.17. Репозиторий GitHub также кажется заброшенным. Учитывая, насколько он устарел, я решил его оставить.

"Осьминог"

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

SFuzz

sFuzz также является онлайн-инструментом. Вы вставляете договор на анализ и получаете отчет. Каждый раз, когда я пытался его использовать, анализ останавливался на 95%. Один раз это не прекратилось, когда я загрузил почти пустой контракт. Я пробовал это в разных браузерах и получил тот же результат.

Инструменты визуализации

Solidity Visual Auditor

Solidity Visual Auditor - это расширение для Visual Studio Code. Я проверил этот инструмент год назад, и с тех пор он не сильно изменился. Он выделяет определенные переменные, показывает линию, в которой они находятся, и т. Д., Что я не считаю особенно полезным.

Сурья

Surya - это инструмент, интегрированный в Solidity Visual Auditor. Это просто использовать. После установки расширения вы получаете некоторые инструменты, которые можно использовать с контрактом, такие как синтаксический анализ, рисование графика, отображение сигнатур функций и т. Д. Все они быстрые и простые в использовании. У него есть сглаживание, которое может объединить контракт со многими зависимостями в одну и может быть полезно при развертывании. Однако сглаживание работает только в том случае, если зависимости являются локальными, а ошибки при импорте ссылаются на пакет NPM, например «import« @ kleros / kleros-Interaction / контракты / библиотеки / CappedMath.sol ». Вы должны указать контракт в своей локальной папке node_modules, чтобы он работал.

Сольграф

Слишком упрощен, чтобы быть полезным. Все, что он делает, это просто рисует графики. В описании говорится, что оно также указывает на потенциальные уязвимости, но не дает никакого анализа безопасности. Если он обнаруживает уязвимость в функции, он только помечает ее как «НЕ НАДЕЖНЫЙ» без объяснения причин, и это все, что вызывает сомнения. Их репозиторий на GitHub тоже кажется устаревшим.

Пиет

Веб-приложение с функциональностью, аналогичной Surya. Также рисует графики, извлекает документацию из контракта, анализирует и т. Д. Его также можно использовать для взаимодействия с развернутыми контрактами. Он довольно прост в использовании и в целом выглядит хорошо сделанным, но интерфейс немного не интуитивно понятен, а в описании инструмента говорится, что он все еще находится в демонстрационном режиме и может содержать ошибки. Я не вижу много вариантов его использования.

EVM Lab

EVM Lab обеспечивает некоторое взаимодействие с EVM, но мне не удалось заставить его работать. На странице GitHub есть снимок экрана с инструментом, на котором показан комплексный анализ, но не так много информации об использовании или установке. На их вики-странице мало что говорится.

Отладчик графа Ethereum

У меня тоже не получилось запустить. Простая установка NPM приводит к ошибке, в которой говорится, что проблема, вероятно, связана с самим пакетом. Я пробовал его в Windows и Linux с тем же результатом.
Это всего лишь инструмент для отладки, и даже его страница на GitHub предлагает альтернативы, такие как Remix и т. Д.

Покрытие тестов

Покрытие твердости

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

Заключение и рекомендации

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

Результаты имеют смысл, потому что MythX использует все подходы других инструментов вместе взятые. Он проводит статический анализ, символьное выполнение и нечеткое тестирование.

Так что да, мы будем пробовать MythX в дальнейшем процессе обеспечения безопасности. Мы также рекомендуем работать с Solidity Visual Auditor и Surya при работе со сложными взаимодействиями контрактов и обеспечивать, чтобы ваши тесты полностью покрывали ваши контракты, используя Solidity Coverage.

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