所以你想使用价格预言机
关于价格预言机及其安全使用的一切知识
作者介绍
samczsun · 2020年11月9日 · 13分钟阅读
2019年底,我发布了题为"为了乐趣和利润接受抵押不足贷款"的文章。在其中,我描述了对依赖一个或多个代币准确价格数据的以太坊dApp的经济攻击。现在是2020年底,不幸的是此后众多项目犯了非常相似的错误,最近的例子是Harvest Finance黑客攻击,导致协议用户集体损失3300万美元。
虽然开发人员熟悉像重入这样的漏洞,但价格预言机操纵显然不是经常被考虑的问题。相反,基于重入的攻击多年来已经减少,而基于价格预言机操纵的攻击正在上升。因此,我决定是时候有人发布关于价格预言机操纵的权威资源了。
本文分为三个部分。对于不熟悉该主题的人,有关于预言机和预言机操纵的介绍。那些想测试知识的人可以跳到案例研究,我们回顾过去与预言机相关的漏洞和攻击。最后,我们总结一些开发人员可以应用的技术,以保护他们的项目免受价格预言机操纵。
现实生活中的预言机操纵
2015年12月1日,星期三。你的名字是大卫·斯帕戈,你在澳大利亚墨尔本的Peking Duk音乐会现场。你想亲自见到乐队,但在你和后台访问之间站着两名保安,他们不可能让某个普通人直接走进去。
你想知道,如果你表现得像你属于那里,保安会作何反应。家人肯定被允许到后台拜访乐队,所以你所要做的就是说服保安你是亲属。你思考了一会儿,想出了一个只能被描述为天才或绝对疯狂的计划。
在快速设置好一切后,你自信地走向保安。你自我介绍为大卫·斯帕戈,Peking Duk的家人。当保安要求证明时,你向他们展示了无可辩驳的证据——维基百科。
保安挥手让你通过,并要求你等待。一分钟过去了,然后两分钟。五分钟后,你想知道是否应该在执法部门出现之前逃跑。当你正要放弃时,鲁本·斯泰尔斯走过来自我介绍。你和他一起走到绿房间,乐队对你的聪明才智印象深刻,最终你们一起分享了几杯啤酒。后来,他们在Facebook页面上分享了发生的事情。
什么是价格预言机?
广义上说,价格预言机是你咨询价格信息的任何东西。当帕姆向德怀特询问Schrute Buck的现金价值时,德怀特就充当了价格预言机。
在以太坊上,一切都是智能合约,价格预言机也是如此。因此,更有用的是区分价格预言机如何获取其价格信息。在一种方法中,你可以简单地从价格API或交易所获取现有的链下价格数据并将其带到链上。在另一种方法中,你可以通过咨询链上去中心化交易所来计算瞬时价格。
两种选择各有优缺点。链下数据通常对波动反应较慢,这可能是好是坏,取决于你试图用它做什么。它通常需要少数特权用户将数据推送到链上,所以你必须相信他们不会变坏,并且不能被胁迫推送坏更新。链上数据不需要任何特权访问并且始终是最新的,但这意味着它容易被攻击者操纵,这可能导致灾难性故障。
可能出什么问题?
让我们看几个集成不良的价格预言机导致DeFi项目重大财务损失的案例。
Synthetix sKRW预言机故障
Synthetix是一个衍生品平台,允许用户接触其他货币等资产。为了实现这一点,Synthetix(当时)依赖自定义的链下价格馈送实现,其中从秘密价格馈送集合计算出的聚合价格以固定间隔发布在链上。这些价格然后允许用户对支持的资产做多或做空。
2019年6月25日,Synthetix依赖的一个价格馈送错误地报告了韩元的价格,比真实汇率高出1000倍。由于价格预言机系统中其他地方的额外错误,这个价格被系统接受并发布在链上,一个交易机器人迅速在sKRW市场进行交易。
总共,该机器人能够获得超过10亿美元的利润,尽管Synthetix团队能够与交易者谈判,以换取漏洞赏金归还资金。
Synthetix正确实施了预言机合约,并从多个来源提取价格,以防止交易者在价格发布到链上之前预测价格变化。然而,一个上游价格馈送的孤立故障导致了毁灭性攻击。这说明了使用链下数据的价格预言机的风险:你不知道价格是如何计算的,所以你的系统必须仔细设计,以便正确处理所有潜在的故障模式。
抵押不足贷款
如前所述,我在2019年9月发布了一篇文章,概述了使用依赖链上数据的价格预言机的风险。虽然我强烈推荐阅读原文,但它相当长且技术细节繁重,可能难以消化。因此,我将在这里提供一个简化的解释。
想象你想将去中心化借贷带到区块链。用户被允许存入资产作为抵押品,并借入其他资产,最高金额由他们存入资产的价值决定。假设用户想使用ETH作为抵押品借入USD,ETH的当前价格是400 USD,抵押率是150%。
如果用户存入375 ETH,他们将存入150,000 USD的抵押品。他们可以每1.5 USD抵押品借入1 USD,因此他们能够从系统中最多借入100,000 USD。
但当然,在区块链上,简单地声明1 ETH值400 USD并不那么简单,因为恶意用户可以简单地声明1 ETH值1,000 USD,然后从系统中拿走所有钱。因此,开发人员倾向于使用最近的价格预言机形状接口,如Uniswap、Kyber或其他去中心化交易所的当前现货价格。
乍一看,这似乎是正确的事情。毕竟,Uniswap价格在你想要买卖ETH时总是大致正确,因为任何偏差都会迅速被套利者纠正。然而,事实证明,去中心化交易所的现货价格在交易期间可能严重不正确,如下例所示。
考虑Uniswap储备如何运作。价格基于储备持有的资产量计算,但储备持有的资产随着用户在ETH和USD之间交易而变化。如果恶意用户在你的平台贷款之前和之后进行交易怎么办?
在用户贷款之前,他们用2,000,000 USD购买5,000 ETH。Uniswap交易所现在计算价格为1 ETH = 1,733.33 USD。现在,他们的375 ETH可以作为高达433,333.33 USD资产的抵押品,他们借入这些资产。最后,他们将5,000 ETH交易回原来的2,000,000 USD,从而重置价格。最终结果是你的贷款平台刚刚允许用户额外借入333,333.33 USD,而没有提供任何抵押品。
这个案例研究说明了使用去中心化交易所作为价格预言机时最常见的错误——攻击者在交易期间几乎完全控制价格,尝试准确读取该价格就像在秤稳定之前读取重量。你可能会得到错误的数字,根据情况,它可能会花费你很多钱。
Synthetix MKR操纵
2019年12月,Synthetix因价格预言机操纵遭受另一次攻击。这个攻击值得注意的是它跨越了链上价格数据和链下价格数据之间的障碍。
Reddit用户u/MusaTheRedGuard观察到攻击者正在对sMKR和iMKR(反向MKR)进行一些非常可疑的交易。攻击者首先通过购买sMKR在MKR上建立多头头寸,然后从Uniswap ETH/MKR对购买大量MKR。等待一段时间后,攻击者卖出他们的sMKR换取iMKR,并将他们的MKR卖回Uniswap。然后他们重复这个过程。
在幕后,攻击者通过Uniswap的交易使他们能够随意移动Synthetix上MKR的价格。这可能是因为Synthetix依赖的链下价格馈送实际上依赖于MKR的链上价格,并且没有足够的流动性让套利者将市场重置回最佳条件。
这个事件说明了一个事实,即使你认为你正在使用链下价格数据,你可能仍然实际上在使用链上价格数据,并且你可能仍然暴露于使用该数据所涉及的复杂性。
bZx黑客攻击
2020年2月,bZx在几天内被黑客攻击两次,损失约100万美元。你可以在这里找到palkeo写的关于这两次黑客攻击的出色技术分析,但我们只关注第二次黑客攻击。
在第二次黑客攻击中,攻击者首先使用ETH购买了Kyber上几乎所有的sUSD。然后,攻击者从Synthetix本身购买了第二批sUSD并将其存入bZx。使用sUSD作为抵押品,攻击者借入了他们被允许的最大金额的ETH。然后他们将sUSD卖回Kyber。
如果你一直关注,你会认出这基本上是相同的抵押不足贷款攻击,但使用不同的抵押品和不同的去中心化交易所。
yVault漏洞
2020年7月25日,我向yEarn报告了关于他们新yVault合约启动的一个错误。你可以在这里阅读关于这个错误的官方文章,但我将在下面简要总结。
yVault系统允许用户存入代币并赚取收益,而无需自己管理。在内部,保险库跟踪铸造的yVault代币总量以及存入的基础代币总量。单个yVault代币的价值由铸造代币与存入代币的比率给出。保险库赚取的任何收益都分布在所有铸造的yVault代币上(因此,分布在所有yVault代币持有者之间)。
第一个yVault允许用户通过向Balancer MUSD/USDC池提供流动性来赚取USDC收益。当用户向Balancer池提供流动性时,他们会收到BPT作为回报,BPT可以赎回池中的一部分。因此,yVault基于其BPT可以赎回的MUSD/USDC数量计算其持有价值。
这似乎是正确的实现,但不幸的是,之前给出的相同原则适用——Balancer池在交易期间的状态不稳定且不可信任。在这种情况下,由于Balancer选择的绑定曲线,从USDC交换到MUSD的用户不会收到1:1的汇率,但实际上会在池中留下一些MUSD。这意味着BPT的价值可以暂时膨胀,这允许攻击者随意操纵价格,随后耗尽保险库。
这个事件表明,价格预言机并不总是被方便地标记为这样,开发人员需要警惕他们正在摄取的数据类型,并考虑这些数据是否可以被无特权用户轻易操纵。
Harvest Finance黑客攻击
2020年10月26日,一个未知用户使用你现在可能猜到的技术黑客攻击了Harvest Finance池。你可以在这里阅读官方的事后分析,但我会再次为你总结:攻击者通过交易压低了Curve池中USDC的价格,以降低的价格进入Harvest池,通过反转先前的交易恢复价格,并以更高的价格退出Harvest池。这导致了超过3300万美元的损失。
我如何保护自己?
到现在,我希望你已经学会了识别共同点——你并不总是明显在使用价格预言机,如果你不遵循适当的预防措施,攻击者可能会欺骗你的协议发送他们所有的钱。虽然没有一刀切的修复方法可以规定,但这里有一些过去对其他项目有效的解决方案。也许其中一个也适用于你。
浅市场,禁止跳水
像跳入游泳池的浅水区一样,跳入浅市场是痛苦的,可能导致改变你生活的重大费用。在你甚至考虑计划使用的特定价格预言机的复杂性之前,考虑代币是否足够流动以保证与你的平台集成。
双鸟在林不如一鸟在手
看到Uniswap上的潜在汇率可能令人着迷,但只有在你实际点击交易且代币进入你的钱包时,一切才成定局。类似地,确定两种资产之间汇率的