EXC:又被攻击 VETH智能合约是如何被盗90万美元的?

前言

2020 年 7 月 1 日,VETH 合约遭遇黑客攻击。慢雾安全团队在收到情报后对本次攻击事件进行了全面的分析,下面为大家就这次攻击事件展开具体的技术分析。

攻击细节

本次攻击交易如下 0xdd1120a90ed4112b634266d6a244b93ca86785317bc75f0e170ab0cd97c65224

通过交易概览可以看到攻击者在 Uniswap 中使用 0.9 ETH 兑换成 VETH,然后使用 VETH 在 Vether 合约中进行操作,最终盗走巨额的 VETH。

知情人士:Prime Trust已于2021年丢失旧钱包控制权,并挪用客户资产:6月28日消息,据推特用户tier10k透露,FID的资料显示,Prime Trust早在2021年就已失去了对旧钱包的访问权限,并使用客户的资产来回购加密货币。数据显示,Prime Trust欠客户法币资产8567万美元,但Prime Trust仅持有290.4万美元。 Prime Trust欠客户数字资产6950.9万美元,但仅持有6864.8万美元。[2023/6/28 22:04:33]

现在使用 OKO 合约浏览器对具体的攻击细节进行分析(下图只展示一部分)https://oko.palkeo.com/0xdd1120a90ed4112b634266d6a244b93ca86785317bc75f0e170ab0cd97c65224/

美国多州考虑禁止中央银行数字货币CBDC:5月18日消息,佛罗里达州州长上周已签署了一项禁止中央银行数字货币 CBDC 的法案。现在其他州正在考虑采取类似措施,包括路易斯安那州、阿拉巴马州、得克萨斯州和北达科他州都起草了反对实施数字美元的法案。

CBDC与比特币和以太坊等去中心化的加密货币不同,CBDC是由一个中心化实体监督和运营的。美国中央银行联邦储备委员会一直在讨论CBDC,但还没有提供关于它是否计划发布一个的实质性细节。此前3月,美联储主席杰罗姆·鲍威尔表示,美联储尚未决定美国是否需要CBDC。[2023/5/18 15:11:08]

以太坊Layer 2总锁仓量升至67.9亿美元,7日涨幅18.77%:金色财经报道,据 L2BEAT 数据显示,当前以太坊 Layer 2 总锁仓量升至 67.9 亿美元,7 日涨幅 18.77%。其中,锁仓量前五分别为:

Arbitrum One(37.8 亿美元,7 日涨幅 19.9%);Optimism(20.3 亿美元,7 日涨幅 20.91%);dYdX(3.2 亿美元,7 日跌幅 10.48%);Immutable X(1.63 亿美元,7 日涨幅 56.65%);Metis Andromeda(1.34 亿美元,7 日涨幅 11.92%)。[2023/3/18 13:11:41]

通过分析交易内具体的细节可以发现:攻击者先创建了一个合约0x47Ed415006C6F8052Fff05fe983f31D6D24B8fDB 通过此合约对 Vether 合约中的 changeExcluded(unknown37217349) 函数与 transferFrom 函数进行了调用。

Celsius审查员:托管产品在会计控制和运营方面存在缺陷,用户索赔过程更加复杂:11月21日消息,据外媒报道,已申请破产的加密借贷平台Celsius Network的审查员Shoba Pillay发布的一份中期报告详细说明了该公司为客户保管的数字资产相关的两种产品在会计控制和运营方面的缺陷,提出了这些用户是否以及如何获得补偿的问题。

报告表示,“扣留”和“托管”这两种产品均是让用户在保持所有权的同时,将数字货币交由出借人保管。但Celsius在没有足够的操作控制和技术基础设施的情况下启动了“托管”计划。结果该平台在6月10日资金超额5050万美元。6月24日,该产品又资金不足2400万美元。此外,“扣留”产品未能将与账户相关的各种资产从债务中分离出来。由于账户和资产之间没有分离,他们很难追踪自己的资产。

此前今日早些时候消息,Celsius用户提出破产索赔的截止日期定为明年1月3日。(彭博社)[2022/11/21 22:11:14]

接下来对这两个函数的具体代码进行分析:

DeFi协议总锁仓量超700亿美元,24小时内涨5.38%:金色财经报道,据DefiLlama数据显示,DeFi协议总锁仓量(TVL)达到701.7亿美元,24小时内涨幅为5.38%。TVL排名前五分别为MakerDAO(90.7亿美元)、Lido(82.8亿美元)、AAVE(74.4亿美元)、Uniswap(66.9亿美元)、Curve(62.4亿美元)。[2022/8/11 12:18:31]

可以看到在 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的设置。

通过分析changeExcluded函数可以发现其可见性为external,因此攻击者合约可以直接调用changeExcluded函数,此时攻击者合约的mapAddress_Excluded为 false,所以会进入 if 的逻辑中。

接下来对 if 逻辑内的代码进行具体分析:

在进行 if 逻辑后需要先支付手续费,具体为上方代码块中的第 3 行,那这个手续费是从哪里来呢?答案就是攻击者最初转入合约中的 0.9 ETH。

图中可以看到,通过 0.9 ETH 兑换成约 138 VETH。

通过计算代码中的mapEra_Emission/16我们可以得到攻击者需要支付的手续费:我们读取合约中的 mapEra_Emission可以知道 mapEra_Emission为 2048。

此时计算mapEra_Emission/16可得手续费为 2048/16 = 128 VETH,而攻击者兑换了约138 VETH 是足够用来支付手续费的,因此便可以通过上方代码块中的第 4 行将攻击者合约的mapAddress_Excluded置为 true。

创建攻击合约,通过 Uniswap 将 0.9 ETH 兑换成约138 VETH(此处换币为了后续支付手续费)

调用 Vether 合约中的changeExcluded函数并利用先前在 Uniswap 兑换的约 138 VETH 支付 128 VETH 的手续费,然后将mapAddress_Excluded置为 true

调用 transferFrom 函数,利用mapAddress_Excluded为 true,直接进行转账操作

拿钱走人

0xfa2700e67065bc364136b5e7f57112083cb2a0cd

0x75572098dc462f976127f59f8c97dfa291f81d8b

修复建议

此次攻击主要利用 Vether 合约中changeExcluded函数的可见性为external且未有权限限制,用户可以直接进行外部调用为攻击创造了必要的条件。因此应做好对changeExcluded函数的权限或可见性的限制,从而避免任意用户可以直接外部调用changeExcluded函数。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金星链

[0:15ms0-1:1ms