2020年7月1日,VETH合约遭遇黑客攻击。慢雾安全团队在收到情报后对本次攻击事件进行了全面的分析。下面为大家就这次攻击事件展开具体的技术分析。
攻击细节
本次攻击交易如下:
0xdd1120a90ed4112b634266d6a244b93ca86785317bc75f0e170ab0cd97c65224
通过交易概览可以看到攻击者在 Uniswap 中使用0.9ETH兑换成VETH,然后使用VETH在Vether合约中进行操作,最终盗走巨额的VETH。
现在使用OKO合约浏览器对具体的攻击细节进行分析(下图只展示一部分): [链接]
通过分析交易内具体的细节可以发现:攻击者先创建了一个合约0x47Ed415006C6F8052Fff05fe983f31D6D24B8fDB,通过此合约对Vether合约中的changeExcluded(unknown37217349)函数与transferFrom函数进行了调用。
接下来对这两个函数的具体代码进行分析:
function transferFrom(address from, address to, uint value) public override returns(bool success){ if(!mapAddress_Excluded[msg.sender]){ require(value <= _allowances[from][msg.sender], "Must not send more than allowance"); _allowances[from][msg.sender] -= value; } _transfer(from, to, value); return true; }
可以看到在transferFrom函数中,先对mapAddress_Excluded[msg.sender]进行了if判断,具体逻辑是mapAddress_Excluded[msg.sender]为false时,将会检查对攻击者合约的授权额度,然后调用_transfer函数进行转账。而这个逻辑显然走不通,攻击者合约是没有任何授权额度的。因此mapAddress_Excluded[msg.sender]只能为true,然后直接调用_transfer函数进行转账。
接下来具体分析该如何将mapAddress_Excluded[msg.sender]设置为true:
通过查看合约可以发现:
合约在初始化时只将address(this)和burnAddress的mapAddress_Excluded置为true,那么可以肯定还有其他逻辑可以设置mapAddress_Excluded,通过分析Vether合约可以发现changeExcluded函数可以实现对mapAddress_Excluded的设置。
function changeExcluded(address excluded) external{ if(!mapAddress_Excluded[excluded]){ _transfer(msg.sender, address(this), mapEra_Emission[1]/16); mapAddress_Excluded[excluded] = true; excludedArray.push(excluded); excludedCount += 1; totalFees += mapEra_Emission[1]/16; mapAddress_BlockChange[excluded] = block.number; } else{ _transfer(msg.sender, address(this), mapEra_Emission[1]/32); mapAddress_Excluded[excluded] = false; totalFees += mapEra_Emission[1]/32; mapAddress_BlockChange[excluded] = block.number; } }
通过分析changeExcluded函数可以发现其可见性为external,因此攻击者合约可以直接调用changeExcluded函数,此时攻击者合约的mapAddress_Excluded为false,所以会进入if的逻辑中。
接下来对if逻辑内的代码进行具体分析:
在进行if逻辑后需要先支付手续费,具体为上方代码块中的第3行,那这个手续费是从哪里来呢?答案就是攻击者最初转入合约中的0.9ETH。
图中可以看到,通过0.9ETH兑换成约138VETH。
通过计算代码中的mapEra_Emission[1]/16我们可以得到攻击者需要支付的手续费:我们读取合约中的mapEra_Emission可以知道mapEra_Emission[1]为2048。
此时计算mapEra_Emission[1]/16可得手续费为2048/16=128VETH,而攻击者兑换了约138VETH是足够用来支付手续费的,因此便可以通过上方代码块中的第4行将攻击者合约的mapAddress_Excluded置为true。
完整的攻击流程如下:
1. 创建攻击合约,通过Uniswap将0.9ETH兑换成约138VETH(此处换币为了后续支付手续费) 2. 调用Vether合约中的changeExcluded函数并利用先前在Uniswap兑换的约138VETH支付128VETH的手续费,然后将mapAddress_Excluded置为true 3. 调用transferFrom函数,利用mapAddress_Excluded为true,直接进行转账操作 4. 拿钱走人
黑客地址:
0xfa2700e67065bc364136b5e7f57112083cb2a0cd
攻击交易:
0xdd1120a90ed4112b634266d6a244b93ca86785317bc75f0e170ab0cd97c65224
VETH合约地址:
0x75572098dc462f976127f59f8c97dfa291f81d8b
修复建议
此次攻击主要利用Vether合约中changeExcluded函数的可见性为external且未有权限限制,用户可以直接进行外部调用为攻击创造了必要的条件。因此应做好对changeExcluded函数的权限或可见性的限制,从而避免任意用户可以直接外部调用changeExcluded函数。
现在普通的交易所不一定是最安全的。比如我现在用的BTBTOP,这是一家小交易所,但由于体积小,投资成本大,没有必要为我的小钱逃跑。大型交易所并不是绝对安全的。你想要火币和Okex。这些交易所很大,但政策风险也很高,对用户...
什么是嵌套?嵌套是指金融服务提供商在另一家金融机构创建账户并使用其服务的行为。账户持有人通过嵌套账户向客户提供服务,发挥桥梁作用。造成这种情况的原因有很多。例如,一个国家的银行可以向其他国家的银行提供业务服务和生态系统,...
币客交易所在上百家交易所中排行27,排名非常靠后的交易平台,币客交易所曝光过多次交易问题,并不是正规的交易所,而且成交量只有18.76亿美元,是非常低的。我们拿世界前3名的交易所做个比较,比如欧易交易所,24小时候成交量...
多元资产跨链交易平台 Sigmadex,巨大的流动性自动引入,使用户能够顺利无缝地买卖不同区块链的加密货币资产。Sigmadex 是为了解决市场营运资金分散、交易延迟、黑客攻击、「集资走佬」骗局、繁琐KYC 程序、单一区...