前言
8月17日,BSC链上的XSURGE协议遭到闪电贷攻击,损失超过500万美元。对此,知道创宇区块链安全实验室对攻击流程和代码细节进行了全盘梳理。
全盘梳理
基础信息
-攻击tx:0x7e2a6ec08464e8e0118368cb933dc64ed9ce36445ecf9c49cacb970ea78531d2-攻击合约:
0x1514AAA4dCF56c4Aa90da6a4ed19118E6800dc46
-SurgeToken:
0xE1E1Aa58983F6b8eE8E4eCD206ceA6578F036c21
0xScope:某EOA地址现持有约5900万枚ARB,或为Upbit热钱包地址:3月31日消息,Web3知识图谱协议0xscope在社交媒体上发文表示,某EOA地址在过去一日内收集了大量ARB,目前已持有约5900万枚,价值约合8440万美元。0xScope补充表示,据活动数据显示,0xScope认为该地址可能是Upbit热钱包地址,若推测是正确的,那么Upbit平台持有的ARB数量将仅次于Binance。
此前报道,韩国加密交易平台Upbit昨日表示将上线ARB,设有ARB/KRW以及ARB/BTC交易对,计划于北京时间3月30日14:00开始交易。[2023/3/31 13:37:05]
xSigma与Maxim合作推出NFT市场MaximNFT:金色财经报道,纳斯达克上市公司正康国际股份有限公司子公司xSigma与Maxim签订合作协议,推出独家NFT市场MaximNFT。根据协议条款,xSigma的开发商和NFT设计师将运营NFT平台,该平台将由Maxim在其数字、社交和出版资产中认可和推广。
此外,MaximNFT将成为Maxim自己的NFT的独家销售商,MaximNFT寻求提供最佳的客户体验和创新的NFT解决方案,它将允许客户在各种区块链上创建和销售NFT,包括但不限于以太坊、Binance智能链和Polkadot。一些收藏品将为买家带来独特的真实世界体验。此外,MaximNFT市场将提供一个创新的 \"NFT代币化 \"功能,允许客户在市场上交易任何NFT的零头。(prnewswire)[2021/8/26 22:39:42]
攻击流程
公告 | 币安完成4月份GAS、ONG、VTHO和NPXS的发放:据币安公告,币安已完成2019年4月份GAS、ONG、VTHO、NPXS的发放。[2019/5/5]
这里有个小细节,代币转移流程中的顺序是按照事件先后顺序来显示的,而重入之后的买操作引起的事件会在卖操作引起的事件之前,所以在流程中看到的每一个单独的重入攻击中是SURGE的买入发生在卖出之前。
漏洞原理
漏洞点在于SurgeToken合约中的sell()函数,其中对调用者msg.sender的BNB转账采用的call()函数,并且在转账之后才更新代币总量_totalSupply,是典型的重入漏洞场景。
声音 | Fxstreet分析师:BTC近期波动是由投机交易驱动:Fxstreet分析师Tanya Abrosimova认为,BTC当前依然在进行宽幅波动,没有明显的突破方向,近期的波动是由短期投机交易驱动的。当前BTC的短期支撑在7000美元,跌破后将回撤100日均线(6894美元),向上多头完全突破7400美元后,有望涨至7839美元。[2018/9/3]
虽然\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代币而获利。
简而言之,典型的重入漏洞场景,教科书级的案例。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。