祸不单行 | 时隔三日,ValueDeFi再次被黑事件分析
北京时间2021年5月8日,上午7点39,区块链项目 ValueDeFi 在社区中提醒用户,「项目所有非50/50的交易池都被利用了,请停止购买gvVALUE和vBSWAP,直到项目方团队给出解决方案」。随后确认,约损失3000多枚ETH、1000万美元的资金。
攻击地址:0xb88a8697eee4d9c7b5091649e8fc955a675b7570。
SharkTeam第一时间对此事件进行了攻击分析和技术分析,并总结了安全防范手段,希望后续的区块链项目可以引以为戒,共筑区块链行业的安全防线。
事件分析
5月5日,ValueDeFi被攻击时SharkTeam在事件分析报告《鱼目混珠-ValueDeFi攻击事件分析》中就已提醒“此次修复方式是治标不治本,项目方需要重新审计并重新部署一套安全的新合约,避免后续可能的资产损失。”
5月8日,攻击再次发生,通过对黑客地址的追踪,我们找到了其中一笔攻击交易,交易ID为:0x2fd0aaf0bad8e81d28d0ee6e4f4b5cbba693d7d0d063d1662653cdd2a135c2de可以看到在交易中黑客操作了一次闪电贷。分析交易内容可以得知攻击者并未归还通过闪电贷获得的资金,但是交易却执行成功了,从而导致项目方资金的失窃。追踪分析可以得出是项目方的0x8275397136568949ae499fbc02cb73b7b0ef1a33合约中的 swap 函数出现问题导致。
如上图所示,如果池子的 tokenWeight0 参数为50时,合约进行的判定是没有安全问题的,这也是为什么项目方50/50的池子没有受到此次攻击影响的原因。
而当tokenWeight0 参数不为50时,例如上图中的合约,设置为70,则会进入到第二种判定方式来验证用户的交易是否符合预期。
可以看到这个函数调用了formula中的ensureConstantValue函数。经过分析后发现,这个函数的判定,在使用最小值进行代币兑换的时候,这个判定函数允许值比起实际值有一个非常大的范围波动。这直接导致了用户可以在不归还闪电贷的情况下完成交易。攻击者只需不断的重复操作,就可以盗走项目中所有非50/50池子的流动性。
SharkTeam安全知识课堂
此次事件虽然不是最常见的闪电贷攻击手法,但也是通过闪电贷操作的一个攻击事件。通常闪电贷攻击包括“哄抬套利”、“操纵预言机”、“重放攻击”和“技术漏洞”四种。本次属于基于“技术漏洞”的黑客攻击。
DeFi项目的业务逻辑设计复杂,涉及的经济学计算和参数也很多,非常容易出现安全漏洞。如下表,利用闪电贷这种新型产品进行攻击的DeFi事件在过去的一年里层出不穷。
这些安全问题的深层次原因在于,在设计业务逻辑时,未考虑到某些关键性因素,如:弹性供应机制、增发机制、清算机制设计不合理、链上价格及其他信息可被低成本操控等,导致了恶意套利、恶意增发以及此次的“赖账不还”等问题。如下,对几种常见的利用闪电贷的攻击手法和防范手段简述如下:
哄抬套利
哄抬套利攻击的原理与 CeFi 常见的 Pump-and-Dump 市场操纵行为或者链上交易容易碰到的front running攻击本质上并无差异,都是先想办法借助他人的资本抬高自有资产的价格再高价卖出获利。DeFi 生态中此类经济攻击事件之所以能够成功,都与至少两个核心模块——攻击目标和 AMM 有关。
攻击目标与 AMM 之间存在资产转移关系,并能由用户自主触发相关智能合约执行资产转移。这里的攻击目标可以是机枪池、借贷平台、杠杆交易平台等 DeFi 模块。机枪池是运行着一定投资策略的智能合约,可以把它类比于一个基金,为用户提供代理理财业务,用户将自有资产存入机枪池以期获得收益,例如 Yearn 、Harvest ;借贷平台为出借方和贷方提供服务,赚取利息差,贷方一般要先超额抵押一部分资产,例如 Compound 、 Aave ;杠杆交易平台允许投资者抵押一定资产作为保证金进行杠杆交易,例如 bZx 。AMM 通过一个定价函数实现自动做市商交易,用户可兑换资产或作为流动性提供商(LP)参与流动性挖矿。
操纵预言机
操纵预言机攻击可以认为是哄抬套利攻击的一种对称操作,其攻击目标依赖 AMM 提供的信息对其内部资产进行定价。
操纵预言机攻击的基础模型(序号代表攻击步骤,实线表示必要步骤,虚线代表或有步骤;攻击目标的净值计算环节和 AMM 的定价函数在设计上存在被黑客利用的风险)。这种情况下攻击者虽然无法利用攻击目标内的资产去哄抬 AMM 内某资产的价格,但可以考察 AMM 模块作为预言机能否被操纵,从而哄抬攻击目标内的资产。
重放攻击
顾名思义,重复的会话请求就是重放攻击。可能是因为用户重复发起请求,也可能是因为请求被攻击者获取,然后重新发给服务器。举个例子来说,在比特币的某次硬分叉后,出现了一条新链,其代币为 BCH。比特币硬分叉后,新链与原链是拥有相同的交易数据、地址、私钥、交易方式。你在硬分叉之前的一种币,会因为分叉而变成两种,即原有的 BTC 和等额的 BCH。您只需要下载 BCH 对应的钱包,并且把原 BTC 的钱包私钥导入,即可得到等额的 BCH。同时,如果你在没有解决重放攻击问题之前,在自己钱包里把分叉前的一个 BTC 转到一个地址A上,有趣的事就发生了,你在 BCH 钱包内对应的一个 BCH 也会被转入到地址 A 里面去。因为你在分叉前的币,会自动被分叉后的两条链都承认是合法的。只要你发起一笔交易,另一笔会被同步到比特币网络中去,然后被矿工打包处理,该交易生效,这就是重放攻击!
我们通常可以采取如下技术手段来防止重放攻击:
(1)时间戳验证:请求时加上客户端当前时间戳,同时签名(签名是为了防止会话被劫持,时间戳被修改),服务端对请求时间戳进行判断,如超过5分钟,认定为重放攻击,请求无效。
(2)序号:顾名思义,在客户端和服务端通讯时,先定义一个初始序号,每次递增。这样,服务端就可以知道是否是重复发送的请求。
(3)挑战与应答:我们一般采用这种方式来防御重放攻击,客户端请求服务器时,服务器会首先生成一个随机数,然后返回给客户端,客户端带上这个随机数,访问服务器,服务器比对客户端的这个参数,若相同,说明正确,不是重放攻击。这种方式下,客户端每次请求时,服务端都会先生成一个挑战码,客户端带上应答码访问,服务端进行比对,若挑战码和应答码不对应,视为重放攻击。
(4)Https防重放攻击:对于https,每个socket连接都会验证证书,交换密钥。攻击者截获请求,重新发送,因为socket不同,密钥也不同,后台解密后是一堆乱码,所以https本身就是防止重放攻击的,除非能复制socket,或者进行中间人攻击。
技术漏洞
“技术漏洞”泛指利用区块链、虚拟机或智能合约代码开发过程中存在的技术性问题导致的问题,结合闪电贷业务手段,实现恶意套利、恶意增发或此次的“赖账不还”。
安全建议
智能合约安全关系用户的财产安全,至关重要!区块链项目开发者应与专业的安全审计公司合作,为用户的数字资产安全和项目本身安全提供保障。
SharkTeam作为领先的区块链安全服务团队,为开发者提供智能合约审计服务。智能合约审计服务由自动化审计和人工审计构成,满足不同客户需求,独家实现覆盖高级语言层、虚拟机层、区块链层、业务逻辑层四个方面111项审计内容,全面保障智能合约安全。
智能合约自动化审计以云服务的方式为用户提供智能合约进行自动化审计服务。运用符号执行、形式化验证等智能合约分析技术,保障智能合约安全运行。
SharkTeam也为客户提供高级别的区块链安全服务,区块链安全专家团队7*24小时为智能合约提供全生命周期的安全保障,服务包括:VIP安全审计服务、VIP合规审计服务、安全事故应急响应等。
来源:SharkTeam