Поскольку протоколы DeFi продолжают набирать обороты в экосистеме Ethereum, CipherTrace видит все больше и больше эксплойтов и векторов атак. На прошлой неделе, 28 декабря 2020 года, был использован контракт Blacksmith на добычу щита от Cover Protocol. Хакеры использовали ошибку в контракте на майнинг, чтобы получить бесконечное количество токенов COVER и вывести из проекта более 4.4 миллиона долларов.
Протокол обложки выпустил их вчерашнее исследование Post-Mortem, в котором говорится, что разработчикам неизвестно, что ошибка присутствовала с момента первоначального развертывания контракта Blacksmith, подчеркивая важность тщательного аудита безопасности и пентестинга умные контрактыЧто такое смарт-контракты? Смарт-контракт - это компьютерный профессионал ... Больше.
Хронология бесконечного чеканки
Хронология первого злоумышленника
- Пул ликвидности New Balancer был добавленный к контракту Blacksmith.sol.
- нападающий депозиты 1,326,879.99 токенов BPT в контракт Blacksmith.sol.
- Тогда тот же злоумышленник исполняет эксплуатировать, выводя средства из контракта.
- Злоумышленник смог продолжать чеканка вознаграждений и вывод средств на сумму около 4.4 млн долларов.
При интересном повороте событий предполагаемые «белые хакеры», связанные с Grap Finance, также использовали эту ошибку для чеканки токенов COVER на сумму около 4 миллионов долларов. В конце концов, Grap Finance вернула средства Cover Protocol.
График времени для внешнего аккаунта Grap Finance Deployer (EOA)
- Новый пул ликвидности был утвержденный для добычи ликвидности.
- EOA для развертывания Grap Finance депонированный 15,255.55 XNUMX BPT (DAI / Basis) в пул на Cover через контракт Blacksmith.sol.
- Примерно через четыре минуты деньги были Изъятый на обложке, оставляя 1 Вэй на балансе EOA Grap Finance Deployer.
- Другой внешний пользователь отозвала большая часть их баланса по контракту Blacksmith.sol примерно в то же время, что привело к Grap Finance со всей ликвидностью для пула DAI / Basis по контракту Blacksmith.sol.
- Развертыватель Grap Finance депонированный вернуть 15,255.55 XNUMX BPT (DAI / базис) в пул.
- Затем Grap Finance Deployer требования награды и, благодаря эксплойту, чеканили 40,796,131,214,802,500,000.21 XNUMX XNUMX XNUMX XNUMX XNUMX XNUMX COVER.
- После некоторого сжигания отчеканенных токенов Grap Finance Deployer посылает назад Эфир на обложку с заявлением «В следующий раз позаботься о своем дерьме».
Как чеканить бесконечные токены - технический анализ
проверка данных
Этот эксплойт возвращает нас к основам языка программирования Solidity, который используется для реализации смарт-контрактов в Ethereum. После компиляции этих контрактов виртуальная машина Ethereum (EVM) сможет понимать инструкции (т.е. коды операций), которые используются для выполнения различных функций и управления памятью и хранилищем. В EVM есть три разных области, где он может хранить данные: память, хранилище и стек. Понимание этих областей важно для понимания того, как была использована ошибка.
Подобно оперативной памяти (RAM) на вычислительном устройстве, «ПамятьКлючевое слово в Solidity выделяет память для определенной переменной. В этом случае эта переменная привязана к определенной функции. Память очищается после выполнения функции, но может остаться, если содержимое этой памяти будет помещено в хранилище до возврата из функции.
"дискКлючевое слово в Solidity позволяет переменным действовать как указатель на хранилище данных в сопоставлениях или структурах данных. Данные хранилища постоянны между вызовами функций и транзакциями. Под капотом хранилище, по сути, представляет собой хранилище ключей и значений, которое отображает 256-битные слова в 256-битные слова.
Обратите внимание, что EVM - это не регистровая машина, а стековая машина, поэтому все вычисления выполняются в области данных, называемой стек. Стек имеет максимальную емкость 1024 элемента, но легко доступны только верхние 16 элементов, которые можно использовать для замены самого верхнего элемента одним из 16 элементов ниже него и другими.
Жук
Хакеры использовали Blacksmith.sol от Cover Protocol - контракт на майнинг Shield, который позволяет участникам получать вознаграждение в токенах конкретного проекта или пула, таких как токены CLAIM и NOCLAIM, в рамках Cover Protocol.
Чтобы лучше понять ошибку, сначала давайте посмотрим на общедоступные бассейны переменная, которая является отображением (т.е. хранилищем данных):
At линия 118, мы видим, что контракт кэширует данные пула в памяти с помощью ключевого слова memory.
Затем на линия 121, контракт обновляет пул в хранилище как updatePool (адрес _lpToken) функция использует Пул хранения пула Переменная.
Однако, если вы посмотрите дальше в депозит (адрес _lpToken, uint256 _amount) функция, он использует ту же бассейн переменная из строки 118, которая была кэширована в память в функции для вычислений для пул.accRewardsPerToken, На данный момент, бассейн переменная была скопирована из бассейны отображение и был сохранен в памяти.
В результате любые изменения, внесенные в бассейн переменная в пределах депозит (адрес _lpToken, uint256 _amount) функция не изменит бассейны отображение в хранилище контракта в цепочке из-за того, что переменные, использующие ключевое слово «memory», ограничиваются только самой функцией. Оттуда контракт обновляет пул.accRewardsPerToken в updatePool (адрес _lpToken) функция, которая использует хранилище. Итак, теперь в updatePool (адрес _lpToken) функционировать пул.accRewardsPerToken который обновляется, значительно увеличивается, так как технически это был новый пул, не связанный с бассейн в памяти.
Вследствие этой уязвимости и неправильного использования памяти и хранилища miner.rewardСписание в депозит (адрес _lpToken, uint256 _amount) неправильно рассчитана функция, а также используется неверный пул.accRewardsPerToken, поскольку мы все еще находимся в функции депозита, которая обрабатывает кэшированный в памяти экземпляр бассейн.
В дополнение к функции депозита, любой, например Grap Finance, может получить безумное количество отчеканенных токенов при выполнении ClaimRewards (адрес _lpToken) функция. Эта функция, которая используется для получения награды, в конечном итоге вызывает _claimCoverRewards (пул памяти, майнер памяти) который ссылается на miner.rewardСписание что мы выделили выше. Поскольку эта переменная намного меньше фактического пул.accRewardsPerToken, контракт приводит к чеканке большого количества токенов.
Основные выводы
CipherTrace надеется, что эта предыстория эксплуатируемой ошибки проливает свет на важность тщательного аудита безопасности и пентестинга смарт-контрактов в зависимости от того, что блокчейнБлокчейн - технология, лежащая в основе биткойнов и других… Больше один выбирает для развертывания. Хотя Grap Finance вернула средства, полученные с помощью эксплойта, первоначальный хакер все еще смог получить более 4 миллионов долларов с помощью протокола DeFi, а стоимость токена COVER с тех пор упала почти на 99%.
Источник: https://ciphertrace.com/infinite-minting-exploit-nets-attacker-4-4m/