闪电贷款:为什么闪电袭击会成为新常态
高天 2020-02-28 10:39:06发布
88039
摘要:闪电贷款最近一直是人们关注的焦点。最近,两名黑客利用闪电贷款攻击了保证金交易协议bZx,先是35万美元的攻击,后来是60万美元的模仿攻击。  

闪电贷款最近一直是人们关注的焦点。最近,两名黑客利用闪电贷款攻击了保证金交易协议bZx,先是35万美元的攻击,后来是60万美元的模仿攻击。

 

总而言之,这些攻击是庞大的。在每一次攻击中,身无分文的攻击者会立刻借走数十万美元的ETH,通过一系列脆弱的链上协议,提取数十万美元的被盗资产,然后偿还他们的巨额ETH贷款。所有这一切都是在瞬间发生的——也就是说,在一个Ethereum事务中。

 

我们不知道袭击者是谁,也不知道他们来自哪里。这两家公司一开始几乎一无所有,最后都带走了数十万美元的价值。两个人都没有留下任何证明自己身份的痕迹。

 

在这些攻击之后,我一直在思考关于flash贷款及其对DeFi安全性的影响。我认为这是值得在公共场合深思的。

 

 

简而言之:我认为闪电贷款是一个巨大的安全威胁。但是,短期贷款不会消失,我们需要仔细考虑它们对未来DeFi安全的影响。

 

什么是闪电贷款?

 

闪电贷款”的概念最初是由2018年的Marble Protocol的创始人马克斯·沃尔夫(Max Wolff)提出的。大理石的营销口号是“智能合约银行”,它的产品是一种简单而卓越的DeFi创新:通过智能合约发放零风险贷款。

 

1_jxZck-vRNIjKaT4EYiEBCQ111.png

 

贷款怎么会有零风险呢?

 

传统的贷款人承担两种形式的风险。第一个是违约风险:如果借款者携款潜逃,那显然很糟糕。但贷款人面临的第二个风险是流动性风险:如果贷款人在错误的时间借出了太多资产,或者没有及时收到还款,贷款人可能会出乎意料地缺乏流动性,无法履行自己的义务。

 

短期贷款缓解了这两种风险。闪电贷款基本上是这样运作的:我将借给你多少钱,你想要为这一单交易。但是,到交易结束时,你至少要付给我和我借给你的钱一样多。如果您不能这样做,我将自动回滚您的交易!(是的,智能合同可以做到这一点。)

 

简单地说,你的闪电贷款是原子的:如果你没有偿还贷款,整个事情就会恢复,就好像贷款从来没有发生过一样。

 

这样的东西只能存在于区块链上。例如,你不能对BitMEX进行闪电贷款。这是因为智能合约平台一次处理一个交易,因此,事务中发生的一切都是作为批处理操作串行执行的。您可以将此视为事务执行时的“冻结时间”。另一方面,集中式交换可能具有竞争条件,例如您的订单的一条腿无法填充。在区块链上,可以保证所有代码都在一行接着一行地运行。

 

我们来考虑一下经济学。传统的贷款人得到了两方面的补偿:一是他们承担的风险(违约风险和非流动性风险),二是他们借出资本的机会成本(例如,如果我能从这些资本的其他地方获得2%的利息,借款人必须付给我比无风险的2%更高的利息)

 

短期贷款则不同。闪电贷款字面上没有风险,没有机会成本!这是因为借款人在他们的短期贷款期间“冻结了时间”,所以在其他人的眼里,系统的资本从来没有风险,也从来没有被抵押,因此它不可能在其他地方获得利息(例如,在美国和欧洲)。,它没有机会成本)

 

这意味着,在某种意义上,成为一个闪电贷款人是没有成本的。这是非常违反直觉的。那么,在均衡状态下,闪电贷款的成本应该是多少呢?

 

基本上,闪电贷款应该是免费的。或者更确切地说,是一笔足够小的费用,以摊销包含使资产可闪贷的额外3行代码的成本。

 

微信图片_20200228104147.png

 

闪电贷款不能收取传统意义上的利息,因为贷款是零期的(任何年利率* 0 = 0)。当然,如果闪电贷款的贷款人收取更高的利率,他们很快就会被其他收取更低利率的闪电贷款池超过。

 

闪电贷款使资本成为真正的商品。这种逐底竞争不可避免地会导致零费用或微不足道的象征性费用。dYdX目前对闪贷的收费为零。另一方面,AAVE对短期贷款收取0.09%的利息。我怀疑这是不可持续的,事实上,他们社区中的一些人已经呼吁将费用削减到0(值得注意的是,我们看到的这两次攻击都没有将AAVE用作它们的闪电贷款池。)

 

闪电贷款有什么用?

 

闪电贷款最初的市场定位是主要用于套利。Marble宣布:

 

“通过闪电借贷,交易员可以从Marble银行借款,在一个DEX上购买代币,在另一个DEX上以更高的价格出售代币,偿还银行贷款,然后将套利利润全部装进一笔原子交易。”

 

这是真的——从数量上看,我们目前看到的大多数闪电贷款都被用于这种套利。

 

0_iEZ9lsff9ZXWMAft222.png

AAVE 上的闪存贷款使用情况

 

但销量一直很小。自成立以来,AAVE的借款总额仅略高于1万美元。这与DeFi上的套利和清算市场相比微不足道。

 

这是因为,多数套利是由运行复杂机器人的竞争性套利者进行的。他们参与链上优先级的gas拍卖,并使用gas令牌来优化交易费用。这是一个竞争非常激烈的市场——这些人非常乐意在他们的资产负债表上保留一些代币,以优化他们的收益。

 

另一方面,AAVE的借款成本约为8万欧元,利息仅为本金的0.09%——对于一个为微薄的利润而竞争的套利者来说,这个价格实在太高了。事实上,在大多数AAVE套利交易中,借款人最终向贷款池支付的费用要高于他们拿回家的钱。

 

从长期来看,除非在特殊情况下,套利者不太可能使用闪电贷款。

 

但是,在DeFi中,闪电贷款还有其他更引人注目的用途。一个例子是再融资贷款。例如,假设我有一个Maker vault (CDP),其中锁定了100美元的ETH,我从中获得了40 DAI的贷款,所以我得到了60美元的净头寸减去我的债务。现在假设我想以更好的利率再融资。正常情况下,我需要去回购那40DAI以关闭我的CDP,这需要一些预付资金。相反,我可以闪借40DAI,关闭100美元的CDP,将60美元的解锁ETH存入compound基金,通过Uniswap将另外40美元的ETH转换回DAI,然后用它来偿还闪贷。

 

这很神奇!这是一个在工作中赚钱的乐高积木的好例子。 1x.ag建立了一个融资融券交易聚合器,利用闪电贷款将这类交易自动化。但是,尽管闪电贷款很酷,bZx的攻击者向我们展示了他们不仅仅是有趣的游戏。

 

 

闪电攻击有很大的安全隐患

 

我越来越相信,闪电贷款真正解锁的是闪电攻击——由闪电贷款资助的资本密集型攻击。在最近的bZx黑客攻击中,我们第一次看到了这一点,我怀疑这只是冰山一角。

 

闪电贷款之所以对攻击者特别有吸引力,主要有两个原因。

 

许多攻击需要大量的前期资金(oracle操纵攻击)。如果你在ETH1000万美元投资中获得了正的投资回报率,这可能不是套利——你可能会做一些无聊的事情。

 

闪电贷款最大限度地减少了攻击者的污点。如果我知道如何用1000万美元的以太操纵oracle,即使我拥有这么多以太,我可能也不想拿自己的资金去冒险。我的ETH会被污染,交易所可能会拒绝我的存款,而且它很难被洗白。这是有风险的!但如果我申请了1000万美元的短期贷款,那又有谁在乎呢?这都是好处。dYdX的抵押品池不会被认为是有问题的,因为我的贷款就是从那里来的,dYdX的污点就这样消失了。

 

您可能不喜欢现在区块链安全模型中的交易所黑名单。它很集中。但这是一个重要的事实,它告诉我们这些攻击背后的算计。

 

在《比特币白皮书》(Bitcoin white paper)中,Satoshi有一句名言:比特币不会受到攻击,因为:

 

(攻击者)应该发现,按规则行事(……)比破坏他自己财富的体系和有效性更有利可图。”

 

有了闪电贷款,攻击者不再需要在游戏中有任何皮肤。闪电贷款极大地改变了攻击者的风险。

记住,闪电贷款是可以累积的!gas限额的限制下,你可以将每一笔交易(超过5000万美元)的每一笔闪电贷款池集中起来,将所有这些资金投入到一份脆弱的合同中。这是一个价值5000万美元的攻城槌,现在任何人都可以猛击任何链条上的塔,只要有钱就行。这是可怕的。

 

当然,你不应该仅仅因为有很多钱就去攻击一个协议。如果DeFi堆栈像它所声称的那样安全,那么这一切都不应该是一个问题——什么样的协议不安全?你可能会说,不考虑这些只是疏忽大意。

 

然而,我们承认,以太坊本身可以被51%的攻击,而攻击成本低于20万美元/小时。如果Ethereum自己的安全模型基本上是围绕资本约束建立的,那为什么我们会如此迅速地嘲笑可以用1000万美元成功攻击的DeFi应用程序呢?

 

(需要说明的是,我不相信这些数字——这个数字很容易忽略了下滑和供应不足,另外,共识层安全性和应用程序层安全性是不同的。但你懂的)

 

 

那么,如何才能减轻闪电攻击呢?

 

假设我是DeFi协议,我想避免受到闪电攻击。最自然的问题可能是——我能否检测与我交互的用户是否在使用闪电贷款?

 

答案很简单:不。

 

EVM不允许您从任何其他合约读取存储。因此,如果你想知道在另一份合约中发生了什么,就应该在合约中告诉你。因此,如果你想知道一份限时贷款合约是否被积极使用,你必须直接询问合约。如今,许多贷款协议都不响应此类查询(而且通常也没有办法强制执行闪电贷款协议)。另外,即使您试图进行检查,任何此类查询都可能很容易被使用代理契约或链接到多个闪电贷款池而被误导。一般来说,根本不可能判断存款人是否在使用闪电贷款。

 

先把这个放一放。如果有人拿着1000万美元敲你合同的前门,你不可能分辨出这是否是他们自己的钱。

 

那么,我们有什么实际的选择来防止闪电攻击呢?我们可以考虑几种方法。

 

说服闪电贷款池停止提供这项服务。

 

开玩笑的。这是密码,伙计们

 

严肃地说,试图让贷款池停止提供闪电贷款,就像试图阻止噪音污染一样——这是一个典型的公地悲剧。提供闪电贷款符合每个协议的个人利益,而且用户需要这种功能也是有正当理由的。所以我们可以放心地忽略它。闪电贷款不会消失。

 

强制关键事务跨越两个块。

 

记住,闪电贷款允许你在一笔交易中借入资金。如果您需要一个跨越两个块的资本密集型交易,那么用户必须取得他们的贷款至少两个块,击败任何闪电攻击。(注意:要实现这个功能,用户必须将他们的值锁定在两个块之间,防止他们偿还贷款。如果你没有正确地考虑设计,用户可以在两个块中进行闪电攻击。)

 

显然,这是一个巨大的UX权衡:这意味着事务将不再是同步的。它对用户来说很糟糕,而且是一颗很难咬的子弹。

 

许多开发人员抱怨异步智能合约操作,比如与第2层交互或在Ethereum 2.0中进行跨切分通信。具有讽刺意味的是,异步实际上使这些系统免受闪电攻击,因为您不能在单个原子事务中遍历分片或第2层。这意味着在ETH 2.0分片上没有闪电攻击,在第2层也没有对DEXes的闪电攻击。

 

要求链证明,用户的先前的余额没有改变的闪电贷款。

 

如果有某种方法可以检测出用户的真实余额,即他们在贷款之前的余额,我们就可以击败f闪电攻击。

 

没有办法在EVM中实现这个,但你可以破解它。你要做的是:在用户与你的协议交互之前,你需要一个Merkle证明来证明在前一个块的末尾,他们有足够的余额来说明他们当前使用的资金。您需要跟踪每个块中的每个用户。

 

这种方法很有效。当然,它也有一些棘手的问题:验证这些链上的证明是非常昂贵,没有用户想要生成它们,并支付整个事情的gas费用。另外,用户可能出于完全合理的原因在同一块中更改了他们的余额。因此,虽然理论上它有一些优点,但它不是一个实际的解决方案。

 

我提出的这三个解决方案没有一个特别有前途。我确信对于闪电攻击没有好的一般性防御。

但有两个特定的应用程序确实对闪电攻击有特定的缓解基于市场的价格oracles和治理令牌。

 

对于基于市场的价格oracles,如UniswapOasisDEX, 闪电攻击使其在任何情况下都不能使用当前的中间市场价格作为oracle。攻击者在单笔交易中移动中间市场价格,然后制造一个闪电崩溃,破坏价格oracle,这简直是小菜一碟。

 

这里的最佳解决方案是通过TWAPVWAP使用最后X块的加权平均值。Uniswap v2将提供这项服务。还有Polaris,一种为DeFi协议提供移动平均线的通用方法。具有讽刺意味的是,这颗Polaris也是由马克斯·沃尔夫建造的。(Polaris现在被遗弃了,但马克斯能看到那个角落还是值得称赞的。)

 

链上治理是它自己的难题。链上治理通常由治理令牌持有者之间的硬币加权投票决定。但是,如果这些治理令牌在闪贷池中,那么任何攻击者都可以捞起一大堆硬币,攻击任何他们想要的结果。

 

当然,大多数治理协议都要求在投票期间锁定这些硬币,这样可以阻止闪电攻击。但有些投票形式不需要这样做,比如碳排放投票,或者制造商的执行合同。随着闪电攻击的出现,这些形式的投票应该被认为是完全被破坏了。

 

理想情况下,如果治理令牌根本不能用于闪电贷款,那就太好了。但这并不取决于你作为发行者——而是取决于市场。因此,所有治理操作都应该要求锁定,以防止闪电攻击。Compound的新COMP令牌更进一步,对所有协议投票进行时间加权,甚至削弱了对它们的治理令牌的常规贷款攻击。

 

更广泛地说,所有治理令牌必须具有timelockstimelock强制所有治理决策必须等待一段时间才能生效(compoundtimelock,是2)。这允许系统从任何未预料到的治理攻击中恢复。尽管MKR目前还不能批量使用flash,但MakerDAO最近也因为容易受到这种攻击而受到批评。它最近实现了24小时时间锁,关闭了这个攻击向量。

 

 

所有这些对长期来说意味着什么?

 

我相信bZx攻击改变了一切。

 

这不会是最后一次闪电袭击。第二次bZx攻击是第一次模仿,我怀疑它将在未来几个月掀起一波攻击浪潮。现在,成千上万来自世界上最偏远地区的聪明的青少年正在拨弄这些玩具,在显微镜下检查它们,试图发现是否有什么方法可以让它们摆脱闪电袭击。如果他们设法利用这一漏洞,他们也能赚到几十万美元——这在世界大部分地区是一笔足以改变生活的钱。

 

有些人声称闪电攻击不会改变任何事情,因为只要攻击者资金充足,这些攻击总是有可能发生的。这既是正确的,也是非常不正确的。大多数“鲸鱼”不知道如何破解智能合约,而最聪明的攻击者也没有闲钱。现在任何人都可以用几分钱租到一个价值5000万美元的破碎机球。这改变了从现在开始每一栋建筑的建造方式。

 

bZx攻击之后,被闪电攻击与被DAO攻击后的重入攻击一样令人尴尬:您将得不到同情。你应该知道得更清楚些。

 

最后,这些事件让我想到了一个古老的密码概念:miner-extractablevalue。采矿者可提取值是采矿者可以从区块链系统中提取的总价值。这包括块奖励和费用,但也包括更有害的价值提取形式,如重新排序交易或插入流氓交易到块。

 

实际上,您应该将所有这些闪电攻击看作是mempool中的单个事务,它们可以赚很多钱。例如,第二次bZx攻击在一次交易中为ETH带来了64.5万美元的利润。如果您是一名矿工,您即将开始挖掘一个新块,请想象一下,查看前一个块的事务并对自己说:“等等,什么?为什么我要尝试开采一个新的区块价值500美元,而最后一个区块包含了64.5万美元的利润?

 

与其扩展这个链,不如返回并尝试重写历史,以使您成为闪电攻击者。想想看:仅这一笔交易就价值4小时以上的老老实实开采的以太坊块!

 

这是同构的,有一个特殊的超级块,包含1000x的正常块奖-正如你所预料的那样,这样一个超级区块的合理结果应该是一群矿商竞争,让链条顶端的矿商成为孤儿,然后为他们自己偷走这个街区

 

在平衡状态下,所有的闪电攻击最终都应由矿商来完成。(值得注意的是,他们还应该窃取所有的链上套利和清算。)具有讽刺意味的是,这将成为对闪电攻击的一种威慑,因为它将使攻击者无法利用他们发现的这些漏洞赚钱。或许最终矿商将开始通过私人渠道征集攻击代码,并向潜在的攻击者支付一定的费用。从技术上讲,这可以通过使用零知识证明来实现。(想起来很奇怪,对吧?)

 

但这都是科幻小说。矿商们今天显然不会这么做。

 

为什么

 

有很多的原因。首先,这很困难,有很多工作要做,EVM模拟起来很糟糕,有风险,会有导致资金损失或孤立区块的bug,会引起骚动,流氓矿池可能会有公关危机,并被贴上“以太坊的敌人”的标签。“目前,矿商在业务、研发和孤立区块方面的损失,将超过它们尝试这么做的收益。”

 

在今天是真的。它不会永远是正确的。

 

这为Ethereum加快向Ethereum 2.0过渡提供了另一个动机。尽管以太坊上的DeFi总是充满娱乐性,但它却被彻底地破坏了。DeFiPoW链上是不稳定的,因为所有高价值的交易都可能被矿商重新占用(也称为时间强盗攻击)

 

要让这些系统大规模运作,你需要最终的解决方案——矿工们无法重写已确认的区块。这将保护以前块中的事务不被重新占用。另外,如果DeFi协议存在于单独的Ethereum 2.0分片上,它们就不会受到闪电攻击。

 

在我看来,闪电攻击给了我们一个小而有用的提醒,提醒我们现在还处于早期阶段。我们离建立未来金融体系的可持续架构还有很长的路要走。

 

就目前而言,闪电贷款将成为新的常态。也许从长远来看,Ethereum的所有资产都可以用于闪电贷款:所有交易所持有的抵押品,所有Uniswap的抵押品,也许所有erc -20本身。

 

谁知道呢——只有几行代码而已。

 

原文来源:

https://medium.com/dragonfly-research/flash-loans-why-flash-attacks-will-be-the-new-normal-5144e23ac75a

 

作者:Haseeb Qureshi

 

编译:共享财经Neo

点击进入招聘详情>
微信扫一扫
关注区块链新金融
扫一扫
下载数链APP
内容合作/商务合作:
gxcj@gongxiangcj.com
联系电话:
021-31128751