SWAP:我竟了我自己?—— BurgerSwap 被黑分析

By:yudan@慢雾安全团队

据慢雾区消息,2021年05月28日,币安智能链(BSC)DeFi项目BurgerSwap被黑,损失达330万美元。慢雾安全团队第一时间介入分析,并将结果分享如下:

攻击细节分析

BurgerSwap是一个仿UniswapAMM项目,但是和Uniswap架构有所区别。BurgerSwap架构总体分成。其中Delegate层管理了所有的Pair的信息,并负责创建lpPlatForm层。然后lpPlatForm层再往下创建对应的Pair合约。在整个架构中,lpPlatForm层充当了Uniswap中Router的角色,负责将计算交易数据和要兑换的代币转发到Pair合约中,完成兑换。

分析:美股焦点已经从“加密货币”和“元宇宙”转移到“人工智能”:金色财经报道,尽管美元利率和固定收益的收益率在持续上升,但今年美股走势依然表现较好,纳斯达克指数年涨幅达到35%,标准普尔500指数则上涨了12%。根据MacroScope的分析数据显示,“六家顶级科技公司的总市值已经达到8.4万亿美元,占到标准普尔500指数的23%,这些科技巨头的市盈率 (PE) 介于29 (Apple) 和66 (Tesla) 之间”,目前美股焦点已经从“加密货币”和“元宇宙”转移到“人工智能”。然而,随着未来稳健盈利增长的前景面临挑战,这一趋势的可持续性将受到考验。(cryptoslate)[2023/6/12 21:32:17]

欧盟官员:欧盟各国政府对严格的加密货币银行资本限制持友好态度:金色财经报道,据一位主导新立法谈判的官员称,欧盟各国政府似乎支持新的银行资本标准,这可能会使无担保的加密货币被视为贷款人持有的风险最大的一种资产。此举可能意味着比特币和以太坊等资产被赋予最大可能的风险权重,作为一套冗长的银行法的一部分,该法最快可能在下周达成。[2023/6/9 21:26:36]

本次事件的根本正是出在这种架构的问题上。通过一步步分析攻击者的交易行为,我们来还原整个攻击过程的核心:

Ripple与支付公司MSF Africa达成合作:金色财经报道,Ripple宣布已经与MSF Africa建立了合作关系,预计将帮助35个国家的客户简化实时移动支付。作为协议的一部分,非洲领先的金融科技集团MSF Africa将使用Ripple的加密解决方案,即按需流动性。MSF在非洲大陆拥有800个支付通道,Ripple与MSF合作的进展,将使整个地区有机会获得“金融包容性利益”。(news.bitcoin)[2022/11/18 13:22:03]

本次攻击开始于Pancake的闪电贷,攻击者从Pancake中借出了大量的WBNB,然后将这些WBNB通过BurgerSwap?兑换成Burger代币。在完成以上的操作后,攻击者使用自己控制的代币(攻击合约本身)和Burger代币通过Delegate层创建了一个交易对并添加流动性,为后续攻击做准备。

纽约现代艺术博物馆计划使用拍卖收益购买 NFT:9月14日消息,纽约现代艺术博物馆(MoMA)计划拍卖CBS创始人(William S. Paley)价值7000万美元的艺术藏品,包括毕加索等知名艺术家的作品。此外,MoMA还计划使用部分拍卖所得购买NFT。(华尔街日报)[2022/9/14 13:29:44]

在完成代币的创建和准备之后,攻击者立马通过PaltForm层的swapExactTokensForTokens函数发起了兑换,兑换路径为

接下来进行了最关键的一次操作。

V神:以太坊不需要为Layer 1使用单一的ZK-EVM实现进行标准化:金色财经报道,以太坊创始人Vitalik Buterin发文解释了“不同类型的ZK-EVM和类似ZK-EVM的项目,以及它们之间的权衡”。V神例举了描述了多个EVM等价的不同“类型”的分类,以及尝试实现每种类型的好处和成本。

V神总结称,就我个人而言,我希望随着时间的推移,通过ZK-EVM的改进和以太坊本身的改进相结合,使其对ZK-SNARK更加友好,一切都将成为Type1。在这样的未来,我们将有多个ZK-EVM实现,它们既可以用于ZK汇总,也可以用于验证以太坊链本身。

从理论上讲,以太坊不需要为Layer1使用单一的ZK-EVM实现进行标准化;不同的客户可以使用不同的证明,因此我们继续从代码冗余中受益。但是,要实现这样的未来,还需要相当长的时间。与此同时,我们将在扩展以太坊和基于以太坊的ZK-rollup的不同路径中看到许多创新。[2022/8/4 12:02:16]

由于先前攻击者在创建交易对的时候使用的是自己控制的代币,在代币兑换过程中,_innerTransferFrom函数会调用攻击者控制的代币合约,于是攻击者可以_innerTransferFrom函数中重入swapExactTokensForTokens函数。为什么攻击者要这样做呢?

通过对PlatForm层的swapExactTokensForTokens函数进行代码分析,我们不难发现,合约在调用_innerTransferFrom函数时首先计算了用户的兑换数据,然后在_innerTransferFrom函数的操作后使用预先计算的数据来转发到底层进行真正的代币兑换。从这个函数层面来看,就算攻击者重入了swapExactTokensForTokens函数,底层调用的swap函数也是独立的,咋一看并没有什么问题,但是链上的一个行为引起了慢雾安全团队的注意:

我们惊讶地发现,在重入的兑换过程中,兑换的数量竟然没有因为滑点的关系而导致兑换数量的减少。这究竟是什么原因呢?看来关键是底层的Pair合约的问题了。我们又进一步分析了底层调用的Pair合约,代码如下:

通过分析Pair的代码,我们再次惊讶地发现在swap的过程中,合约竟然没有在兑换后根据恒定乘积公式检查兑换后的数值!!也就是说,Pair合约完全依赖了PlatForm层的数据进行兑换,导致了本次事件的发生。由于Pair层本身并不做恒定乘积的检查,在重入的过程中,PlatForm层的兑换数据预先进行了计算,在_innerTransferFrom函数完成后,Pair的更新数据也没有反映到PlatForm层中,导致重入交易中的兑换产生的滑点并不影响下一次的兑换,从而造成了损失。用图来看的话大概如下:

总结

本次攻击属于BurgerSwap架构上的问题,由于Pair层完全信任PaltForm层的数据,并没有自己再做一次检查,导致攻击的发生。最近DeFi安全事件频发,针对越来越密集的DApp攻击事件,慢雾安全团队建议DApp开发者在移植其他协议的代码时,需充分了解移植协议的架构,并充分考虑移植协议和自身项目的兼容性,且需通过专业安全审计机构的审计后才上线,防止资金损失情况的发生。

攻击交易参考:

https://bscscan.com/tx/0xac8a739c1f668b13d065d56a03c37a686e0aa1c9339e79fcbc5a2d0a6311e333

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金星链

[0:0ms0-1:29ms