售前客服二维码
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!
前言
2020年7月1日,VETH合同遭到黑客攻击。收到情报后,慢雾安全小组对这次袭击进行了全面分析。下面是对这次攻击的详细技术分析。
攻击细节
攻击事务如下:0xdd 1120 a 90 ed 4112 b 634266 d6a 244 b 93 ca 86785317 BC 75 f 0 e 170 ab 0 CD 97 c 65224
从交易概述中,我们可以看到攻击者在Uniswap中用0.9以太网交换VETH,然后在VETH合同中使用VETH进行操作,最后窃取了大量VETH。
现在使用OKO合同浏览器来分析具体的攻击细节(下图只显示了一部分)https://Oko.palkeo.com/0xdd1120a90ed4112b 634266 d6a 244 b93 ca 86785317 BC 75 f 0 e 170 ab 0cd 97 c 65224/
通过分析事务中的具体细节,可以发现攻击者首先创建了一个契约0x 47 ed 415006 c 6 f 8052 fff 05 Fe 983 f 31 d6d 24 b8 fdb,通过该契约调用了Vether契约中的changeExcluded(unknown37217349)函数和transferFrom函数。
接下来,分析这两个函数的具体代码:
函数transferFrom(地址从,地址到,uint值)公共重写返回(bool成功){
如果(!映射地址_已排除[消息发送者]){
要求(值=_津贴[发件人],“不得发送超过津贴的邮件”);
_津贴[来自][msg.sender] -=价值;
}
_转移(从、到、值);
returntrue
}
可以看出,在transferFrom函数中,如果判断是在mapaddress _ excluded[消息。发送者],具体的逻辑是当mapaddress _ excluded [msg。sender]为false时,将检查攻击者合同的授权限制,然后调用_transfer函数进行传输。这种逻辑显然行不通。攻击者契约没有任何授权配额。因此,mapaddress _ excluded[消息。sender]只能为true,然后直接调用_transfer函数来转账。
然后分析如何设置排除映射地址。发件人]设置为true:
通过查看合同,您可以发现:
当契约被初始化时,只有地址(此)和燃烧地址的映射地址_排除被设置为真,所以有其他逻辑可以设置映射地址_排除。通过分析Vether契约,可以发现changeExcluded函数可以设置mapAddress_Excluded。
函数更改排除(地址排除)外部{
如果(!映射地址_已排除[已排除]){
_transfer(发件人,地址(此),MapEra _ Emission[1]/16);
映射地址_排除[排除]=真;
excludedArray.push(排除);excludedCount=1;
合计费用=mapEra _排放[1]/16;
映射地址_块改变[排除]=块号;
}其他{
_transfer(发件人,地址(此),MapEra _ Emission[1]/32);
映射地址_排除[排除]=假;
合计费用=mapEra _排放[1]/32;
映射地址_块改变[排除]=块号;
}
}
通过分析changeExcluded函数,我们可以发现它的可见性是外部的,所以攻击者契约可以直接调用changeExcluded函数,而攻击者契约的mapAddress_Excluded为假,所以它将进入if逻辑。
接下来,详细分析if逻辑中的代码:
在if逻辑之后,您需要首先支付处理费用,特别是上面代码块中的第三行,那么处理费用从何而来呢?答案是攻击者最初在合同中转移到0.9以太网。
从图中可以看出,它被0.9 ETH转换成大约138 VETH。
通过计算代码中的mapEra_Emission[1]/16,我们可以得到攻击者需要支付的处理费。通过阅读合同中的地图排放,我们可以知道地图排放[1]是2048年。
此时,据计算,mapEra_Emission[1]/16的可用服务费用为2048/16=128 VETH,攻击者兑换了大约138 VETH,这足以支付服务费用,因此攻击者合同中的mapAddress_Excluded可通过上述代码块中的第4行设置为真。
完整的攻击过程如下:
1.创建一个攻击合同,通过Uniswap将0.9 ETH兑换成大约138 VETH(这里,货币被兑换以支付稍后的手续费)
2.调用Vether合同中的changeExcluded函数,并支付128 VETH的处理费用,其中大约138 VETH之前在Uniswap中交换,然后将mapAddress_Excluded设置为true
3.调用转账来源函数,并使用映射地址排除为真直接转账。
4.拿钱走人
黑客地址:
0xfa 2700 e 67065 BC 364136 b5 E7 f 57112083 c b2a 0 CD
攻击交易:
0xdd 1120 a 90 ed 4112 b 634266 D6 a 244 b 93 ca 86785317 BC 75 f 0 e 170 ab 0 CD 97 c 65224
VETH合同地址
0x 75572098 DC 462 f 976127 f 59 F8 c 97 DFA 291 f 81 D8 b
维修建议
该攻击主要利用了Vether契约中changeExcluded函数作为外部函数的可见性,没有权限限制,用户可以直接进行外部调用,为攻击创造了必要的条件。因此,应该限制changeExcluded函数的权限或可见性,以避免任何用户可以从外部直接调用changeExcluded函数。
文章均源于网络收集编辑侵删
提示:仅接受技术开发咨询!