Устранение DoS-уязвимостей смарт-контрактов, связанных с отсутствием газа, с помощью датчика газа

Устранение DoS-уязвимостей смарт-контрактов, связанных с отсутствием газа, с помощью датчика газа

21 октября 2022 г.

Мы продолжаем нашу серию образовательных статей, и сегодня мы взгляните на Gas Gauge — отличный инструмент, предназначенный для помочь аудиторам кода Solidity в обнаружении DoS-атак Out-of-Gas уязвимости в смарт-контрактах Ethereum. О нем мало что известно, но он может конкурировать с лучшими решениями, такими как Slither, о котором мы недавно публиковали статью — обязательно прочитайте ее !

Мы рассмотрим, что представляет собой эта уязвимость, какие функции имеет инструмент GasGauge и как улучшить качество аудита путем объединения различные инструменты. Наконец, мы разберем документ о выпуске этого инструмента, и наша команда аудиторов поделится своими наблюдениями и замечаниями. !

<цитата>

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

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

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

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


I — Уязвимости, связанные с отказом в обслуживании (OoG-DoS)

Одна из проблем безопасности, с которыми сталкиваются смарт-контракты Ethereum, – отказ в обслуживании из-за отсутствия газа (OoG-DoS) уязвимости. Каждая операция в смарт-контракте Ethereum стоит определенное количество газа, единица измерения количества вычислительных усилий, необходимых для выполнения указанной операции или транзакции, оплачиваемых стороной, инициирующей транзакцию.

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

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

В результате выполнение одной или нескольких функций в смарт-контракте, уязвимом для Out-of-Gas, может быть заблокировано на неопределенный срок, если условия Out-of-Gas не обрабатываются должным образом. Это тип уязвимости, для поиска которого был разработан Gas Gauge.


II — Указатель газа Инструмент

Согласно опубликованному статье, Gas Gauge – это инструмент, DoS-уязвимости of-Gas в смарт-контрактах Ethereum. Инструмент Gas Gauge состоит из трех основных компонентов:

* Фаза обнаружения * Фаза идентификации * Фаза коррекции

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

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

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


III – Расширение возможностей GasGauge с помощью Slither

Использовать в работе только один инструмент неудобно и не приведет к хорошему результату! Вот почему Авторы сделали возможным использование Gas Gauge в сочетании с такими инструментами, как Slither. Совсем недавно мы опубликовали новую статью об этом инструменте — будьте обязательно прочтите, если не видели.

Например, вы можете использовать Slither и Truffle Suite как часть Gas Gauge. Slither предоставляет множество полезных API для сбора информации о смарт-контракте, такой как зависимости данных и сигнатуры функций. Это используется для подведения итогов контракта и извлечения необходимой информации для других частей реализации Gas Gauge.

Во-первых, мы рекомендуем вам использовать Foundry или Hardhat, но, поскольку Gas Gage изначально был создан для работы с Truffle, вам придется запустить его — это достаточно просто сделать.

Сравнение с различными инструментами безопасности смарт-контрактов:

Кроме того, созданный Slither граф потока управления (CFG) используется для поиска циклов в контракте и их порядка. Кроме того, Truffle Suite используется для компиляции и развертывания смарт-контрактов Solidity в тестовой сети Ethereum.

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


IV — GasGauge: боевое применение

Давайте рассмотрим ситуацию, решенную разработчиками инструментов. На рисунке ниже показан пример контракта, уязвимого для DoS с Unbounded Operations.

В этом примере количество итераций в цикле в addInterest определяется длиной переменной users, которая управляется пользовательским вводом через addUsers< /сильный>.

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

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

Таким образом, по мере роста числа пользователей, газ, необходимый для выполнения addInterest, будет увеличиваться.

В конечном итоге выполнение функции может стать невозможным без возникновения исключения Out-of-Gas, после чего ни один пользователь не сможет заявить о своей заинтересованности, а контракт SmallBank понесет ущерб репутации и потеряет пользователей.

Кстати, те же тесты мы проводили на том же контракте через собственный инструмент — SmartCheck — и точно так же нашла эту уязвимость, что доказывает эффективность этого инструмента. Скоро мы выпустим несколько статей об этом.

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

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

Наш случай с bulkTransfer немного отличается: есть msg.sender, который управляет списком адресов и не может передавать слишком большие массивы. Таким образом, Gas Gauge обнаруживает это и правильно определяет, что это не проблема.

Если в контракте нет циклов, результат будет таким, как показано ниже:

Убойная функция:

Gas Gauge решает одну проблему лучше, чем любой другой инструмент: он способен вычислять итерации цикла, которые будут соответствовать блоку блокчейна. Однако размер его блока по умолчанию составляет 6,7 млн, так как инструмент не обновлялся два года. Вам необходимо обновить перед запуском Датчик газа. И даже с этим небольшим ограничением Gas Gauge — фантастический инструмент.


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

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

Кроме того, ограничения по времени и проблемы с компиляцией Truffle Suite могут привести к некорректной работе Gas Gauge. Функции, содержащие структуры или многомерные массивы, не поддерживаются этапом исправления и идентификации.

Согласно выпуску документу, PhaseA:

<цитата>

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

Однако они поддерживаются на этапе обнаружения, который конкурирует с другими инструментами. Более того, контракты должны быть автономными и написанными на Solidity, чтобы их мог использовать Gas Gauge. Таким образом, контракты с внешними вызовами других контрактов или написанные на других языках не поддерживаются.

На что следует обратить особое внимание:

  • Инструменту уже два года. Некоторые требуемые зависимости могут быть уже установлены, возможно, в разных версиях. Это может привести к проблемам, рассмотрите возможность использования виртуальной среды, если у вас возникнут какие-либо проблемы.
  • При редактировании исходных файлов с помощью VS Code датчик газа может работать неправильно. Рассмотрите возможность запуска инструмента на копии.
  • Убедитесь, что вы используете одну и ту же версию solc в run.py, конфигурации Truffle и solc-select.
  • Задайте правильное значение порта при настройке run.py (должен указывать на экземпляр Ganache).

ВИ — Ресурсы


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

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

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

Какие инструменты мы должны рассмотреть? О чем вам было бы интересно прочитать? Пожалуйста, оставляйте свои комментарии, мы будем рады ответить на них, а лучшие ответы и вопросы могут быть включены в следующую статью!

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

:::


Оригинал