PRO:黑客获利约630万美元 算法稳定币$DEI被攻击事件分析

2023年5月6日,据Beosin-Eagle?Eye态势感知平台消息,算法稳定币DEI项目合约遭受黑客攻击,黑客获利约630万美元。Beosin安全团队第一时间对事件进行了分析,结果如下。

事件相关信息

攻击交易

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

https://arbiscan.io/tx/0xb1141785b7b94eb37c39c37f0272744c6e79ca1517529fec3f4af59d4c3c37ef

Themis Protocol遭受预言机操纵攻击,黑客获利约37万美元:6月28日消息, DeFi协议Themis Protocol发推确认协议被利用,暂停借贷功能,称目前第一个选择是尝试与黑客合作取回资金,若黑客不愿意合作将与当局合作解决,目前正在制定补偿计划。

据ChainAegis安全监测显示,Themis Protocol遭受预言机操纵攻击,攻击者窃取了37万美元。[2023/6/28 22:05:10]

攻击者地址

Bsc:0x08e80ecb146dc0b835cf3d6c48da97556998f599

Arbitrum:0x189cf534de3097c08b6beaf6eb2b9179dab122d1

安全公司:MooCakeCTX项目黑客获利约143921美元:11月7日消息,MooCakeCTX遭到攻击,截至写稿时为止,黑客获利约143921美元。

经Fairyproof初步分析,发现疑似原因为该合约在用户质押前(depositAll函数)未结算奖励进行复投(未调用`earn`函数),这会导致用户在质押后就马上能获取以前的质押分红。攻击者在同一个区块内使用闪电贷借出 50000个cake代币后,连续两次进行质押,然后再提取质押的cake代币,归还后获利。攻击地址为: 0x35700c4a7bd65048f01d6675f09d15771c0facd5 , Fairyproof正严密注意该地址的动向,并提醒类似的合约注意防范此类问题。[2022/11/7 12:27:46]

被攻击合约

NFT 借贷协议 XCarnival 遭到攻击,黑客获利约 380 万美元:6月26日消息,PeckShield 发推称,NFT 借贷协议 XCarnival 遭到攻击,黑客获利 3087 枚以太坊(约 380 万美元),而协议损失可能更高。黑客地址为 0xb7CBB4d43F1e08327A90B32A8417688C9D0B800a,PeckShield 表示本次攻击或由于已解除抵押的 NFT 仍被作为抵押品所致。[2022/6/27 1:33:01]

0xde1e704dae0b4051e80dabb26ab6ad6c12262da0

攻击流程

两条链上漏洞原理以及攻击手法相同,这里以Bsc链上交易为例进行分析:

BlockSecAlert: Agave合约遭受攻击黑客获得约540万美元的利润:3月15日消息,根据BlockSec报告,xDai Chain上Agave合约因为一个非信任的外部调用遭受攻击。攻击者在没有任何负债的情况下调用了`liquidateCall` 函数来清算自己。在清算过程中,清算合约调用了攻击者合约,攻击合约在此过程中存入了2728个通过闪电贷获取的WETH,铸造出2728 aWETH。并以此为抵押,借出了Agave项目中所有可用资产。外部调用结束后,`liquidateCall`函数直接清算了攻击者之前存入的2728 aWETH,并将其转给清算者。攻击交易见原文链接。据此前消息,Agave发推称,协议遭到攻击,目前已暂停合约,之后会公布具体情况。[2022/3/15 13:58:22]

1.攻击者调用攻击合约的0xf321f780函数发起攻击。

2.攻击合约首先调用DEI合约的approve函数给pair授权一个很大的值,随后调用DEI合约的burnFrom函数,传入pair地址。

3.随后,攻击合约直接调用DEI合约的transferFrom函数将pair的DEI代币全部转移给攻击合约,只剩下一个单位的DEI代币。

4.之后,攻击合约调用pair的sync函数,更新储备量,此时pair中只有1个单位的DEI和超130万枚USDT。

5.最后,攻击合约使用所有的DEI将USDC全部兑换出来。

漏洞分析

我们从上述的攻击过程不难发现,本次事件的主要问题在于第2步与第3步,攻击者调用了approve和burnFrom函数之后,为什么就能直接调用transFrom函数将“其他人”的代币转移走?

我们看一下approve与burnFrom函数的代码,approve函数为正常授权函数,并没有什么问题,关键在于burnFrom函数,burnFrom函数正常逻辑是获取被销毁地址给调用者地址授权数量,之后将授权数量减去销毁数量的新值用于更新授权数量。可以看到,309行的代码函数获取用户授权值,而开发者将被销毁地址与调用者地址写反,导致获取的授权值是黑客可以任意设置的,在这之前,黑客调用approve函数授权了一个巨大的数,所以这里获取的值是一个巨大的值,在310行代码,将授权值进行更新,这里传递的值就是一个异常大的值,导致burnFrom函数调用结束后,pair地址给黑客地址授权了一个巨大的值,而黑客也能任意控制pair的代币。

资金追踪

截止发文时,被盗资金还未被攻击者转出。

总结

针对本次事件,Beosin安全团队建议:

1.合约开发时,涉及权限相关的函数一定要仔细思考其运行逻辑,并做好每一步的测试,防止因为粗心大意导致不可挽回的后果。

2.项目上线前,建议选择专业的安全审计公司进行全面的安全审计,规避安全风险。

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

链链资讯

[0:15ms0-2:881ms