Ние в Kleros приемаме много сериозно сигурността на интелигентните договори. Навремето нямаше много автоматизирани инструменти, които да ви помогнат да откриете уязвимостите във вашите интелигентни договори. Разработихме обширен „вътрешен процес“ и можем с гордост да кажем, че договорите на Kleros никога не са имали уязвимост в производството.

Наскоро инструменталната екосистема около сигурността на интелигентните договори се разви достатъчно, за да проявим интерес към въвеждането на някои от инструментите в нашите процеси. Ние виждаме тези инструменти като линтер за първо преминаване, за да облекчим тежестта върху нашите рецензенти, така че те да могат да се съсредоточат върху наистина трудни за улавяне уязвимости, вместо да се движат напред-назад по по-малки проблеми.

Членът на екипа на Kleros, Данил Дмитриков, проведе анализ през март 2020 г. на най-популярните налични инструменти и ги тества върху нашите тестови договори за набиране на персонал. Смятаме, че това е ценен ресурс за споделяне с общността. Общо имаше 11 уязвимости за намиране. Ето резултата от неговия анализ, последван от раздел за инструменти само за визуализация и тестово покритие. Инструментите не са в определен ред и можете да пропуснете до края, ако просто искате да прочетете нашите заключения и препоръки.

Инструменти за статичен/динамичен анализ

„Плъзгане“

Използва се бързо и лесно. Има около 40 проверки за сигурност, които прилага към договорите и показва дали някоя от тях е положителна. Понякога показва фалшиви положителни резултати, макар и не много, като възможно повторно влизане с прехвърляния или изпращания и т.н. От всички тестове той реши правилно само 9-ия, който има повикване и повторно влизане на ниско ниво.

Crytic.io

Работи на двигателя на Slither, но има по-голям брой проверки, така че е като по-добра и по-сложна версия на Slither. Като цяло има подобни проблеми, като например маркиране на функцията за прехвърляне като небезопасна за повторно влизане. По някаква причина, въпреки че има много повече проверки, той няма проста проверка за препълване/преливане (тези, които има, се прилагат само за стандартни ERC функции). Той реши правилно 9-ия и 11-ия тест. Освен това, точно като Slither, въпреки че има случайни фалшиви положителни резултати, той дава някои полезни предложения като „промяна на публичното на външно“, „договорът съхранява ETH, но няма опция за теглене“ и т.н. Въпреки това, все пак, не t дава правилни отговори на повечето от тестовете.

Мантикора

Сравнително бавен инструмент. Тестването на прост договор отнема 5–10 минути, а в случай на по-сложен договор той просто замръзва и спира да отговаря. Докато тества, той създава папка с много файлове за анализ и един глобален обобщен файл. Той реши правилно 5-ия (препълване) и 9-ия тест. Не дава много фалшиви положителни резултати. Глобалният обобщен отчет обикновено е празен.

Митрил

Също сравнително бавен, но по-полезен от Manticore. Той реши правилно около половината от тестовете с изключение на 4-ти, 7-ми, 8-ми, 10-ти и 11-ти. Замръзна и спря да отговаря при анализиране на по-сложни договори. Той дава случайни фалшиви положителни резултати, подчертавайки линия, която няма никакви проблеми. Като цяло това е по-малко усъвършенствана версия на MythX и тяхната страница в GitHub предлага да се използва последната.

Мит X

Най-добрият инструмент сред всички проверени. Изисква да се регистрирате в платформата MythX, където генерирате API ключ. Можете да използвате ключа или с плъгини VSCode, Truffle или Remix. Освен това работи директно с MythX CLI. Пробвах и четирите варианта. Анализът е сравнително бърз и резултатите се показват на таблото за управление на mythx.io. Има и опция за извършване на задълбочен анализ, но тя е достъпна само ако надстроите абонамента си. Според описанието един задълбочен анализ може да отнеме от 30 до 90 минути. Като цяло той реши правилно всички тестове с изключение на 7-ми, 8-ми и 10-ти. Когато анализирахме нашите по-сложни договори, той посочи потенциален проблем с изчерпване на газа поради зацикляне, което изглежда разумно.

„Договорна библиотека“

Може да бъде потенциално полезно. Има някои проверки за уязвимост, които могат да се използват като филтър за намиране на примери за конкретна уязвимост сред внедрените договори. Прилага се и за договори за тестови мрежи. Можете също така да изберете вече разгърнат договор, за да видите дали някоя от проверките се отнася за него. Недостатъкът е, че броят на проверките, които използва, е относително малък.

Обезопасяване

Онлайн инструмент за анализ. Качвате договора и получавате резултатите от анализа. Това е бързо, но броят на проверките изглежда много ограничен. За всеки анализиран договор той даде почти същия тип отчет, като например „договорът заключва етер“ или „полета, които могат да бъдат модифицирани от потребителя, трябва да бъдат проверени“ и т.н. Понякога дава фалшиви положителни резултати. Той реши правилно само 9-ия тест (reentrancy). Имаше и опция за одит на договора, но не я използвах.

SmartCheck

Подобрена версия на Securify. Има по-голям брой проверки (но по някаква причина няма проверка за препълване). Проверките също са по-описателни и предоставят някои примери и препоръки. Този инструмент реши правилно 4-ти, 9-ти и 11-ти тестове и посочи потенциален проблем с недостиг на газ в по-сложните договори. Има и опция за искане на одит за договора.

Ехидна

Не успях да го накарам да работи, но работи подобно на тестването на Truffle според страницата на GitHub. Трябва да напишете солиден файл с проверки, на които искате да премине целевият договор, и Echidna ще създаде различни входове, опитвайки се да пробие тези проверки. Като цяло не изглежда много практично за използване.

Ойенте

Проверих накратко този инструмент и той работи само за компилатори под 0.4.17. Репото GitHub също изглежда изоставено. Имайки предвид колко остаряла беше, реших да я оставя.

Октопод

Този инструмент предоставя анализ на ниско ниво и не мисля, че може да проверява интелигентните договори за уязвимости. Поне аз не намерих начин да направя това.

sFuzz

sFuzz също е онлайн инструмент. Поставяте договора, за да анализирате и да получите отчета. Всеки път, когато се опитвах да го използвам, анализът спираше на 95%. Единственият път, когато не спря, беше, когато качих почти празен договор. Пробвах го на различни браузъри и имах същия резултат.

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

Визуален одитор на Solidity

Solidity Visual Auditor е разширение за Visual Studio Code. Проверих този инструмент преди година и оттогава не се е променил много. Той подчертава определени променливи, показва линията, на която се намират и т.н., което не намирам за особено полезно.

Сурия

Surya е инструмент, който е интегриран в Solidity Visual Auditor. Използва се лесно. След като инсталирате разширението, получавате някои инструменти, които можете да използвате с договора, като анализиране, чертане на графика, показване на сигнатури на функции и т.н. Всички те са бързи и лесни за използване. Има инструмент за изглаждане, който може да комбинира договора с много зависимости в едно и може да бъде полезен при внедряване. Изравняването обаче работи само ако зависимостите са локални и грешки, ако импортирането се позовава на NPM пакет, като „import „@kleros/kleros-interaction/contracts/libraries/CappedMath.sol“. Трябва да посочите договора във вашата локална папка node_modules, за да работи.

Солграф

Твърде опростено, за да бъде полезно. Всичко, което прави, е просто да чертае графики. В описанието се казва, че също така подчертава потенциални уязвимости, но не предоставя никакъв анализ на сигурността. Ако открие уязвимост във функция, тя само я маркира като „НЕДОВЕРЕН“, без да посочва причина, и това е всичко, което е под въпрос. Тяхното GitHub repo също изглежда остаряло.

Пиет

Уеб приложение с функционалност, подобна на Surya. Също така чертае графики, извлича документация от договора, анализира и т.н. Може да се използва и за взаимодействие с разгърнати договори. Той е доста лесен за използване и като цяло изглежда добре направен, но интерфейсът е малко неинтуитивен и описанието на инструмента казва, че все още е в демо режим и може да съдържа грешки. Не виждам много случаи на употреба за него.

EVM Lab

EVM Lab осигурява някои взаимодействия с EVM, но не успях да го накарам да работи. Има екранна снимка на инструмента на неговата страница в GitHub, която показва сложен анализ, но няма много информация за използването или инсталирането му. Тяхната wiki страница не казва много.

„Debugger на Ethereum Graph“

Аз също не успях да го пусна. Простата инсталация на NPM води до грешка, която казва, че проблемът вероятно е в самия пакет. Опитах го под Windows и Linux със същия резултат.
Това е просто инструмент за отстраняване на грешки и дори страницата му в GitHub предлага алтернативи като Remix и др.

Тестово покритие

Солидно покритие

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

Заключение и препоръки

От всички инструменти за статичен и динамичен анализ, които тествахме, MythX се представи най-добре досега. Планираме да направим допълнителни тестове, за да видим дали платената версия си заслужава цената.

Резултатите имат смисъл, защото MythX използва комбинираните подходи на другите инструменти. Той провежда статичен анализ, символно изпълнение и размито тестване.

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

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