2019年年底,我发表了一篇题为《Taking undercollateralized loans for fun and for profit》的文章。在其中,我描述了对以太坊 DApp的经济攻击,这些攻击依赖于一个或多个Token的准确价格数据。目前已经到了2020年末,不幸的是,此后众多项目都犯了非常类似的错误,最近的例子是Harvest Finance黑客事件,导致协议用户集体损失2400万美元。
虽然开发者对重入等漏洞很熟悉,但预言机操纵价格显然不是人们经常考虑的问题。相反,基于重入性的漏洞这些年有所下降,而基于价格预言机操纵的漏洞现在却在上升。因此,我决定是时候有人发表一篇关于价格预言机操纵的权威资源了。
这篇文章分为三个部分。对于不熟悉这个问题的人,有一个关于预言机和预言机操纵的介绍。想要测试自己知识的人可以跳到案例研究,我们在这里回顾了过去与预言机相关的漏洞和利用。最后,我们总结了一些开发人员可以用来保护他们的项目不受预言机操纵的技术。
在现实生活中预言机操纵
2015年12月1日,星期三。你的名字叫大卫-斯帕戈,你正在澳大利亚墨尔本的北京公爵演唱会上。你想亲自见见乐队,但你和后台通道之间站着两个保安,他们不可能让一些普通人直接走进去。
你想知道,如果你表现得像个普通人,保安们会有什么反应。乐队的家人们肯定会被允许到乐队后台参观,所以你要做的就是让保安们相信你是他们的家人。你思考了一会儿,想出了一个只能用天才或疯子来形容的计划。
迅速安排好一切后,你自信地走到保安面前。你自我介绍说是大卫-斯帕戈,Peking Duk的家人。当保安要求你提供证据时,你向他们展示了无可辩驳的证据--维基百科。
保安向你招手,让你稍作等待。五分钟过后,你在想是否应该在执法人员出现之前逃走。当你准备离开时,鲁本-斯泰尔斯走了过来并做自我介绍。你和他一起走到一个绿色房间,乐队对你的聪明才智印象深刻,最后你们一起喝了几瓶啤酒。后来,他们在自己的Facebook页面上分享了发生的事情。
什么是价格预言机?
价格预言机,大抵是指任何你可以咨询价格信息的东西。当Pam向Dwight询问Schrute Buck的现金价值时,Dwight就像一个价格预言机。
在以太坊上,一切都是智能合约,价格预言机也是如此。因此,了解价格预言机如何获取价格信息的方式更有用。一种方法是,你可以简单地从价格API或交易所获取现有的链外价格数据,并将其带到链上。另一种方式,你可以通过咨询链上去中心化交易所来计算即时价格。
这两种选择都有各自的优势和劣势。链外数据对波动的反应一般较慢,这一特点是好是坏取决于使用它的目的。不过它通常需要少数特权用户来推送链上数据,所以你必须相信他们不会变坏,不能被胁迫推送不良更新。链上数据不需要任何特权访问,并且总是 的,但这意味着它很容易被攻击者操纵,这可能导致灾难性的后果。
什么可能会出问题呢?
让我们来看看几个案例,在这些案例中,一个集成度不高的价格预言机导致了DeFi项目的重大经济损失。
Synthetix sKRW Oracle故障
Synthetix是一个衍生品平台,它允许用户接触其他货币等资产。为了实现这一目标,Synthetix(当时)依靠定制的链外价格推送实现,其中从一组秘密的价格推送计算出的总价格以固定的时间间隔发布在链上。然后,这些价格允许用户针对支持的资产进行多头或空头交易。
2019年6月25日,Synthetix所依赖的其中一个价格推送错误地报告了韩元的价格,比真实汇率高出1000倍。由于价格预言机系统的其他地方出现了其他的错误,这个价格被系统接受并发布在链上,在链上一个交易机器人迅速在sKRW市场上进行了买入和卖出。
理论上讲,该机器人总共能够赚取超过10亿美元的利润,虽然Synthetix团队能够与交易员谈判,以换取漏洞奖金来返还资金。
Synthetix正确地执行了预言机合约,并从多个来源提取价格,以防止交易者在链上发布价格变化之前预测价格变化。然而,一个上游价格源发生故障的孤立案例导致了毁灭性的攻击。这说明了使用链外数据的价格预言机的风险:你不知道价格是如何计算出来的,所以你的系统必须精心设计,使所有潜在的故障模式都能得到妥善处理。
抵押贷款
如前所述,我在2019年9月发表了一篇文章,概述了使用依赖链上数据的价格预言机的相关风险。虽然我强烈建议阅读原帖,但它相当长,技术细节也很多,可能会让人难以消化。因此,我将在这里提供一个简化的解释。
想象一下,你想把去中心化的借贷带到区块链上。允许用户存入资产作为抵押品,并借入其他资产, 金额由他们存入的资产价值决定。假设用户想用ETH作为抵押品借入美元,ETH当前价格为400美元,抵押率为150%。
如果用户存入375个ETH,相当于存入150000美元的抵押品。每1.5美元的抵押品可以借到1美元,所以他们最多可以从系统中借到10万美元。
但当然,在区块链上,并不是简单地宣布1个ETH值400美元那么简单,因为一个恶意用户可以简单地宣布1个ETH值1000美元,然后从系统中拿走所有的钱。因此,对于开发者来说,想要获得预言机所读取的最近价格是很有诱惑力的,比如Uniswap、Kyber或其他去中心化交易所的当前现货价格。
乍一看,这似乎是正确的做法。毕竟,只要你想买入或卖出ETH,Uniswap的价格总是大致正确的,因为任何偏差都会被套利者迅速纠正。然而,事实证明,在交易过程中,去中心化交易所的现货价格可能会出现较大的错误,如下例所示。
考虑一下Uniswap的储备金是如何运作的。价格是根据储备持有的资产数量计算的,但随着用户在ETH和美元之间进行交易,储备持有的资产会发生变化。如果一个恶意用户在从你的平台贷款前后进行交易怎么办?
在用户贷款之前,他们用2000000美元购买了5000个ETH。Uniswap交易所现在计算出的价格是1 ETH=1,733.33美元。现在,他们的375个ETH可以作为价值433,333.33美元资产的抵押品,他们借到了这些资产。最后,他们用5,000 ETH换回他们原来的2,000,000美元,从而重置价格。最终的结果是,你的贷款平台只是让用户在没有投入任何抵押物的情况下,多借了333,333.33美元。
这个案例研究说明了使用去中心化交易所作为价格预言机时最常见的错误--攻击者在交易过程中几乎完全控制了价格,而试图准确地读出这个价格就像在秤上读出它完成结算前的重量一样。你很可能会得到错误的数字,根据情况,可能会让你损失很多钱。
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的链上价格,没有足够的流动性让套利者将市场重新设置回 状态。