VES:知名白帽Sam Sun撰文详述DeFi为何频发价格预言机操纵攻击_MetaFinance

编者按:本文来自链闻ChainNews,星球日报经授权发布。撰文:SamSun,知名白帽,加密风投机构Paradigm研究合伙人编译:PerryWang2019年末,我发表了一篇题为《从抵押不足贷款取乐并牟利》的帖子。我在文中描述了依赖于一个或多个代币的准确价格数据,对以太坊去中心化应用DApp的一次经济攻击。当前是2020年末,不幸的是,许多项目已经出现了非常相似的错误,最近的例子是HarvestFinance遭黑客攻击事件,导致协议用户集体损失3300万美元。虽然开发者熟悉重入reentrancy等漏洞,但他们显然没有经常考虑价格预言机遭操纵的问题。相反,多年来基于reentrancy的漏洞已经下降,而基于价格预言机操纵的漏洞现在呈上升趋势。因此,我决定是时候得有人对有关这类操纵给出明确资源以提高安全意识。本文分为三个部分。对于不熟悉这个主题的读者,这是一篇关于预言机和预言机操纵介绍的科普文章。那些想要测试知识水平的读者可以直接跳到案例研究,我们回顾一下过去一些与预言机相关的漏洞和攻击事件。最后我们总结一些开发者可以应用的技术,以保护他们的项目免受价格预言机操纵途径的攻击。什么是预言机操纵事件?打个真实案例比方

2015年12月1日,星期三。你的名字叫DavidSpargo,当时正在澳大利亚悉尼观看澳洲「电音黑马」PekingDuk的音乐会。你可能想亲眼见到这支乐队,但两名安保人员挡住了你前往后台的去路,他们完全不可能让一个普通路人大摇大摆走进后台。你可能想,如果你表现得像是后台人员,保安人员会有什么反应。家庭成员肯定会被允许参观乐队后台,所以你只需要的是说服保安你是乐队成员的一个亲戚。你考虑了一下,想出了一个计划,可能被称为天才计划,也许是极为拙劣。准备妥当后,你自信地走向保安。你介绍自己叫DavidSpargo,PekingDuk的家人。当保安要求看证据时,你向他们展示无可辩驳的证据——维基百科。

DavidSpargo修改了PekingDuk的维基百科词条,在「家庭成员」加上了自己的名字,名场面保安挥手让你通过,并让你等待。一分钟,两分钟。五分钟后,你想知道在警察露面之前是否该赶紧跑掉。当你正要离开时,乐队成员之一的ReubenStyles走过来做了自我介绍。你和他一起走到后台休息室,乐队对你的聪明才智印象深刻,最后和你一起喝了几杯啤酒。稍后他们还在Facebook页面上分享了所发生的事情。

什么是价格预言机?

价格预言机,笼统地说,是你咨询价格信息的东西。拿美剧《Office》中的剧情打个比方,当Pam向Dwight询问SchruteBuck的现金价值时,Dwight则充当了价格预言机的角色。

在以太坊区块链中,一切都是智能合约,所以也是价格预言机。因此区分价格预言机如何获取其价格信息更有用。一种方法是只需从价格API或交易所中收集现有的链下价格数据,即可将这些数据引进到链上。另一种方法可以通过咨询链上去中心化交易所来计算瞬时价格。

两种选择各有优缺点。链下数据对波动性的反应通常较慢,根据你尝试使用它的用途,这可能是好事,也可能是坏事。不过通常需要少数特权用户将数据推送到链上,因此你必须相信他们不会变得邪恶,也不会被迫推送不良信息。链上数据不需要任何特权即可访问,并且始终是最新的,但这意味着攻击者很容易操纵它,可能导致灾难性故障。可能会出什么问题?

简单看看一些整合不良的价格预言机对DeFi项目造成严重财务损害的案例。Synthetix是一个允许用户接触到其他货币资产的衍生品平台。为了撮合此类交易,Synthetix依赖于一个自定义的链下价格馈送实现机制,其中按照一组秘密价格馈送来计算汇总价格,按固定的时间间隔在链上发布。然后允许用户以这些价格对其支持的资产做多或做空头寸。2019年6月25日,Synthetix所依赖的价格源之一误报了韩元的价格,比真实汇率高出1000倍。而由于价格预言系统其他地方的其他错误,这个价格被系统接受并发布在链上,其中一个交易机器人在SKRW市场快速进行买卖交易。

这个自动交易机器人最终赚取超过10亿美元的利润,虽然Synthetix团队能与交易者谈判返还了资金,取而代之给予其纠错赏金。Synthetix正确执行了预言机合同,从多个数据来源引入报价,以防止交易者在链上发布之前预测到价格变化。然而一个上游价格馈送故障的孤立案例,导致了毁灭性的攻击。这说明了使用链下数据价格预言机的风险:你不知道价格是如何计算的,因此必须仔细设计系统,以便能正确处理所有潜在的故障模式。担保不足贷款如前所述,我在2019年9月发表了一篇帖子,概述了使用链上数据的价格预言机的相关风险。虽然我强烈推荐阅读原贴,不过其中有相当多且复杂的技术细节,可能使其难以消化。因此我在这里提供一个简化的解释。假设你希望将去中心化贷款引入区块链。用户可以将资产作为抵押品存入,并借入由其存入的资产价值决定的、一定金额的其他资产。假设用户希望以ETH作为抵押品借入美元,ETH的当前价格为400美元,抵押比率为150%。如果用户存入375ETH,相当于存入15万美元的抵押品。他们可以按每抵押1.5美元借走1美元,所以他们可以从系统中借到不超过10万美元。

当然在区块链中,不像简单地声明1ETH价值400美元那么简单,因为恶意用户可以简单地声明1ETH价值1000美元,然后从系统偷走所有的钱。因此对于开发者来说,非常需要最近的价格预言机的界面,如Uniswap、Kyber,或其他去中心化交易所中的当前现货价格。

乍一看,这似乎是正确的做法。毕竟,每当你想购买或卖出ETH时,Uniswap的价格总是大致正确的,因为任何偏差都会被套利者迅速纠正。但是事实证明,去中心化交易所的现货价格在交易期间可能非常错误,如下例所示。考虑一下Uniswap留存资产的函数公式。其内部报价是根据储备持有的资产量计算,但随着用户在ETH和USD之间交易,储备资产不断变化。如果恶意用户在从你的平台获得贷款之前和之后执行交易,会怎么样?用户在你的平台贷款之前,他们以200万美元买入5000ETH。Uniswap交易所现在计算价格为1ETH=2600美元。现在,他们的375ETH可以作为抵押品,可以贷走高达65万美元的资产,然后他们用原来的5000ETH换回200万美元,重置Uniswap内的价格。你的贷款平台则损失了55万美元。

这一案例研究说明了使用去中心化交易所作为价格预言机时最常见的错误:攻击者在交易期间几乎完全控制了价格,要想准确读取该价格,就像在物品稳定之前读取重量计的读数一样。你可能会得到错误的数字,在一定情况下,可能会让你损失惨重。SynthetixMKR操纵2019年12月,Synthetix再次遭受价格预言机操纵式攻击。值得注意的是,此次攻击突破了链上价格数据与链下价格数据之间的障碍。Reddit用户u/MusatheRedGuard观察到,攻击者正在针对sMKR和iMKR进行一些非常可疑的交易。攻击者首先通过买入sMKR而间接购买了MKR的多头头寸,然后从UniswapETH/MKR交易对购买了大量MKR。等待了一段时间后,攻击者售出其sMKR换成iMKR,然后将MKR卖回给Uniswap。然后他们重复了这个过程。在幕后,攻击者通过Uniswap进行交易,使其可以在Synthetix协议中移动MKR的价格。这可能是因为Synthetix所依赖的链下价格馈送实际上依赖于MKR的链上价格,而且没有足够的流动性使套利者推动市场回归最佳价格配置。

该事件说明了这样一个事实,即尽管你认为你使用的是链下价格数据,实际上可能仍在使用链上价格数据,并且仍然可能面临使用这些数据所涉及的复杂情况。2020年2月,bZx协议在几天内遭到两次黑客攻击,被黑客掠走约100万美元。在这里你可以看到一篇有关两次黑客攻击事件的优秀技术分析,但我们本文将只讨论第二次黑客攻击。在第二次黑客攻击中,攻击者首先使用ETH购买了Kyber协议中几乎所有的SUSD。然后攻击者从Synthetix本身购买了第二批SUSD,并存放在bZx上。攻击者使用sUSD作为抵押品,贷取了所能允许的最大金额ETH。然后他们把sUSD卖回给了Kyber。如果你一直在关注,你会认识到这基本上是相同的抵押不足贷款攻击套路,只是使用了不同的抵押品和不同的去中心化交易所。yVault漏洞2020年7月25日,我向yEarn报告了他们新推出的yVault合同中的一个协议漏洞。你可以阅读关于这一错误的官方材料,但我会在下面简要地总结一下。yVault系统允许用户存入代币并赚取收益,而无需自己管理代币。在yVault内部,金库跟踪yVault代币铸造的总量以及存入的底层代币的总金额。单个yVault代币的价值取决于铸造的代币与存入代币的比率。金库赚取的所有收益都由所有铸造的yVault代币平分。第一个yVault允许用户利用USDC向Balancer协议中的MUSD/USDC流动性池提供流动性来赚取收益。当用户向Balancer池提供流动性时,将获得BPT作为回报,该BPT可以兑换流动性池中的一部分资产。因此,yVault根据可使用BPT赎回的MUSD/USDC金额计算其持有的价值这一实施似乎正确无误,但不幸的是,我们前文提到的危险原则同样适用:交易期间Balancer流动性池的状态不稳定,其价格无法信任。在这种情况下,由于Balancer选择的联合曲线,用户从USDC交换到MUSD不会得到1:1的汇率,但实际上会在流动性池中留下一些MUSD。这意味着BPT的价值可以暂时膨胀,这给了攻击者恶意操纵价格的漏洞,然后以此抽干金库。

这一事件表明,价格预言机并不总是很方便,开发者需要警惕它们正在摄入的数据类型,并考虑这些数据是否可以被非特权用户轻松操纵。HarvestFinance黑客事件2020年10月26日,一名未知用户采用一种你可能已经可以猜到的技术入侵了HarvestFinance的流动性池:攻击者通过执行交易来打压Curve协议流动性池中的USDC价格,以降低后的价格进入Harvest流动性池,再通过逆向操作先前的交易来恢复价格,然后以更高的价格退出Harvest流动性池。这给Harvest流动性池造成超过3300万美元的损失。HarvestFinance官方事后剖析报告我该如何保护自己?

截至目前,我希望你已经学会了识别其共性:它并不总是很明显,你使用价格预言机,如果你不遵循适当的预防措施,攻击者可以过你的协议,卷走很多钱。虽然没有一劳永逸的解决方案,但下面是过去一些项目行之有效的解决方案。也许其中一个也适合你。浅水市场不要冒进就像跳水落到泳池的浅端一样,跳入浅水市场也是痛苦的,可能导致大量的开支,并永远改变你的生活。在考虑计划使用的特定价格预言机的复杂性之前,请考虑代币是否足够具有流动性,足以保证与平台集成。一鸟在手,胜过两鸟在林Uniswap上的潜在汇率可能乱花渐欲迷人眼,但在落袋为安之前,那些不过是镜中花,水中月。同样,确定两种资产之间汇率的最佳方法就是直接交换资产。这种方法很棒,因为没有回收,也没有不确定因素。但是这种做法对于需要持有原始资产的贷款平台可能不起作用。近乎去中心化的预言机依赖链上数据的预言机总结起来一个问题就是它们有点太新。如果是这样的话,为什么不人为引进一些延迟呢?编写一份智能合约,采用Uniswap等去中心化交易所的最新价格进行更新,但仅在少数特权用户请求时更新。现在即使攻击者可以操纵价格,他们也无法让你的协议来实际使用它。这种方法简单易用,而且能快速奏效,但还是有一些缺点:在区块链拥堵的时候,你可能无法按期望的速度更新价格,仍然容易受到三明治攻击。此外你的用户需要相信,你会实际保持价格更新。减速带操纵价格预言机是一个时间极为敏感的操作,因为套利者时刻在关注,并希望有机会优化任何次优市场。如果攻击者想要将风险降至最低,需要执行在单笔交易中执行操纵价格预言机所需的两笔交易,这样套利者就不可能在中间横插上一脚。作为协议开发者,如果你的系统能支持,则只需在用户进入和退出系统之间部署短至1个区块的延迟就足以阻挡。当然这可能会影响协议的可组合性,而矿工与交易者联手作恶也在不断增多。将来坏因子有可能在多个交易中执行价格预言机操纵,因为他们知道,他们合作的矿工将保证没有人可以在中间插入,从其盈利中分一杯羹。时间加权平均价格TWAPUniswapV2引入了一个TWAP预言机,供链上开发者使用。该文档详细介绍了这一预言机提供的确切安全保证,一般而言,对于长时间没有区块链拥堵的大型流动性池,TWAP预言机具有高度的抗预言机操纵攻击的能力。但是,由于其实施的本质,可能对市场波动性巨大的时刻反应不够迅速,且只适用于链上已有流动代币的资产。M-of-N报价有时他们说,如果你想做正确的事,最好自己干。如果你召集N个信任的朋友,并请他们提交他们认为正确的链上价格,而最好的M答案作为当前价格,那会如何呢?这种方法现在被当前许多大型项目采用:Maker运行一组由受信任实体操作的价格源,Compound创建OpenOracle及Coinbase这类特约报价者,Chainlink聚合来自Chainlink运营者的价格数据,并在链上公开它。请记住,如果选择使用这些解决方案之一,你现在已将信任委派给第三方,你的用户也只能这样做。要求报价者手动发布链上更新也意味着在市场波动性大和区块链拥堵期间,价格更新可能无法准时到达。总结

价格预言机对于DeFi安全性至关重要,但经常被忽视。安全地使用价格预言机是一道难题,有很多方法同时兼顾你自己和你的用户。在这篇文章中,我们介绍了曾经发生的价格预言机操纵攻击案例,并证实在交易过程中读取价格信息可能是不安全的,可能导致灾难性的财务损失。我们还讨论了其他项目用于打击价格预言机操纵的一些技术。归根结底,每一种情况都是独一无二的,你可能会发现自己不确定目前对价格预言机的使用是否正确。如果是这样的话,请随时与我们联系寻求建议。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

大币网

[0:0ms0-5:851ms