CHA:XSURGE 攻击事件的全面梳理 -ODAILY

前言

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

全盘梳理

基础信息

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

0x1514AAA4dCF56c4Aa90da6a4ed19118E6800dc46

-SurgeToken:

0xE1E1Aa58983F6b8eE8E4eCD206ceA6578F036c21

0xScope:Multichain漏洞影响了Fantom、Dogechain、Moonriver和Conflux:金色财经报道,7月7日,Multichain在发现大规模漏洞后停止运营。锁定在其MPC智能合约上的资产已被异常转移。

根据Web3知识图协议0xScope,该漏洞影响了Fantom、Dogechain、Moonriver和Conflux。

Multichain团队表示不确定事件的细节,目前正在调查该事件。PechShield估计该漏洞中被盗资产的价值约为1.26亿美元。截至撰写本文时,多链运营已关闭30多个小时,目前尚未确定恢复时间。[2023/7/9 22:26:42]

币安开放Ronin网络上AXS和SLP的充提业务:4月2日消息,币安现已开放Ronin网络上Axie Infinity(AXS)及Smooth Love Potion(SLP)代币的充值、提现业务。现阶段,币安将继续暂停Wrapped Ether(WETH)在以太坊网络上的提现业务,以及WETH与ETH的资产转换功能,以协助专门团队对该钱包地址内的异常交易予以监控。[2022/4/2 14:00:42]

攻击流程

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

Axie Infinity代币AXS本周上涨56%,跻身加密货币50强:过去7天,Axie Infinity代币AXS兑美元汇率上涨56.94%,至67.96美元,市值已跻身加密货币50强,目前排在第41位。AXS在90天内上涨934%,上月以来上涨227%。周一AXS经济价值39亿美元,交易额7.91亿美元。axie infinity网站访问量大增375%,至2290万,大部分流量来自菲律宾,其次是委内瑞拉、巴西、美国和阿根廷。Axie Infinity另一款代币SLP在两周内下跌14.8%,至0.175美元,周一市值2.13亿美元,交易额约1.23亿美元。(bitcoin.com)[2021/8/17 22:18:31]

漏洞原理

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

FOX(Foxswap)将于8月19日15:00上线BiKi:根据官方公告,FOX(Foxswap)将于8月19日15:00(GMT+8)上线BiKi平台,开放FOX/ETH交易对,同时开放充值和提现。

?FOX(Foxswap)是一个专业的去中心化交易平台,集成10多种token发行方式、多种资金监管方式,通过交易挖矿、流动性挖矿、邀请挖矿三种方式完成平台的快速冷启动,打造以太坊网络一站式资产发行、交易、投资平台。[2020/8/17]

虽然\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代币而获利。

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

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

金星链

聚币UST:Rust智能合约养成日记(5)-ODAILY

相关文章:Rust智能合约养成日记合约状态数据定义与方法实现Rust智能合约养成日记编写Rust智能合约单元测试Rust智能合约养成日记Rust智能合约部署.

[0:15ms0-0:883ms