此时计较mapEra_Emission[1]/16可到手续费为 2048/16 = 128 VETH,而进攻者兑换了约138 VETH 是足够用来付出手续费的,因此便可以通过上方代码块中的第 4 行将进攻者合约的mapAddress_Excluded置为 true。
通过生意业务概览可以看到进攻者在 Uniswap 中利用 0.9 ETH 兑换成 VETH,然后利用 VETH 在 Vether 合约中举办操纵,最终盗走巨额的 VETH。
2. 挪用 Vether 合约中的changeExcluded函数并操作先前在 Uniswap 兑换的约 138 VETH 付出 128 VETH 的手续费,然后将mapAddress_Excluded置为 true此刻利用 OKO 合约欣赏器对详细的进攻细节举办阐明(下图只展示一部门)https://oko.palkeo.com/0xdd1120a90ed4112b634266d6a244b93ca86785317bc75f0e170ab0cd97c65224/
通过阐明changeExcluded函数可以发明其可见性为external,因此进攻者合约可以直接挪用changeExcluded函数,此时进攻者合约的mapAddress_Excluded为 false,所以会进入 if 的逻辑中。}
黑客地点:
excludedArray.push(excluded); excludedCount +=1;
}
mapAddress_BlockChange[excluded] = block.number;
通过阐明生意业务内详细的细节可以发明:进攻者先建设了一个合约0x47Ed415006C6F8052Fff05fe983f31D6D24B8fDB 通过此合约对 Vether 合约中的 changeExcluded(unknown37217349) 函数与 transferFrom 函数举办了挪用。
通过查察合约可以发明:
_transfer(msg.sender, address(this), mapEra_Emission[1]/32);
require(value <= _allowances[from][msg.sender], ‘Must not send more than allowance’);
进攻细节
2020 年 7 月 1 日,VETH 合约遭遇黑客进攻。慢雾安详团队在收到情报后对本次进攻事件举办了全面的阐明,下面为各人就这次进攻事件展开详细的技能阐明。
可以看到在 transferFrom 函数中,先对 mapAddress_Excluded[msg.sender] 举办了 if 判定,详细逻辑是mapAddress_Excluded[msg.sender]为 false 时,将会检点对进攻者合约的授权额度,然后挪用_transfer函数举办转账。而这个逻辑显然走不通,进攻者合约是没有任何授权额度的。因此mapAddress_Excluded[msg.sender]只能为 true ,然后直接挪用_transfer函数举办转账。
returntrue;
totalFees += mapEra_Emission[1]/16;
修复发起
mapAddress_Excluded[excluded] = false;
}
完整的进攻流程如下:
接下来对 if 逻辑内的代码举办详细阐明:
在举办 if 逻辑后需要先付出手续费,详细为上方代码块中的第 3 行,那这个手续费是从那边来呢?谜底就是进攻者最初转入合约中的 0.9 ETH。4. 拿钱走人
VETH 合约地点
0x75572098dc462f976127f59f8c97dfa291f81d8b
接下来详细阐明该如何将mapAddress_Excluded[msg.sender]配置为 true:3. 挪用 transferFrom 函数,操作mapAddress_Excluded为 true,直接举办转账操纵
本次进攻生意业务如下 0xdd1120a90ed4112b634266d6a244b93ca86785317bc75f0e170ab0cd97c65224 if(!mapAddress_Excluded[excluded]){
_transfer(from, to, value);
此次进攻主要操作 Vether 合约中changeExcluded函数的可见性为external且未有权限限制,用户可以直接举办外部挪用为进攻缔造了须要的条件。因此应做好对changeExcluded函数的权限或可见性的限制,从而制止任意用户可以直接外部挪用changeExcluded函数。 totalFees += mapEra_Emission[1]/32;
0xfa2700e67065bc364136b5e7f57112083cb2a0cd
}
1. 建设进攻合约,通过 Uniswap 将 0.9 ETH 兑换成约138 VETH(此处换币为了后续付出手续费)
图中可以看到,通过 0.9 ETH 兑换成约 138 VETH。
接下来对这两个函数的详细代码举办阐明:
0xdd1120a90ed4112b634266d6a244b93ca86785317bc75f0e170ab0cd97c65224
合约在初始化时只将address(this)和burnAddress的mapAddress_Excluded置为 true,那么可以必定尚有其他逻辑可以配置mapAddress_Excluded,通过阐明 Vether 合约可以发明changeExcluded函数可以实现对mapAddress_Excluded的配置。
} else {
if(!mapAddress_Excluded[msg.sender]){
function changeExcluded(address excluded) external {
mapAddress_Excluded[excluded] = true;
mapAddress_BlockChange[excluded] = block.number;
function transferFrom(address from, address to, uint value) public override returns (bool success) {
_transfer(msg.sender, address(this), mapEra_Emission[1]/16);
通过计较代码中的mapEra_Emission[1]/16我们可以获得进攻者需要付出的手续费:我们读取合约中的 mapEra_Emission可以知道 mapEra_Emission[1]为 2048。
媒介
进攻生意业务:
_allowances[from][msg.sender] -= value;
,
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。