URG:XSURGE 攻击事件的全面梳理 -ODAILY_FintraDao

前言

8月17日,BSC链上的XSURGE协议遭到闪电贷攻击,损失超过500万美元。对此,知道创宇区块链安全实验室对攻击流程和代码细节进行了全盘梳理。

全盘梳理

基础信息

-攻击tx:0x7e2a6ec08464e8e0118368cb933dc64ed9ce36445ecf9c49cacb970ea78531d2-攻击合约:

0x1514AAA4dCF56c4Aa90da6a4ed19118E6800dc46

-SurgeToken:

0xE1E1Aa58983F6b8eE8E4eCD206ceA6578F036c21

ApeCoin社区发起提案AIP-275拟优化ApeCoin DAO治理参与:金色财经报道,ApeCoin社区发起提案AIP-275拟优化ApeCoin DAO治理参与,据悉该提案由DAO生态发现及分析引擎DeepDAO增长负责人Aman撰写,旨在利用数据分析和细分来识别和解决参与ApeCoin DAO的障碍,从而制定量身定制的激励措施和举措,通过深入了解APE代币持有者的兴趣和活动模式,DAO可以优化其治理流程并培育一个更加积极参与和充满活力的社区。DeepDAO将为ApeCoin DAO 提供有关所有治理参与者和非活跃APE代币持有者的分析报告、兴趣/活动分析CSV文件等。Snapshot数据显示,该提案的投票结束日期为7月20日,当前反对票比例为91.79%。[2023/7/16 10:58:00]

Huobi宣布与Justlend DAO达成战略合作,支持stUSDT:据官方消息,Huobi宣布与Justlend DAO达成战略合作,支持stUSDT质押服务。此次合作旨在推动双方在加密货币领域的合作,深化RWA赛道布局,并为虚拟资产的发展和创新提供更加安全、可信的路径。

据了解,stUSDT平台在Tron(波场)上为用户提供质押USDT获取RWA (Real World Assets)奖励的质押服务。Huobi为支持RWA生态发展,将在平台内对stUSDT资产提供等同链上的赚取能力,Huobi将以stUSDT为入口,支持stUSDT项目质押,为火币用户打通接入,以赚取稳定的RWA奖励。即火币用户持有stUSDT即可在Huobi平台获取质押收益。[2023/7/3 22:15:23]

攻击流程

Treasure DAO推出游戏工作室Darkbright:据官方消息,Treasure DAO推出游戏工作室Darkbright,将负责生态内Smolverse NFT项目游戏的开发。[2023/3/3 12:40:12]

这里有个小细节,代币转移流程中的顺序是按照事件先后顺序来显示的,而重入之后的买操作引起的事件会在卖操作引起的事件之前,所以在流程中看到的每一个单独的重入攻击中是SURGE的买入发生在卖出之前。

漏洞原理

漏洞点在于SurgeToken合约中的sell()函数,其中对调用者msg.sender的BNB转账采用的call()函数,并且在转账之后才更新代币总量_totalSupply,是典型的重入漏洞场景。

Wonderland DAO投票拟关闭Wonderland并退还资金,目前55%赞成:1月30日消息,Wonderland DAO于1月27日开始投票罢免Sifu,并于1月29日以多数票通过。与此同时,该项目正在举行另一场关于提议关闭Wonderland、退还资金的投票,目前55%投下了赞成票。[2022/1/30 9:22:22]

虽然\nsell()函数使用了nonReentrant修饰防止了重入,但purchase()函数并没有。重入转回BNB给合约,触发\nfallback函数调用purchase(),由于_totalSupply尚未减去卖出量,而导致可买入相较正常更多的SURGE代币。

复现

价格分析

sell()函数卖出过程中,输入tokenAmount与输出amountBNB的关系:

purchase()函数买入过程中,输入bnbAmount与输出tokensToSend的关系:

在重入过程中,sell()函数卖出后获得的BNB通过重入打回SurgeToken合约传入purchase()函数故令sell()函数的输出amountBNB与purchase()函数的输入bnbAmount相等,可得到整个利用流程中输入与输出的关系:

若要实现套利,需要输出大于输入,则有:

最后得到:

也就是说重入套利过程中调用sell()卖出的代币量必须在代币总量的12.383%以上

模拟演示

为方便调试,将SurgeToken合约中的mint()函数可见性改为public,并为构造函数增加payable修饰,在部署时传入10^15wei。

SurgeToken合约初始化的代币总量为10^9,根据前面推导出的结论,为攻击合约铸币200000000,则攻击合约拥有大约SURGE代币总量16%的代币。

攻击合约调用Attack()函数攻击,查看攻击合约的代币余额已变为209549307,获利9549307。

总结

XSURGE协议被攻击的本质原因在于sell()函数中存在重入漏洞,导致可通过purchase函数买入较多的SURGE代币而获利。

简而言之,典型的重入漏洞场景,教科书级的案例。

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

大币网

[0:0ms0-5:573ms