Флэш-кредитная атака BSC: PancakeBunny

В мае 2021 года мы стали свидетелями нескольких взломов продуктов BSC DeFi. В частности, лазейка, связанная с добычей вознаграждений в агрегаторе доходности, PancakeBunny, была использована для получения ~ 7 миллионов токенов BUNNY из ничего, что привело к колоссальным финансовым потерям в размере 45 миллионов долларов. После кровавого взлома три разветвленных проекта — & nbsp; AutoShark, Merlin Labs и PancakeHunny — были атакованы схожими методами. Группа безопасности блокчейнов Amber Group, возглавляемая доктором Чиачи Ву, подробно описывает лазейку и дает пошаговое описание эксплойта, воспроизводя атаку против PancakeBunny.

Скрытая поверхность атаки: balanceOf ()

Многие люди считают, что возможность компоновки имеет решающее значение для успеха DeFi. Контракты токенов (например, ERC20) играют важную роль на нижнем уровне лего DeFi. Однако разработчики могут упускать из виду некоторые неконтролируемые и непредсказуемые условия при интеграции ERC20 в свои проекты DeFi. Например, вы не можете предсказать, когда и сколько токенов вы получите, когда получите текущий баланс токенов. Эта неопределенность создает скрытую поверхность для атак.

Во многих случаях смарт-контракты ссылаются на балансы ERC20 в своей бизнес-логике. Например, когда пользователь вносит несколько токенов XYZ в смарт-контракт, вызывается XYZ.balanceOf (), чтобы проверить, сколько денег получено. Если вы знакомы с базой кода Uniswap, вы, вероятно, знаете, что контракт UniswapV2Pair имеет много вызовов balanceOf ().

Во фрагменте кода UniswapV2Pair.mint () использует текущие балансы (balance0, balance1) и данные бухгалтерского учета (amount0, amount1) для получения сумм, внесенных пользователем (amount0, amount1). Однако, если злоумышленник передает некоторые активы (token1 или token2) прямо перед вызовом mint (), жертва предоставит больше ликвидности, чем ожидалось, то есть будет отчеканено больше токенов LP. Если вознаграждение рассчитывается на основе количества токенов LP, злоумышленник может получить прибыль, когда вознаграждение превышает расходы.

UniswapV2Pair.burn () имеет аналогичный риск. Вызывающий функцию mint () может подвергнуть себя опасности без полного понимания связанных с этим рисков. Вот что произошло в случае с PancakeBunny.

В приведенном выше фрагменте кода в строке 140 извлекается баланс токена LP через balanceOf () и сохраняется его ликвидность. В строках 144–145 часть общих токенов LP, принадлежащих UniswapV2Pair (т. Е. Ликвидность из _totalSupply), используется для получения (amount0, amount1) с текущими балансами (balance0, balance1) двух активов (то есть token0 и токен1). Позже (сумма0, сумма1) двух активов переводятся на адрес, указанный в строках 148–149.

Здесь злоумышленник может манипулировать (balance0, balance1) и ликвидностью, отправив некоторый токен token0 + token1 или токен LP в контракт UniswapV2Pair прямо перед вызовом функции mint (), чтобы вызывающий абонент получил больше token0 + token1 вне. Мы проведем вас через исходный код PancakeBunny и покажем, как злоумышленник может извлечь из этого выгоду.

Анализ лазеек: BunnyMinterV2

В исходном коде PancakeBunny функция BunnyMinterV2.mintForV2 () отвечает за чеканку токенов BUNNY в качестве вознаграждения. В частности, количество, которое будет отчеканено (т. Е. MintBunny), определяется входными параметрами _withdrawalFees и _performanceFee. Вычисление связано с тремя функциями: _zapAssetsToBunnyBNB () (строка 213), priceCalculator.valueOfAsset () (строка 219) и amountBunnyToMint () (строка 221). Поскольку злоумышленник может создать большое количество BUNNY, проблема заключается в одной из трех функций, упомянутых выше.

Начнем с функции _zapAssetsToBunnyBNB (). Когда переданным активом является Cake-LP (строка 267), определенное количество токенов LP используется для удаления ликвидности и извлечения (amountToken0, amountToken1) из (token0, token1) из пула ликвидности (строка 278). С помощью контракта zapBSC эти активы обмениваются на токены BUNNY-BNB LP (строки 287-288). Соответствующее количество токенов BUNNY-BNB LP затем возвращается вызывающей стороне (строка 298). Здесь у нас проблема. Соответствует ли сумма количеству жетонов LP, которые, по вашему мнению, будут сожжены?

В реализации PancakeV2Router.removeLiquidity () ликвидность токенов LP (сумма в zapAssetsToBunnyBNB ()) будет отправлена ​​в контракт PancakePair (строка 500) и будет вызываться PancakePair.burn (). Если текущий баланс токенов LP для PancakePair больше 0, фактическая сумма, которую нужно сжечь, будет больше, чем сумма, что косвенно увеличивает количество BUNNY, которое будет отчеканено.

Другой проблемой в _zapAssetsToBunnyBNB () является вызов zapBSC.zapInToken (). Логика состоит в том, чтобы обменять два актива, собранные методом removeLiquidity (), на токены BUNNY-BNB LP. Поскольку zapBSC обменивает активы через PancakeSwap, злоумышленник может использовать мгновенные ссуды, чтобы манипулировать суммой обмениваемых BUNNY-BNB.

Возвращаясь к BunnyMinterV2.mintForV2 (), bunnyBNBAmount, возвращаемый zapAssetsToBunnyBNB (), будет передан в priceCalculator.valueOfAsset (), чтобы процитировать значение на основе BNB (т.е. vauleInBNB), аналогично механизму оракула. ​​

Однако priceCalculator.valueOfAsset () ссылается на количество BNB и BUNNY (резерв0, резерв1) в BUNNY_BNB PancakePair в качестве ценового потока, что позволяет злоумышленнику использовать флэш-ссуды для управления количеством отчеканенных токенов BUNNY. / p>

Функция amountBunnyToMint () представляет собой простое математическое вычисление. Входной вклад умножается на пять (bunnyPerProfitBNB = 5e18), что само по себе не имеет поверхности для атаки, но усиление усиливает манипуляции, упомянутые выше.

Подготовка к бою

Поскольку атака инициируется getReward (), нам нужно сначала получить вознаграждение.

Как показано на скриншоте Etherscan выше, хакер PancakeBunny вызвал функцию init () контракта эксплойта для обмена 1 WBNB на токены WBNB-USDT-LP и внесения () их в контракт VaultFlipToFlip, чтобы он получил некоторые награды за вызов getReward ().

Как показано выше, с помощью & nbsp; Exp.prepare () мы воспроизвели вызов vaultFlipToFlip.deposit () (строка 62). Мы также использовали контракт ZapBSC для упрощения получения токенов LP (строки 54-57). Однако нельзя получить награды, пока хранитель PancakeBunny не вызовет следующий вызов gather (). По этой причине хакер PancakeBunny не инициировал атаку до первой транзакции gather (), следующей за транзакцией init ().

В нашем моделировании ни один хранитель не может активировать сбор урожая (). Поэтому мы используем функцию eth-brownie, чтобы выдать себя за хранителя и вручную инициировать транзакцию gather () (строка 25).

Рекурсивные срочные ссуды

Для привлечения средств эксплуататор PancakeBunny использовал восемь различных пулов средств, включая семь контрактов PancakePair и ForTube Bank. Здесь группа безопасности блокчейнов Amber Group использовала только следующие семь контрактов PancakePair с возможностью быстрой замены, чтобы ссудить 2,3 млн WBNB:

 адрес [7] пар = [
адрес (0x0eD7e52944161450477ee417DE9Cd3a859b14fD0),
адрес (0x58F876857a02D6762E0101bb5C46A8c1ED44Dc16),
адрес (0x74E4716E431f45807DCF19f284c7aA99F18a4fbc),
адрес (0x61EB789d75A95CAa3fF50ed7E47b96c132fEc082),
адрес (0x9adc6Fb78CEFA07E13E9294F150C1E8C1Dd566c0),
адрес (0xF3Bc6FC080ffCC30d93dF48BFA2aA14b869554bb),
адрес (0xDd5bAd8f8b360d76d12FdA230F8BAF42fe0022CF)
]; 

Чтобы упростить вызовы flash-swap, мы упаковали два параметра в четвертый входной аргумент вызовов PancakePair.swap () (строка 72 или строка 74): level и asset. Переменная уровня указывает, на каком уровне вызова swap () мы находимся; переменная актива — 0 или 1, что означает, что нам нужно заимствовать token0 или token1.

Используя функцию обратного вызова pancakeCall (), мы рекурсивно вызываем PancakePair.swap () с уровнем +1, пока не достигнем седьмого уровня. На верхнем уровне мы вызываем shellcode () для выполнения реального действия в строке 98. Когда функция shellcode () возвращается, переменная актива возвращает заимствованный актив на каждом соответствующем уровне (строки 102-104).

Нажать на спусковой крючок

Функция shellcode (), вызываемая седьмым уровнем pancakeCall (), является фактическим кодом эксплойта. Во-первых, мы сохраняем текущий баланс WBNB в wbnbAmount (строка 108), обмениваем 15000 WBNB на токены WBNB-USDT-LP (строка 112) и отправляем их в контракт, по которому были отчеканены эти токены LP (то есть контракт PancakePair) в строка 113. Этот шаг направлен на управление вызовом removeLiquidity () внутри функции _zapAssetsToBunnyBNB (), как было проанализировано выше, что позволяет нам получать больше WBNB + USDT, чем ожидалось.

Второй шаг — манипулировать ценой USDT, на которую ссылается _zapAssetsToBunnyBNB (), чтобы обменять USDT на WBNB. Поскольку _zapAssetsToBunnyBNB () использует WBNB-USDT PancakePair для обмена USDT на WBNB, мы могли бы обменять остаток ссуды WBNB на USDT на PancakeSwap. Это сделает WBNB чрезвычайно дешевым, а _zapAssetsToBunnyBNB () получит непропорционально большую сумму WBNB при обмене с USDT. Обратите внимание, что манипулирование ценой здесь происходит на пуле Pancake V1, а не на PancakePair Pancake V2, как на предыдущем шаге.

Последний шаг — вызов getReward (). Простой вызов контракта может принести 6,9 млн токенов BUNNY (строка 125). Затем токены BUNNY можно было обменять на WBNB на PancakeSwap, чтобы выплатить флэш-кредит.

В нашем моделировании злоумышленник платит 1 WBNB и уходит с 104 000 WBNB + 3,8 млн долларов США (что эквивалентно ~ 45 млн долларов США).

О компании Amber Group

Amber Group — ведущий глобальный поставщик услуг криптовалютного финансирования, работающий по всему миру и круглосуточно, с присутствием в Гонконге, Тайбэе, Сеуле и Ванкувере. Компания Amber Group, основанная в 2017 году, обслуживает более 500 институциональных клиентов и в совокупности продала более 500 миллиардов долларов на более чем 100 электронных биржах, при этом под управлением находятся активы на сумму более 1,5 миллиарда долларов. В 2021 году Amber Group привлекла 100 миллионов долларов в рамках серии B и стала последним единорогом FinTech стоимостью более 1 миллиарда долларов. Для получения дополнительной информации посетите: www.ambergroup.io.

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

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