北京时间2023年10月11日,BNBChain上的BH代币遭受攻击,攻击者获利约120万美元。SharkTeam对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。一、事件分析攻击者地址:0xfdbfceea1de36036408
北京时间2023年10月11日,BNB Chain上的BH代币遭受攻击,攻击者获利约120万美元。
SharkTeam对此事件第一时间进行了技术分析,并总结了安全防范手段,希望后续项目可以引以为戒,共筑区块链行业的安全防线。
#
攻击者地址:
0xfdbfceea1de360364084a6f37c9cdb7aaea63464(简记为0xfdbf)
攻击合约:
0x216ccfd4fb3f2267677598f96ef1ff151576480c(简记为0x216c)
0xf040735f8619d8615cf0ee532f58c106c4924300(简记为0xf040)
被攻击合约:
0x8ca7835aa30b025b38a59309dd1479d2f452623a(简记为0x8ca7)
攻击交易:
0xc11e4020c0830bcf84bfa197696d7bfad9ff503166337cb92ea3fade04007662
攻击流程如下:
1. 攻击者从多个合约中通过闪电贷借入共计26,521,678 USDT。
(1)攻击合约0x216c通过攻击合约0xf040调用flashloan函数借入1,521,678.713 USDT;
(2)攻击合约0x216c调用Uniswap的2个LP合约中的swap函数借入25,000,000 USDT。
通过两种闪电贷,攻击者共借入26,521,678 USDT。
2. 循环调用被攻击合约中的Upgrade函数,共计12次。Upgrade函数包含以下5个功能:
(1)调用者将USDT转移到被攻击合约;
(2)将10%的USDT转移至 0xc9fc938bcf691affa79c9fec3d1719f6297fa20e;
(3)将60%的USDT添加流动性到USDT/BH-LP合约中,其中BH直接从被攻击合约中扣除;
(4)将剩余的30%通过USDT/BH-LP合约兑换成BH;
(5)将兑换的BH转账给指定地址。
该Upgrade函数主要功能是将调用者转入的USDT的60%添加流动性,流动性中的另一种BH代币则直接由被攻击合约0x8ca7支付。
因为调用Upgrade函数会将30%的USDT兑换BH。因此,每调用一次Upgrade函数,USDT/BH-LP中BH价格上涨。在调用Upgrade前USDT与BH的比例大约为1:96。
循环调用12次Upgrade函数,攻击者共添加流动性79,672.096,转移13,590 USDT。因进行兑换的数量相比于LP合约中的代币余额很小,因此,USDT与BH的比例几乎未变,大约仍为1:96。
3. 调用被攻击合约中的0x33688938函数,如下:
通过该函数,攻击者共添加流动性19,487,579.804,转移 3,000,000 USDT。在该函数执行完成后,USDT与BH的比例变为1:57,BH的价格上涨。
4. 通过PancakeSwap,将22,000,000 USDT兑换成209,261,023 BH。
因兑换的代币数量很大,兑换成功后,USDT与BH的比例变为1:1.6,BH的价格暴涨。
5. 环调用被攻击合约中的0x4e290832函数,共计10次。0x4e290832函数主要是溢出流动性,这一点恰与Upgrade函数相反,其同样包含5个功能,如下:
(1)销毁BH,即将BH从攻击合约0x216c转移到被攻击合约0x8ca7,然后销毁(即再次转移至零地址)。销毁数量为调用0x4e290832函数传递的参数。该参数是LP合约中BH余额的55%,该比例定义在攻击合约0x216c中,由交易inputdata传入合约。
(2)溢出流动性。根据销毁的BH数量,计算出需要溢出的流动性,然后移除流动性,获得USDT和BH。
从数量上看,销毁的BH数量与移除流动性获得的BH数量相近。因此,移除流动性获得的USDT数量是根据LP中BH的价格(USDT和BH的数量比例)来计算的。BH价格越高,获得的USDT越多。
(3)USDT转移。将获得的USDT的85%转移到攻击合约0x216c中。因为BH价格被太高,因此可以获得更多的USDT。
(4)添加流动性。将获得的USDT的10%重新添加流动性。
(5)兑换。将获得的USDT剩余的5%兑换成BH,BH价格再次被抬高。因为兑换数量较少,BH价格被抬高的也相对不明显。
循环调用10次0x4e290832函数,因BH价格被太高很多,所以可获得更多的USDT。另外,在第二次调用0x4e290832函数时,移除的流动性依然超过攻击者添加的总流动性。在本次攻击交易中,除了抬高了BH的价格外,0x4e290832函数在移除流动性时并未限制流动性的数量,使得攻击者移除了部分被攻击合约中原有的LP,从而获得了额外的利益。
循环调用10次0x4e290832函数,攻击者共收到26,358,571 USDT,比闪电贷的25,013,590 USDT多出 1,344,981 USDT。
6. 闪电贷还款,包括闪电贷的手续费,并将剩余的1,275,981 USDT转移给攻击者地址0xfdbf。
本次攻击利用了被攻击合约的0x4e290832函数中的漏洞,通过抬高BH的价格,最终获利。其中包含了2个漏洞:
(1)0x4e290832函数移除流动性时并没有检查移除的流动性数量是否超过其添加的流动性,业务上并不严谨;
(2)0x4e290832函数在计算移除的流动性数量时是根据参数中的BH数量以及LP中的BH价格计算得到的,而添加流动性时的BH是由被攻击合约提供,因此,操纵BH价格可以让攻击者在移除流动性时获得更多的USDT。
本次事件中,攻击者利用这两个漏洞发起攻击,获得了大约120万美元。
#
针对本次攻击事件,我们在开发过程中应遵循以下注意事项:
(1)严格检查业务逻辑,避免业务中的不严谨逻辑。对于依托LP中的代币价格的计算逻辑,更要严格审计,避免出现操纵价格的情况。
(2)项目上线前,需要向第三方专业的审计团队寻求技术帮助。
#
SharkTeam的愿景是保护Web3世界的安全。团队由来自世界各地的经验丰富的安全专业人士和高级研究人员组成,精通区块链和智能合约底层理论。提供包括链上大数据分析、链上风险预警、智能合约审计、加密资产追讨等服务,并打造了链上大数据分析和风险预警平台ChainAegis,平台支持无限层级的深度图分析,能有效对抗Web3世界的高级持续性盗窃(Advanced Persistent Theft,APT)风险。已与Web3生态各领域的关键参与者,如Polkadot、Moonbeam、polygon、OKX、Huobi Global、imToken、ChainIDE等建立长期合作关系。
Twitter:<https://twitter.com/sharkteamorg>
Telegram:<https://t.me/sharkteamorg>
Discord:<https://discord.gg/jGH9xXCjDZ>
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!