狡猾黑客如何盗取514万美元?Shata Capital旗下EFVault 合约遭受黑客攻击事件分析
摘要: 由于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多亿美元。欢迎点击公众号留言框,与我们联系。
评论(0)
Oh! no
您是否确认要删除该条评论吗?