作者:于丹@慢雾保安队

据慢雾地区消息,2021年5月28日,币智能链(BSC)DeFi项目burgerswap遭到黑客攻击,损失330万美元。慢雾安全小组**参与分析,分享结果如下:
攻击细节分析
Burgerswap是Uniswap AMM项目的仿制品,但它不同于Uniswap体系结构。交换体系结构通常分为[委托-gt;lpPlatForm-gt;Pair】。委托层管理所有Pair信息,并负责创建lpplatform层。然后lpplatform层创建相应的pair contract。在整个架构中,平台层作为Uniswap的路由器,负责将计算出的事务数据和**币转发给pair contract完成交换。

此事件的根源是此体系结构的问题。通过逐步分析攻击者的交易行为,可以还原整个攻击过程的核心

这次袭击始于pancake的闪电贷款。攻击者从pancake借用大量wbnb,然后通过burgerswap传递这些wbnb;换汉堡币。在完成上述操作后,攻击者创建一个事务对,并使用自己的币代(攻击契约本身)和burger 币代通过委托层添加流动性,为后续攻击做准备。

生成币后,攻击者立即通过paltform层的swapexacttokenssfortokens函数发起交换,交换路径为[生成币由攻击者控制-gt;汉堡-gt;WBNB】

接下来,执行最关键的操作。
;
由于攻击者在创建事务对时使用了自己控制的**币,因此在**币的交换过程中,innertransferfrom函数调用了攻击者控制的**币合约,攻击者可以在innertransferfrom函数中重新输入swapexactTokens for tokens函数。攻击者为什么要这样做?

通过对平台层swap exacttokens for tokens函数的代码分析,不难发现契约在调用innertransferfrom函数时,先计算用户的交换数据,然后在操作innertransferfrom函数后调用,预计算的数据代表币被转发到底层进行真正的交换。从这个函数的角度来看,即使攻击者重新输入swapexacttokens for tokens函数,底层swap函数也是独立的。乍一看,没有问题,但链条上的一个行为却引起了慢雾安保团队的注意

我们惊奇地发现,在再入交换过程中,交换量并没有因为滑动点而减少。原因是什么?似乎关键是潜在的配对契约问题。我们进一步分析了底层调用的pair contract,代码如下:

通过分析pair的代码,我们惊讶地发现,在交换过程中,合约没有按照常数积公式检查交换后的价值!!也就是说,pair契约完全依赖于平台层的数据进行交换,导致了这一事件的发生。由于pair层本身不校验常数积,在重入时预先计算平台层交换数据,innertransferfrom函数完成后,pair的更新数据不反映在平台层。因此,交易所在再入交易中产生的滑动点不影响下一个交易所,造成损失。图片如下:

总结
此攻击属于交换体系结构问题。pair层完全信任paltform层的数据,不会再次检查,从而导致攻击。近年来,DeFi安全事件频发。针对DAPP攻击日益密集的现状,slow fog安全团队建议DAPP开发者在移植其他协议的代码时,应充分了解迁移协议的架构,充分考虑迁移协议与自身项目的兼容性,并且只有经过专业的安全审计机构审计后才能上线,以防止资金损失的发生。
;
攻击事务引用:
https://bscscan.com/tx/0xac8a739c1f668b13d065d56a03c37a686e0aa1c9339e79fcbc5a2d0a6311e333
文章标题:我骗了自己——汉堡包被窃听了
文章链接:https://www.btchangqing.cn/268821.html
更新时间:2021年05月29日
本站大部分内容均收集于网络,若内容若侵犯到您的权益,请联系我们,我们将第一时间处理。