译者注:价格预言机是去中心化金融(DeFi)的重要一环,然而,正是这一环节中可能存在的漏洞,导致很多DeFi项目遭受了灾难性损失,有的损失甚至达到了数千万美元,那这些攻击到底是怎么回事?又怎样去预防它们?在这篇文章中,知名白帽黑客、Paradigm研究合伙人Samczsun分析了5个关于价格预言机攻击的现实案例,并总结了6种抵御这类攻击的方法。
2019年末,我发表了一篇题为“利用低抵押获利”的帖子,在这篇文章中,我描述了一种针对以太坊dApp的经济攻击,这种攻击依赖于一个或多个代币的准确价格数据。现在是2020年末,不幸的是,很多项目都犯了类似的错误,最近的例子是Harvest Finance,其遭遇了黑客攻击,导致协议用户集体损失达3300万美元。
虽然开发者们已熟悉了可重入等漏洞,但预言机(oracle)操纵显然不是经常被考虑的问题。事实上,基于可重入漏洞的攻击,在过去几年中有所下降,而基于价格预言机操纵的漏洞利用率,现在正在上升。因此,我认为是时候发表一些关于价格预言机操纵的确定性资料了。
这篇文章分为三个部分,在第一部分,我们会对那些不熟悉这一主题的人,对预言机和预言机操纵进行一个简单介绍。而第二部分,则是一些案例研究(其中我们会回顾过去与预言机相关的漏洞和攻击事件),那些想要测试自己知识的人,可以跳过它们。最后,我们总结了一些开发者可用来保护他们的项目不受预言机操纵的技术。
1
现实生活中的预言机操纵
时间回到2015年12月1日(星期三),假设你现在的身份是David Spargo,现在你正在澳大利亚墨尔本的Peking Duk演唱会,你想去后台休息室亲自见见这支乐队的成员,但有两名保安拦在你的面前,他们不可能让普通人直接进去。
你想知道,如果你表现得像Peking Duk乐队的亲属,保安会有什么反应。因为家庭成员肯定会被允许在后台访问乐队,所以你所要做的就是让保安相信你是乐队的亲戚。你想了一会儿,想出了一个计划,而这个计划只能被描述为“天才般”或“绝对疯狂的”。
在迅速安排好一切之后,你自信地走到保安面前。你自我介绍自己是David Spargo,是Peking Duk乐队的家庭成员,当警卫要求你提供证据时,你给他们看无可辩驳的证据——维基百科。
警卫挥手让你过去,让你稍等一下。一分钟过去了,两分钟过去了……五分钟后,你想知道你是否应该在执法人员出现之前逃跑。
就在你准备放弃的时候,Peking Duk乐队成员Reuben Styles走了过来,然后你和他一起走进休息室,乐队对你的聪明才智印象深刻,最后你们一起喝了几杯啤酒,再后来,他们在自己的Facebook页面上分享了当晚发生的事情。
2
什么是价格预言机?
价格预言机,大可指你向其咨询价格信息的任何东西。当帕姆(Pam)向德怀特(Dwight)询问一Schrute元的现金价值时,德怀特(Dwight)就扮演了一个价格预言机。
在以太坊上,一切都是智能合约,价格预言机也是如此。因此,区分价格预言机获取价格信息的方式更为有用。在一种方法中,你可以简单地从价格API或交易所获取现有的链外价格数据,并将其带到链上。而另一类方式,你可以通过咨询链上去中心化交易所(DEX)来计算即时价格。
这两种选择各有利弊。链外数据对波动性的反应通常较慢,这是好是坏,取决于你试图使用它的目的,而这种方式通常需要少数特权用户将数据推送到链上,因此你必须相信这些人不会做恶,也不会被迫推送坏的更新。而链上数据不需要任何特权访问,并且总是最新的,但这意味着它很容易被攻击者操纵,从而导致灾难性的失败。
3
那可能出现什么问题?
让我们来看几个关于价格预言机集成问题导致DeFi项目重大财务损失的例子。1、Synthetix sKRW预言机故障
Synthetix是一个衍生品平台,它允许用户访问其他货币等资产。为了实现这一目标,当时的Synthetix依赖于一个定制的链外喂价实现,其喂价数据以固定的时间间隔发布到链上。这些价格允许用户对支持的资产做多或做空。
2019年6月25日,Synthetix依赖的一份喂价报告称,韩元的价格比真实汇率高出1000倍。由于价格预言机系统中其他地方的错误,这一价格被系统接受并发布到链上,随后一个交易机器人迅速进出这个sKRW市场。
尽管Synthetix团队能与交易者协商,让其返还资金(换取漏洞奖励),但总的来说,这个机器人有能力赚取超过10亿美元的利润。
Synthetix正确地执行了价格预言机,并从多个来源获取价格,以防止交易者在价格变化发布到链上之前预测价格变化。然而,一个孤立的上游喂价故障导致了一次毁灭性的攻击。这说明了使用链外数据的价格预言机的风险:你不知道价格是如何被计算的,因此你的系统必须经过仔细设计,以便正确处理所有潜在的失败模式。
低抵押借贷
如上面提到的,我在2019年9月发表了一篇文章,其中概述了使用链上数据价格预言机的相关风险。虽然我强烈建议你阅读这篇文章,但是它的篇幅很长,技术细节也很繁重,这可能会让人难以理解。
因此,我会在这里提供一个简化的解释。
想象一下,你把去中心化的借贷放到区块链上。用户可以将资产作为抵押品存放,也可以借入其他资产,而能够借入的最高金额由他们存入的资产价值决定。假设一个用户用ETH作为抵押品,然后借入USD,目前ETH的价格为400美元,抵押率为150%。
如果用户存入375 ETH,则其存入的抵押品价值15万美元,根据每1.5美元抵押品可借入1美元的规则,那么该用户最多可以从系统那借款10万美元。
当然,在区块链上,这并不像简单地声明1 ETH值400美元那么简单,因为恶意的用户可以简单地声明1 ETH价值1000美元,然后从系统中拿走所有的钱。因此,开发者很容易会去接入像Uniswap、Kyber或其他去中心化交易所(DEX)的现货价格。
乍一看,这似乎是正确的做法。毕竟,无论何时你想买或卖出ETH,Uniwap的价格总是大致正确的,因为套利者很快就会纠正任何偏差。然而,事实证明,去中心化交易所(DEX)的即期价格在交易期间可能会非常不正确,如下面的示例所示。
思考一下Uniswap的存储功能,价格以储备资产金额为基础计算,但由于用户在ETH和USD之间交易,储备所持有的资产会发生变化。如果恶意用户在从平台贷款之前和之后执行交易,会怎样?
在用户贷款之前,他们以200万 USD的价格购买了5000 ETH,现在,Uniswap 交易所计算的价格为1 ETH = 2,600 USD 。现在,他们的375个ETH 可以作为抵押,并借取最高65万美元的资产。最后,他们将200万美元换回 5000 ETH,这将重置价格,而你的借贷平台则损失了55万美元。
这个案例研究,说明了将去中心化交易所(DEX)用作价格预言机时遇到的最常见的错误 —— 攻击者在交易过程中几乎完全控制了价格,而试图准确读取该价格就像在完成结算之前先读取磅秤上的重量一样。
你可能会得到错误的数字,根据具体情况,这可能会花费你很多钱。2、 Synthetix MKR 操纵
2019年12月,Synthetix再次遭受价格预言机操纵攻击,值得注意的是,这次攻击跨越了链上数据和链外数据的界限。
用户名为u/MusaTheRedGuard的Reddit用户观察到,一名攻击者对sMKR和iMKR进行了一些非常可疑的交易。攻击者首先通过购买sMKR来做多MKR,然后从Uniswap ETH/MKR资产交易对中购买大量MKR。在等待了一段时间后,攻击者将他们的sMKR换成了iMKR空头仓位,并将他们的MKR卖回Uniswap。然后他们重复了这个过程。
在幕后,攻击者通过Uniswap进行的交易,允许他们随意移动Synthetix上MKR的价格。这很可能是因为Synthetix所依赖的链外喂价,实际上依赖于MKR的链上价格,而且套利者没有足够的流动性来将市场重新设置到最佳条件。
这起事件说明了一个事实:即使你认为自己在使用链外价格数据,但实际上你可能仍然在使用链上价格数据,而且你可能仍然会因为使用这些数据,而遭遇到复杂的攻击。3、 bZx黑客事件
2020年2月,bZx在几天内遭受两次黑客攻击,损失价值约为100万美元。你可以这里找到由palkeo编写的关于两次黑客攻击的优秀技术分析文章,但我们在这只关注第二次攻击。
在第二次黑客攻击中,攻击者首先使用ETH购买了Kyber上几乎所有的sUSD,然后,攻击者从Synthetix平台购买了第二批sUSD,并将其存放在bZx上。利用sUSD作为抵押品,攻击者借用了他们被允许的最大数量的ETH,然后他们把sUSD卖回给了Kyber。
如果你注意到了,你会发现,这本质上是同样的低抵押借贷攻击,但使用了不同的抵押品和不同的去中心化交易所。4、 yVault漏洞
2020年7月25日,我报告了一个关于yEarn推出的新yVault合约的漏洞,你可以在这里读到关于这个漏洞的官方公告,但我将在下面简要总结一下。
yVault系统允许用户在不需要自己管理的情况下存入代币并赚取收益。在内部,这个金库跟踪铸造的yVault代币的总金额以及存放的基础代币的总金额。单个yVault代币的价值,由铸造的代币与存入的代币的比率来确定。金库获得的任何收益,都会分摊到所有铸造的yVault代币上(因此,也会分摊到所有的yVault代币持有者)。
第一个yVault允许用户通过向Balancer MUSD/USDC储备池提供流动性来获得USDC收益。当用户向Balancer提供流动性时,他们会收到BPT作为凭证(可用于赎回池中的资产)。因此,yVault根据其BPT可赎回的MUSD/USDC金额计算其持有的价值。
这似乎是正确的实现,但不幸的是,与前面提到的原理相同 —— 交易期间,Balancer池的状态是不稳定的,因此不可信任。在这种情况下,由于Balancer选择的联合曲线,在USDC和MUSD之间进行交换的用户将不会获得1:1的汇率,但实际上会在储备池中留下一些MUSD。这意味着BPT的值可以暂时膨胀,这使得攻击者可以随意操纵价格并随后耗尽金库。
这一事件表明,价格预言机并不总是可靠的,开发者需要警惕他们正在摄取什么样的数据,并考虑这些数据是否可以被非特权用户轻易操纵。5、Harvest Finance黑客攻击
2020年10月26日,一位匿名用户用一种(现在你可能已猜到的)技术攻击了Harvest Finance 储备池。你可以在这里阅读官方的分析报告,但我要再次为你总结下:攻击者通过执行交易使得Curve池中的USDC价格降低,然后以降低的价格进入Harvest池子,通过逆转先前的交易恢复价格,并以更高的价格退出Harvest 池子。这最终导致用户损失了3300万美元。
4
如何自我保护?
现在,我希望你了解了价格预言机操纵攻击,此外,如果你不采取适当的防御措施,攻击者可能会欺骗你的协议,让其乖乖把钱交给他们。虽然目前并没有适用于所有情况的解决方案,但还是有一些曾在其他项目中奏效的解决方案,也许其中一款也会适合你。建议1: 不跳入浅市场
就像跳入游泳池的浅水区一样,跳入一个浅市场也是痛苦的,这可能会导致巨大的损失,从而永远改变你的生活。在考虑具体的价格预言机计划之前,先考虑一下代币的流动性是否足以保证与你的平台集成。建议2:一鸟在手胜过两鸟在林(指到手的,才是真实的)
看到Uniswap上的潜在汇率可能会让人着迷,但在你真正点击“trade”按钮,并将代币放到钱包中之前,一切都不会是最终的。同样,要确定两种资产之间的汇率,最好的方法就是直接交换资产。这种方法很好,因为没有撤消,也没有假设。然而,对于贷款平台这样的协议来说,它可能不起作用,因为这些协议需要保留原始资产。建议3:几乎去中心化的预言机
总结依赖链上数据预言机所存在的一种问题是,它们的更新有点过快。如果是这样,为什么不引入一点人为的延迟呢?写一个合约,用去中心化交易所(例如Uniswap)的最新价格更新自己,但需要通过少数特权用户。现在,即使攻击者可以操纵价格,他们也无法利用这一点。
这种方法实现起来很简单,而且很容易见效,但它也有一些缺点 —— 在区块链拥堵的时候,你可能无法按自己希望地那样快速更新价格,而且你仍然容易受到三明治攻击(sandwich attacks)。另外,现在,你的用户还需要信任你会保持价格的更新。建议4: 增加最短延迟
操纵价格预言机是一种对时间敏感的操作,因为套利者总是在观察,并希望有机会优化任何次优市场。如果攻击者想把风险降到最低,他们会想在单笔交易中完成操纵价格预言机所需的两笔交易,这样套利者就没有机会跳到中间。作为协议开发者,如果你的系统支持它,那么只需要在用户进入和退出系统之间实现一个最短的延迟就足够了。
当然,这可能会影响可组合性,并且矿工与交易者的合作正在增加。在未来,不良行为者有可能在多笔交易中执行价格预言机操纵,因为他们知道矿工将确保没有人能够跳入中间并从中获利。建议5:时间加权平均价格(TWAP)
Uniswap V2引入了一种时间加权平均价格(TWAP)预言机,以供链上开发者使用。这篇文档详细地介绍了这种预言机提供的确切安全保证,一般来说,对于长时间没有链拥堵的大型资产池,这种TWAP预言机对预言机操纵攻击具有很强的抵御能力。然而,由于其实施的性质,它可能无法对市场剧烈波动的时刻做出足够快的反应,而且它只适用于具有链上流动性的代币资产。建议6: M-of-N 报告者机制
有时候人们会说,如果你想把事情做好,就自己去做。那如果你把N个值得信赖的朋友集合起来,让他们提交他们认为正确的链上价格,然后取M个最好的答案汇聚成当前价格,那会怎么样呢?
如今,很多大型项目都在使用这种方法:Maker运行一组由可信实体操作的喂价,Compound创建了Open Oracle,并有像Coinbase这样的预言机报价者,Chainlink聚合了来自Chainlink运营商的价格数据,并在链上公开了这些数据。请记住,如果你选择使用这些解决方案之一,那么你现在已经将信任委托给了第三方,而你的用户也必须这样做。要求报价者在链上手动发布最新信息也意味着,在市场高度波动及区块链拥堵的时期,价格更新可能无法按时完成。
结论
价格预言机对于DeFi 安全性而言,是一个重要,但经常被忽视的组成部分。安全地使用价格预言机是很困难的,有很多方法可以让你以及你的用户都措手不及。在这篇文章中,我们讨论了一些价格预言机被操纵的例子,并确定在交易过程中读取价格信息可能是不安全的(从而导致可能的灾难性财务损失)。我们还讨论了其他项目在过去采用的,用于抵御预言机价格操纵的一些技术。最后,每一种情况都是独一无二的,你可能会发现自己不确定是否正确地使用了价格预言机。如果是这种情况,请随时寻求建议。
特别感谢Dan Robinson和Georgios Konstantopoulos审阅了这篇文章。