编者按:本文来自 链闻ChainNews(ID:chainnewscom),星球日报经授权发布。
撰文:Sam Sun,知名白帽,加密风投机构 Paradigm 研究合伙人
编译:Perry Wang
2019 年末,我发表了一篇题为《从抵押不足贷款取乐并牟利》 (Taking undercollateralized loans for fun and for profit) 的帖子。我在文中描述了依赖于一个或多个代币的准确价格数据,对以太坊去中心化应用 DApp 的一次经济攻击。当前是 2020 年末,不幸的是,许多项目已经出现了非常相似的错误,最近的例子是 Harvest Finance 遭黑客攻击事件,导致协议用户集体损失 3300 万美元。
虽然开发者熟悉重入 reentrancy 等漏洞,但他们显然没有经常考虑价格预言机遭操纵的问题。相反,多年来基于 reentrancy 的漏洞已经下降,而基于 价格预言机操纵 的漏洞现在呈上升趋势。因此,我决定是时候得有人对有关这类操纵给出明确资源以提高安全意识。
本文分为三个部分。对于不熟悉这个主题的读者,这是一篇关于预言机和预言机操纵介绍的科普文章。那些想要测试知识水平的读者可以直接跳到 案例研究 ,我们回顾一下过去一些与预言机相关的漏洞和攻击事件。最后我们总结一些开发者可以应用的技术,以保护他们的项目免受 价格预言机操纵 途径的攻击。
2015 年 12 月 1 日,星期三。你的名字叫 David Spargo ,当时正在澳大利亚悉尼观看澳洲「电音黑马」 Peking Duk 的音乐会。你可能想亲眼见到这支乐队,但两名安保人员挡住了你前往后台的去路,他们完全不可能让一个普通路人大摇大摆走进后台。
你可能想,如果你表现得像是后台人员,保安人员会有什么反应。 家庭成员 肯定会被允许参观乐队后台,所以你只需要的是说服保安你是乐队成员的一个亲戚。你考虑了一下,想出了一个计划,可能被称为天才计划,也许是极为拙劣。
准备妥当后,你自信地走向保安。你介绍自己叫 David Spargo,Peking Duk 的家人。当保安要求看证据时,你向他们展示无可辩驳的证据—— 维基百科 。
David Spargo 修改了 Peking Duk 的维基百科词条,在「家庭成员」加上了自己的名字,名场面
保安挥手让你通过,并让你等待。一分钟,两分钟。五分钟后,你想知道在警察露面之前是否该赶紧跑掉。当你正要离开时,乐队成员之一的 Reuben Styles 走过来做了自我介绍。你和他一起走到后台休息室,乐队对你的聪明才智印象深刻,最后和你一起 喝了几杯啤酒 。稍后他们还在 Facebook 页面上分享了所发生的事情。
价格预言机,笼统地说,是你 咨询价格信息 的东西。拿美剧《Office》中的剧情打个比方,当 Pam 向 Dwight 询问 Schrute Buck 的现金价值时,Dwight 则充当了价格预言机的角色。
在以太坊区块链中,一切都是智能合约,所以也是价格预言机。因此区分价格预言机如何获取其价格信息更有用。一种方法是只需从价格 API 或交易所中收集 现有的链下价格数据 ,即可将这些数据引进到链上。另一种方法可以通过咨询 链上去中心化交易所 来计算瞬时价格。
两种选择各有优缺点。链下数据对波动性的 反应通常较慢 ,根据你尝试使用它的用途,这可能是好事,也可能是坏事。不过通常需要 少数特权用户 将数据推送到链上,因此你必须相信他们不会变得邪恶,也不会被迫推送不良信息。链上数据不需要任何特权即可访问,并且始终是最新的,但这意味着攻击者 很容易操纵 它,可能导致灾难性故障。
简单看看一些整合不良的价格预言机对 DeFi 项目造成严重财务损害的案例。
Synthetix 是一个允许用户接触到其他货币资产的衍生品平台。为了撮合此类交易,Synthetix (当时) 依赖于一个自定义的 链下 价格馈送 实现机制,其中按照一组秘密价格馈送来计算汇总价格,按固定的时间间隔在链上发布。然后允许用户以这些价格对其支持的资产做多或做空头寸。
2019 年 6 月 25 日,Synthetix 所依赖的价格源之一误报了韩元的价格,比真实汇率 高出 1000 倍 。而由于价格预言系统其他地方的其他错误,这个价格被系统接受并发布在链上,其中一个交易机器人在 SKRW 市场快速进行买卖交易。
这个自动交易机器人最终赚取 超过 10 亿美元 的利润,虽然 Synthetix 团队能与交易者谈判返还了资金,取而代之给予其 纠错赏金 。
Synthetix 正确执行了预言机合同,从多个数据来源引入报价,以防止交易者在链上发布之前预测到价格变化。然而一个上游价格馈送故障的孤立案例,导致了 毁灭性的攻击 。这说明了使用链下数据价格预言机的风险:你不知道价格是如何计算的,因此 必须仔细 设计系统 ,以便能正确处理所有潜在的故障模式。
担保不足贷款
如前所述,我在 2019 年 9 月发表了一篇帖子,概述了使用链上数据的价格预言机的相关风险。虽然我强烈推荐阅读原贴,不过其中有相当多且复杂的技术细节,可能使其难以消化。因此我在这里提供一个 简化的解释 。
假设你希望将 去中心化贷款 引入区块链。用户可以将资产作为抵押品存入,并借入由其存入的资产价值决定的、一定金额的其他资产。假设用户希望以 ETH 作为抵押品借入美元,ETH 的当前价格为 400 美元,抵押比率为 150% 。
如果用户存入 375 ETH,相当于存入 15 万美元的抵押品。他们可以按每抵押 1.5 美元借走 1 美元,所以他们可以从系统中借到不超过 10 万美元。
当然在区块链中,不像简单地声明 1 ETH 价值 400 美元那么简单,因为恶意用户可以简单地声明 1 ETH 价值 1000 美元,然后从系统偷走所有的钱。因此对于开发者来说,非常需要最近的价格预言机的界面,如 Uniswap 、 Kyber ,或其他去中心化交易所中的当前现货价格。
乍一看,这似乎是正确的做法。毕竟,每当你想购买或卖出 ETH 时,Uniswap 的价格总是大致正确的,因为任何偏差都会被套利者迅速纠正。但是事实证明,去中心化交易所的现货价格在交易期间 可能非常错误 ,如下例所示。
考虑一下 Uniswap 留存资产的函数公式。其内部报价是根据 储备持有的资产量 计算,但随着用户在 ETH 和 USD 之间交易,储备资产不断变化。如果恶意用户在从你的平台获得贷款之前和之后执行交易,会怎么样?
用户在你的平台贷款之前,他们以 200 万美元买入 5000 ETH。Uniswap 交易所现在计算价格为 1 ETH = 2600 美元。现在,他们的 375 ETH 可以作为抵押品,可以贷走 高达 65 万美元 的资产,然后他们用原来的 5000 ETH 换回 200 万美元,重置 Uniswap 内的价格。你的贷款平台则 损失了 55 万美元 。
这一案例研究说明了使用去中心化交易所作为价格预言机时最常见的错误:攻击者在交易期间几乎 完全控制了价格 ,要想准确读取该价格,就像在物品稳定之前读取重量计的读数一样。你可能会得到错误的数字,在一定情况下,可能会让你损失惨重。
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 的链上价格 ,而且没有足够的流动性使套利者推动市场回归最佳价格配置。
该事件说明了这样一个事实,即尽管你认为你使用的是链下价格数据,实际上 可能仍在使用链上价格 数据,并且仍然可能面临使用这些数据所涉及的复杂情况。
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 代币持有者平分) 。
第一个 yVault 允许用户利用 USDC 向 Balancer 协议中的 MUSD/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 流动性池。这给 Harvest 流动性池造成 超过 3300 万美元的损失 。
Harvest Finance 官方 事后剖析报告
截至目前,我希望你已经学会了识别其共性:它 并不总是很明显 ,你使用价格预言机,如果你不遵循适当的预防措施,攻击者可以骗过你的协议,卷走很多钱。虽然没有一劳永逸的解决方案,但下面是过去一些项目 行之有效 的解决方案。也许其中一个也适合你。
浅水市场不要冒进
就像跳水落到泳池的浅端一样,跳入浅水市场也是痛苦的,可能导致大量的开支,并永远改变你的生活。在考虑计划使用的特定价格预言机的复杂性之前,请考虑 代币是否足够具有流动性 ,足以保证与平台集成。
一鸟在手,胜过两鸟在林
Uniswap 上的潜在汇率可能乱花渐欲迷人眼,但在落袋为安之前,那些不过是镜中花,水中月。同样,确定两种资产之间汇率的最佳方法就是 直接交换资产 。这种方法很棒,因为没有回收,也没有不确定因素。但是这种做法对于需要持有原始资产的贷款平台可能不起作用。
近乎去中心化的预言机
依赖链上数据的预言机总结起来一个问题就是它们有点太新。如果是这样的话,为什么不 人为引进一些延迟 呢?编写一份智能合约,采用 Uniswap 等去中心化交易所的最新价格进行更新,但仅在少数特权用户请求时更新。现在即使攻击者可以操纵价格,他们也无法让你的协议来实际使用它。
这种方法简单易用,而且能快速奏效,但还是有一些缺点:在区块链拥堵的时候,你可能无法按期望的速度更新价格,仍然容易受到 三明治攻击 。此外你的用户需要相信,你会实际保持价格更新。
减速带
操纵价格预言机是一个时间极为敏感的操作,因为套利者时刻在关注,并希望有机会优化任何次优市场。如果攻击者想要将风险降至最低,需要执行在单笔交易中执行操纵价格预言机所需的两笔交易,这样套利者就不可能在中间横插上一脚。作为协议开发者,如果你的系统能支持,则只需在用户进入和退出系统之间 部署短至 1 个区块的延迟 就足以阻挡。
当然这可能会影响协议的可组合性,而矿工与交易者联手作恶也在不断增多。将来坏因子有可能在多个交易中执行价格预言机操纵,因为他们知道,他们合作的矿工将保证没有人可以在中间插入,从其盈利中分一杯羹。
时间加权平均价格 TWAP
Uniswap V2 引入了一个 TWAP 预言机 ,供链上开发者使用。该文档详细介绍了这一预言机提供的确切安全保证,一般而言,对于长时间没有区块链拥堵的大型流动性池,TWAP 预言机具有高度的抗预言机操纵攻击的能力。但是,由于其实施的本质,可能对市场波动性巨大的时刻反应不够迅速,且只适用于 链上已有流动代币的资产 。
M-of-N 报价
有时他们说,如果你想做正确的事,最好自己干。如果你召集 N 个信任的朋友,并请他们提交他们认为正确的链上价格,而最好的 M 答案作为当前价格,那会如何呢?
这种方法现在被当前许多大型项目采用: Maker 运行一组由受信任实体操作的价格源, Compound 创建 Open Oracle 及 Coinbase 这类 特约报价者, Chainlink 聚合来自 Chainlink 运营者的价格数据,并在链上公开它。请记住,如果选择使用这些解决方案之一,你现在已将信任委派给第三方,你的用户也只能这样做。要求报价者手动发布链上更新也意味着在市场波动性大和区块链拥堵期间,价格更新可能无法准时到达。
价格预言机对于 DeFi 安全性至关重要,但 经常被忽视 。安全地使用价格预言机是一道难题,有很多方法同时兼顾你自己和你的用户。在这篇文章中,我们介绍了曾经发生的价格预言机操纵攻击案例,并证实在交易过程中读取价格信息可能是不安全的,可能导致 灾难性的财务损失 。我们还讨论了其他项目用于打击价格预言机操纵的一些技术。归根结底,每一种情况都是独一无二的,你可能会发现自己不确定目前对价格预言机的使用是否正确。如果是这样的话,请随时与我们联系寻求建议。
声明:本内容为作者独立观点,不代表 CoinVoice 立场,且不构成投资建议,请谨慎对待,如需报道或加入交流群,请联系微信:VOICE-V。
简介:前沿金融科技精英读物
评论0条