September 7, 2023

Уязвимости смарт-контрактов. Reentrancy. 


Пора узнать что-то новое.
Сегодня речь пойдет о Reentrancy, занимающее первое место в списке занимает уязвимость типа Reentrancy, также известная как рекурсивный вызов. Проблема кроется в том, что уязвимый контракт совершает вызов к другому контракту, при этом внешний контракт может делать ответный вызов функций уязвимого контракта внутри начального вызова. Классический пример уязвимости Reentrancy возникает в контрактах на Ethereum. Контракты могут взаимодействовать с другими контрактами, вызывая методы этих контрактов. Если контракт не правильно управляет своим состоянием, злоумышленник может использовать эту уязвимость, вызывая функцию контракта снова и снова, внедряя свой код между каждым вызовом. Это позволяет злоумышленнику манипулировать состоянием контракта и, в конечном счете, получить несанкционированный доступ к средствам или данных. Давайте рассмотрим подобный пример. Написал простой смарт-контракт который будем атаковать.

Контракт вывода и получения баланса

В этом примере контракта ReentrancyExample функция withdraw позволяет пользователям снимать средства со своего баланса. Однако, эта функция уязвима к Reentrancy атаке. Злоумышленник может создать свой контракт MaliciousContract и вызвать функцию attack, передавая значение средств. При вызове withdraw, функция MaliciousContract.receive будет вызываться повторно до тех пор, пока баланс в ReentrancyExample не будет исчерпан. Это позволяет злоумышленнику совершать несанкционированные вызовы и получать средства из контракта ReentrancyExample.

реализация контракта эксплойта

Уязвимость Reentrancy возникает из-за несогласованного состояния и неадекватного управления блокировками или флагами во время выполнения функций. Когда контракт вызывает внешнюю функцию, она может приостановиться и возобновиться позже. Если состояние контракта изменяется между этими вызовами, может возникнуть уязвимость Reentrancy. А теперь разберем рабочий смарт контракт. Я проводил аудит смарт-контракта для управления цифровыми активами для компании Н, вот некоторый кусок контракта. Давайте разберем его.

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

Теперь давайте рассмотрим потенциальный взлом контракта. Предположим, что у нас есть злонамеренный контракт, который вызывает функцию updateAsset с намерением изменить количество активов:

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

Исходя из полученных данных, можно сделать следующие выводы относительно уязвимости Reentrancy в смарт-контрактах Ethereum:

  1. Уязвимость реэнтранси является серьезной проблемой в смарт-контрактах Ethereum и приводит к возможности несанкционированного повторного вызова функций контракта, что может привести к нежелательным результатам и потере средств.
  2. Злонамеренные пользователи могут использовать уязвимости реэнтранси для проведения атак на контракты и украсть средства или изменить их работу в свою пользу.
  3. Проекты на Ethereum должны уделять должное внимание безопасности и проводить тщательное тестирование смарт-контрактов, чтобы исключить возможность уязвимости реэнтранси.
  4. Разработчики могут использовать комбинацию статического и динамического анализа для выявления уязвимостей реэнтранси в своих смарт-контрактах и обеспечения их защиты.
  5. Ethereum сообщество постоянно работает над улучшением безопасности платформы и разрабатывает обновления, которые исправляют известные уязвимости, включая реэнтранси.

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