Представляем Solidify — инструмент для автоматического обнаружения и классификации рисков безопасности смарт-контрактов

Представляем Solidify — инструмент для автоматического обнаружения и классификации рисков безопасности смарт-контрактов

Питер Качергинский, главный инженер по безопасности блокчейнов

Когда наша команда по безопасности блокчейнов начала заключать несколько смарт-контрактов В 2018 году мы не подозревали, что проведем сотни обзоров в 2021 году.

Для развития открытой финансовой системы Coinbase стремится расширить список поддерживаемых криптовалют. Недавно мы запустили Asset Hub, чтобы упростить процесс проверки новых объявлений. Одним из важнейших факторов, которые мы рассматриваем, является безопасность смарт-контрактов, особенно в отношении токенов на основе Ethereum, которые могут сильно различаться по технической сложности. Поэтому мы создали инструмент безопасности смарт-контрактов под названием Solidify, чтобы помочь автоматизировать, стандартизировать и масштабировать этот процесс.

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

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

Как работает Solidify

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

 contract Pausable is Ownable {event Pause (); событие Unpause (); 
 bool public paused = false; 
 модификатор whenNotPaused () {require (! paused); _; } 
 модификатор whenPaused () {требуется (приостановлено); _; } 
 функция pause () onlyOwner whenNotPaused public {paused = true; Пауза(); } 
 функция unpause () onlyOwner whenPaused public {paused = false; Отменить паузу (); }} 

Источник: openzeppelin-контракты-1.3.0 / контракты / жизненный цикл / Pausable.sol

Используя над функциями pause () владелец смарт-контракта может остановить все операции отправки / получения и, в некоторых случаях, негативно повлиять на полезность контракта. Благодаря наличию библиотеки паузы и соответствующих функций передачи, которые их используют, мы можем надежно классифицировать контракт, имеющий риск приостановки. Solidify делает это, объединяя все известные экземпляры и возможные варианты функции pause () и автоматически проверяя, есть ли они в текущем анализируемом контракте. Уникальные сигнатуры генерируются с использованием структур AST (абстрактное синтаксическое дерево), чтобы избежать дублирования, вызванного небольшими вариациями синтаксиса, при этом обеспечивая грамматическую точность того, что функция фактически делает.

Приведенный выше образец дерева AST для функции pause () будет обработан для создания уникального хэша, который будет использоваться в качестве подписи для сопоставления с другими смарт-контрактами:

Ниже приведен образец записи в базе данных подписей, сгенерированной Solidify для pause () функция:

 {
 & quot; Хеш & quot ;: 
"05654d81921af71079698aff1b4be500d1405ece9364a05915b738376c0250b5",</ & quot; ; pause () ", 
" Mutability ": "nonpayable", 
 "Source ": [& quot; signatures / openzeppelin / openzeppelin-contract-1.10.0 /contracts/lifecycle/Pausable.sol:666:90:0&quot ;, 
 & quot; подписи / openzeppelin / openzeppelin-контракты-1.11.0 / контракты / жизненный цикл / Pausable.sol: 666: 90: 0 & quot ;, 

& quot; подписи / openzeppelin / openzeppelin-контракты-1.9.0 / контракты / жизненный цикл / Pausable.sol: 666: 90: 0 & quot; [.. отредактировано ..]

], 
 "Doc ":" @dev вызывается владельцем для приостановки, запускает состояние остановки \ r "," Features "; : [& quot; пауза & quot; 
] 
}, 

Обратите внимание, что одна и та же сигнатура функции pause () присутствует в трех различные выпуски библиотеки OpenZeppelin и других токенов, дословно включающих этот код. Вышеупомянутая подпись также включает в себя список функций, таких как «приостановка», которая позволяет нам автоматически оценивать риск актива и предлагать меры по его снижению (например, надежная мульти-подпись для учетной записи владельца). Solidify выполняет аналогичное сопоставление подписей для каждой отдельной функции в анализируемом контракте до тех пор, пока все функции не будут обнаружены или добавлены в нашу базу данных подписей, поэтому нам никогда не придется анализировать один и тот же код дважды.

В настоящее время Solidify имеет около 6000 уникальных подписей. которые используются для эффективного сопоставления рисков с любым конкретным смарт-контрактом. Ручная проверка, которая занимала до 2 рабочих дней в 2018 году, может быть выполнена всего за несколько минут в 2021 году. Возможности Solidify и уровень обнаружения постоянно растут, поскольку наши инженеры по безопасности добавляют новые сигнатуры и регистрируют связанные риски.

Как использовать Solidify

Давайте проанализируем образец смарт-контракта, чтобы проиллюстрировать механизм сопоставления подписей в действии. Давайте посмотрим на токен ChainLink (LINK) и посмотрим, насколько он безопасен, запустив Solidify на его смарт-контракте, развернутом по адресу 0x514910771af9ca656af840dff83e8264ecf986ca:

% ./solidify -a 0x514910771af9ca65982ca840 
 2021/05/20 15:16:22 Загружено 5777 сигнатур функций 
 2021/05/20 15:16:22 Обработка 0x514910771af9ca656af840dff83e8264ecf986ca 
 2021/05/20 15: 16:23 Загрузка подписей из: контрактов / LINK_0x514910771af9ca656af840dff83e8264ecf986ca / LinkToken.sol 
 2021/05/20 15:16:23 Генерация AST для контрактов / LINK_0x514910771af9ca656af840cf83e82cae / Link 

20.05, 15:16:24 Установка версии Solidity 0.4.21

 2021.05.20 15:16:28 Установите версию solc на 0.4.21 
 2021.05.20 15:16:29 Обнаружено 19 подписей 
 2021.05.20 15:16:29 Сохранение отчета в отчетах / LINK_0x514910771af9ca656af840dff83e8264ecf986ca / LINK.yml 
 2021.05.20 15:16 : 29 Сохранение отчета в отчетах / LINK_0x514910771af9ca656af 840dff83e8264ecf986ca / ChainLink Token (LINK) Security Memo.md 

Solidify потребовалось всего несколько секунд, чтобы автоматически загрузить исходный код контракта, сгенерировать AST с использованием соответствующей версии Solidity, обнаружить и сопоставить 19 уникальных сигнатур функций. Ниже приведен фрагмент отчета Markdown, созданного этим инструментом:

Оценка безопасности ERC-20: токен ChainLink (LINK)

Аудитор: Питер Качергинский Solidify версия: 1.2.3 Источник договора: 0x514910771af9ca656af840dff83e8264ecf986ca

Краткое содержание

Дата: 2021–05–20 Оценка остаточного риска безопасности: 2 Оценка внутреннего риска безопасности: 2

Оценка риска: 2 Описание риска: Внешний адресный звонок

Оценка риска: 1 Описание риска: Использование инструкций по сборке ** Риски активов рассчитываются по шкале от 1 до 5 с 5 является наиболее серьезным.

Для этого актива не требуется никаких мер по снижению рисков.

Сведения о рисках

Токен ChainLink имеет следующие риски:

2 | Вызов внешнего адреса Контракт может вызывать другую функцию в другом смарт-контракте для запуска функций, не определенных в самом контракте

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

Следующие функции вызвали этот риск:

  • contractFallback (address, uint256, bytes memory )
  • transferAndCall (адрес, uint256, память в байтах)
  • transferAndCall (адрес, uint256, память в байтах)

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

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

Следующие функции вызвали этот риск:

  • isContract (address)

Сведения о смягчении последствий

Реализация следующих мер по снижению рисков влияет на оценку остаточного риска безопасности: Н / Д

Мониторинг

отними Мониторинг: N / ASlack и Pagerduty Мониторинг: N / A

Соответствие Функция Подписи

062afb9e84bbfded288268dcd3860be4fac7576697e563970dbfedd29dd9f5ff — добавить (uint256, uint256)

0f5d6c18af8bfe45551aea6c08ee36f2388d40721a399a99210754fb5b5d4fcc — isContract (адрес)

 27711ded0a7898d7ac3feca9c539c7660909efcc5bf12c8e8b8612d522be6ac4 - contractFallback (адрес , Uint256, байты памяти) 
2d299e0f7d2ea990e5ca714c04fbac5ae68615d9404bf447f42234f28891fcd5 - transferFrom (адрес, адрес, uint256)
 3ee09ec574744840001f024d57db0a57f4986733e71f8355bf8cd7af08e03ef4 - transferAndCall (адрес, uint256, байты памяти) 
504201695c6fb08bebd3aaa9ccc252afd104cedddc5a5db8785ff1ec93e3255d -
 [.. УДАЛЕНО ..] 

Источники функций сопоставления:

 signatures / openzeppelin / openzeppelin-контракты-1.1.0 / контракты / токен / BasicToken. sol 
 подписи / openzeppelin / openzeppelin-контракты-1.1.0 / контракты / токен / StandardToken.sol 
 подписи / openzeppelin / openzeppelin-контракты-1.10.0 / контракты / математика / SafeMath.sol 
 подписи / openzeppelin / openzeppelin-контракты-1.11.0 / контракты / math / SafeMath.sol 
 подписи / openzeppelin / openzeppelin-контракты-1.3.0 / контракты / math / SafeMath.sol 
 [.. УДАЛЕНО ..] 

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

Ограничения

Solidify специально создан для решения нам необходимо быстро и безопасно просмотреть ERC-20 и аналогичные токены. Наличие стандартизованных интерфейсов токенов и относительно ограниченной функциональности, необходимой для управления учетными записями, отлично подходит для создания баз данных сигнатур, которые соответствуют большому проценту существующих контрактов. Но более сложные активы, такие как AMM и другие приложения DeFi, требуют дополнительного ручного анализа из-за большого процента настраиваемого кода. Однако Solidify по-прежнему полезен для этих приложений при анализе клонов DeFi или для исключения стандартных библиотек из объема ручного обзора, чтобы аналитики могли сосредоточиться на настраиваемой логике.

Хотя Solidify в настоящее время ограничивается цепочкой блоков Ethereum и Solidity, есть планы по распространению этого инструмента на другие платформы на основе EVM и поддержку дополнительных языков, таких как Vyper.

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

Будущее развитие

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

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

Заключение

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

Если вы заинтересованы в обеспечении будущего финансов, Coinbase нанимает сотрудников.

Представляем Solidify — инструмент для автоматического обнаружения и классифицировать риски безопасности смарт-контрактов был первоначально опубликован в блоге Coinbase на Medium, где люди продолжают разговор, выделяя эту историю и отвечая на нее.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *