狡猾黑客如何盗取514万美元?Shata Capital旗下EFVault 合约遭受黑客攻击事件分析

Beosin
Beosin 机构得得号

Mar 02, 2023 Beosin是总部位于新加坡的全球知名区块链安全公司,为区块链生态提供代码安全审计,安全风险监控、预警与阻断,虚拟资产被盗追回,KYT/AML等“一站式”安全产品+服务,已为全球2000多个区块链企业服务,保护客户资产5000多亿美元。

摘要: 由于Shata Capital 的EFVault 合约升级后关键函数的新增变量未正确配置,遭受黑客攻击,造成约514万美元损失。

2023年02月24日,Beosin旗下Beosin EagleEye安全风险监控、预警与阻断平台监测到,由于Shata Capital 的EFVault 合约升级后关键函数的新增变量未正确配置,遭受黑客攻击,造成约514万美元损失。Beosin安全团队对事件进行了分析,结果如下。

#事件相关信息

攻击交易:

0x1fe5a53405d00ce2f3e15b214c7486c69cbc5bf165cf9596e86f797f62e81914

0x31565843d565ecab7ab65965d180e45a99d4718fa192c2f2221410f65ea03743

攻击者地址:

0xa0959536560776ef8627da14c6e8c91e2c743a0a

被攻击合约:

0x80cB73074A6965F60DF59BF8fA3CE398Ffa2702c

攻击流程

1.攻击者在27天前通过调用deposit函数向EFVault合约存入0.1个Ether,以获得一定数量的shares。

2.项目方在被攻击前把EFVault合约通过代理的方式升级,升级后的EFVault合约部分代码如下图所示。

3.升级后的EFVault合约中新增函数redeem中的关键参数直接读取升级前代理合约对应存储位置的错误数值,导致redeem函数中计算出的用户可提取资产数量过大。黑客正是利用这一漏洞先后两次调用EFVault的redeem函数,分别获利343万美元和171万美元。

漏洞原因

EFVault合约升级后,新版本实现合约中的initialize函数不能再次被调用(代理合约已经初始化,导致不能通过initializer的检查),使得新增的变量无法进行初始化;同时由于在新版本实现合约中新增变量时,未考虑到旧版本的数据存储结构,导致在新版本实现合约中读取assetDecimal变量时,仍是读取的代理合约slot为0xcc的数据,即旧版本实现合约的maxDeposit变量值。

通过交易查询,我们发现maxDeposit 的值是可以通过调用setMaxDeposit 函数设置的,且maxDeposit的最新值被设置为了5000000000000,

即assetDecimal=5000000000000,该值远远大于它预期想要设置的值。

assetDecimal 变量的值在redeem函数中计算assertPerShare 中会被使用到,由于该变量被读取的值远远大于预期想要设置的值,导致assertPerShare 函数的返回值变大很多,从而导致asserts 的值变大很多。asserts 减去手续费就是黑客取走的USD 数量。redeem 函数和assertPerShare 函数代码如下所示。

资金流向

Beosin安全团队追踪发现,目前攻击者0x8B5A8333eC272c9Bca1E43F4d009E9B2FAd5EFc9地址已将全部资金兑换成ETH,并转入了tornado cash。

总结

针对本次事件,Beosin安全团队建议:

1.在升级合约时,不改变原有的变量存储顺序,即:只能新增存储项,不能修改顺序。 

2.项目上线前,强烈建议选择专业的安全审计公司进行全面的安全审计,规避安全风险。

Beosin作为一家全球领先的区块链安全公司,在全球10多个国家和地区设立了分部,业务涵盖项目上线前的代码安全审计、项目运行时的安全风险监控、预警与阻断、虚拟货币被盗资产追回、安全合规KYT/AML等“一站式”区块链安全产品+服务,目前已为全球3000多个区块链企业提供安全技术服务,审计智能合约超过3000份,保护客户资产高达5000多亿美元。欢迎点击公众号留言框,与我们联系。

链得得仅提供相关信息展示,不构成任何投资建议
本文系作者 Beosin 授权链得得发表,并经链得得编辑,转载请注明出处、作者和本文链接

更多精彩内容,关注链得得微信号(ID:ChainDD),或者下载链得得App

分享到:

相关推荐

    评论(0

    Oh! no

    您是否确认要删除该条评论吗?

    分享到微信