慢雾:VETH 合约被黑分析

2020-07-01 19:24 栏目:经验之谈 来源:网络整理 查看()

前言

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。

慢雾:VETH 合约被黑分析

现在使用OKO合同浏览器来分析具体的攻击细节(下图只显示了一部分)https://Oko.palkeo.com/0xdd1120a90ed4112b 634266 d6a 244 b93 ca 86785317 BC 75 f 0 e 170 ab 0cd 97 c 65224/

慢雾:VETH 合约被黑分析

通过分析事务中的具体细节,可以发现攻击者首先创建了一个契约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:

慢雾:VETH 合约被黑分析

通过查看合同,您可以发现:

当契约被初始化时,只有地址(此)和燃烧地址的映射地址_排除被设置为真,所以有其他逻辑可以设置映射地址_排除。通过分析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以太网。

慢雾:VETH 合约被黑分析

从图中可以看出,它被0.9 ETH转换成大约138 VETH。

通过计算代码中的mapEra_Emission[1]/16,我们可以得到攻击者需要支付的处理费。通过阅读合同中的地图排放,我们可以知道地图排放[1]是2048年。

慢雾:VETH 合约被黑分析

此时,据计算,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函数。

微信二维码
售前客服二维码

文章均源于网络收集编辑侵删

提示:仅接受技术开发咨询!

郑重申明:资讯文章为网络收集整理,官方公告以外的资讯内容与本站无关!
NFT开发,NFT交易所开发,DAPP开发 Keywords: NFT开发 NFT交易所开发 DAPP开发