DeFi前车之鉴,复盘DeFi中的攻击逻辑
摘要
- 越来越多的人希望通过攻击智能合约来窃取资金,他们正在利用当智能合约组合在一起时出现的漏洞进行攻击。
- 2020年,对DeFi的攻击中,被套取或盗取的总金额已经达到了3600万美元。但因为dForce的攻击者退还了被盗的2500万美元,所以实际金额大约有 1100 万美元。
- 与以太坊早期相比,每次黑客攻击的平均损失价值已经明显下降。在2020年的10次攻击中,有8次的攻击金额低于100万美元。
在以太坊早期,大多数攻击都是基于找到个别漏洞,让攻击者有能力冻结或耗尽智能合约。2016年臭名昭著的DAO黑客事件就是如此,1.6亿美元的ETH被盗,以太坊最终因此分叉。同样,2017年的Parity多签袭击让黑客盗取了3000万美元,Parity钱包中1.5亿美元被冻结,都是这类漏洞造成的后果。
这类智能合约的漏洞仍不时被人利用。最近,一名攻击者成功地从代币合约中窃取了所有的VETH,仅通过耗尽VETH-ETH Uniswap池就获利了90万美元。但这是VETH造成的一个简单失误,因为VETH修改ERC20代币标准的方式有逻辑上的错误。
总的来说,现在的安全性有所提高,特别是那些关注度比较高的项目。它们的安全性提升是由于用户对审计的期望和围绕测试的工具改进推动的。最近DeFi中最大的安全问题是dForce 2500万美元的数字资产在借贷市场中被盗。然而,由于攻击者的IP地址被发现并与新加坡警方共享,因此这些资金被退了回去。
dForce的攻击也可以认为是开发团队特别严重的疏忽造成的结果,因为被利用的漏洞是重入(re-entrancy)。重入攻击是DAO被耗尽的原因,这也一直是开发者在与ERC777代币交互时需要考虑的一个众所周知的问题。
ERC777代币的一个显著特点是可以通知将接收或发送资金的智能合约--并允许合约根据这些信息采取行动。如允许用户从合约中提取所有资金,这个例子就展示了合约为何容易受到重入攻击。
想象一下,一个合约有以下四个提现步骤:
- 用户调用合同,准备从合同中提取所有的资金。
- 合约检查用户在合约中是否有资金。
- 合约将用户在合约中的资金发送给用户。
- 合约自行更新用户在合约中没有资金。
这个原理被用来攻击dForce,当合约认为用户在持续增加imBTC抵押品(一种ERC777代币)数量的时候--然后合约就会允许用户从系统中借到更多资金。攻击者将他们假的imBTC抵押品增加到远远超过2500万美元,然后以借贷交易的方式提取出dForce中的所有流动资金。
通过可组合性(composability)进行黑客攻击
区块链上的智能合约是基于去信任(permissionless)来和用户以及其他智能合约交互的。对于那些设计智能合约的人来说,很难考虑到未来有人可能与他们的合约进行交互的每一种方式。其他人可以构建一种智能合约,以一种原作者不希望看到的方式与合约进行交互。一个用户使用在dForce攻击中基于ERC-777标准的相同漏洞,从imBTC-ETH Uniswap池中抽走了22万美元。在Uniswap的案例中,攻击者从ETH-imBTC代币池中移出了ETH,但imBTC代币余额并没有增加。这样的操作通常会增加ETH的价格。
与dForce案例不同的是,Uniswap的开发团队在这并没有真正的责任,他们几乎不可能阻止人们落入这种类型的陷阱。即使Uniswap团队确保他们的交互界面不允许用户将流动性添加到一个可能被耗尽的池中,他们也无法阻止其他交互界面建立在允许它的智能合约之上。事实上,这种特殊的攻击方式在多年前就已经被广泛讨论过。
最近6月18日针对Balancer的攻击,就是一个类似的在特定市场中利用非标准编程模式的例子。STA是一种ERC20代币,有一种额外的通缩模型,即从每次转账中抽取1%的费用。攻击者使用智能合约在单笔交易中自动执行多个操作将WETH与STA 代币来回交换24次,耗尽了其中一个Balancer流动性池中的STA代币,直到池中只剩下0.000000000000000001 STA(1个weiSTA)。Balancer池没有意识到STA的通缩模型,并根据1 weiSTA为其资产设定了一个新的价格。之后攻击者对池中的WETH、LINK、SNX和WBTC进行了交易。通过这次攻击,使两个池子的资金损失超过了50万美金。
一天后,Balancer遭受了第二个漏洞问题,同样是由于与其他智能合约交互的意外行为造成的。Compound的代币分发要求用户通过与Compound的智能合约交互来领取自己的COMP。想要同时获得COMP和BAL(通过提供流动性赚取的Balancer代币)的用户要用COMP创建流动性池,这样他们就有资格获得这两种代币。
攻击者意识到,Balancer流动性池中的资产所产生的新COMP并不属于任何人,所以攻击者可以进入一个池中,获得这些可用的COMP代币,然后再带着比他们放入流动性池更多的钱离开。就像现在发现的漏洞情况一样,攻击者利用闪电贷来最大化自己的资本,然后获取最大收益。
利用区块链的独特属性来进行攻击
第三类攻击涉及利用区块链本身的属性。一个长期遭受此类问题困扰的协议是Synthetix。从2019年9月到2020年2月,这个协议的套利机器人不断地在预言机更新之前运行。在Synthetix中,交易不是买卖双方通过匹配进行交易,而是针对预言机提供的价格反馈进行交易,流动性由SNX代币持有者提供。
当Synthetix的预言机在链上发布价格反馈时,机器人会通过支付高额的交易费用,在预言机有机会更新价格之前被纳入以太坊区块之中。因为这种抢占先机的套利行为,Synthetix的交易量在单日最高达到了6900万美元,而如今没有套利机会的Synthetix平均交易量仅为150万美元。
在3月12日("黑色星期四”),资金库(vault)的所有者在MakerDAO清算中意外损失830万美元,交易费用也是造成这次意外的原因之一。当MakerDAO的资金库(用户存放抵押品并生成Dai的地方)的抵押品不足时,它们的抵押品(如ETH)就会被拍卖,筹集DAI并偿还被清算资金库的债务。通常情况下,拍卖中的中标者(keepers)会用DAI来换取金库中的ETH,然后这些DAI会被销毁掉。一旦债务被还清,资金库的原主人就会收到剩余的ETH。
3月12日的时候由于ETH价格突然下跌超过50%,很多资金库进入清算程序。与此同时,以太坊的网络变得非常拥堵,gas飙升至400gwei或正常价格的20倍,这导致大多数keepers无法即时报价。有一位keeper持续触发清算,并以0美元的竞价赢得了可用的ETH。
将来存在的治理攻击?
随着项目从开发团队的集中控制转向代币持有者社区的去中心化治理,治理攻击的问题可能会变得更加普遍。理论上,区块链可能成为一个通过链上买选票来实现贿赂的绝佳工具。买选票可以用于敌意收购,让有敌意的一方购买另一个项目的多数投票权(代币)更便宜。例如,一个借贷协议可以向另一个借贷协议的代币持有者提供折扣,让他们出售另一协议的代币来换取协议自己的代币。
敌意收购的例子已经发生在Steemit上。当这个社交媒体平台背后的团队将Steemit出售给Tron时,社区试图让Tron拥有的代币投票权失效,但这种努力最终被火币和币安等大型交易所的投票权所消除。
随着DeFi中工具的改进,攻击者的“工具箱”也变得越来越高级。闪电贷让任何拥有必要专业知识的人都可以攻击其中的一个系统,并获得更多的资本来实现利润最大化。
如果说从COMP和BAL代币发行中可以学到一件事,那就是无论什么激励方案,只要是有利可图,总会有人去钻空子。