15秒内从2000万美元变成3.4亿美元?MakerDAO紧急修复这一安全漏洞
译者前言:来自Coinmonks的研究者Micah Zoltu日前披露了MakerDAO治理系统存在的漏洞,其表示任何拥有约40000 MKR(约2000万美元)的人,都可以窃取Maker DAO的所有抵押品,包括DAI、SAI以及来自Compound、Uniswap以及其它Maker集成系统的大量资产,共计超过3.4亿美元。目前,Maker基金会已发布了紧急公告,称会通过修改治理规则修复这一问题。
(图片来自:pexels.com/)
以下是Micah Zoltu披露的漏洞细节及Maker基金会的公告内容:摘要
任何拥有约40000 MKR(约2000万美元)的人,都可以窃取Maker DAO的所有抵押品,包括DAI、SAI以及来自Compound、Uniswap以及其它Maker集成系统的大量资产,共计超过3.4亿美元。Maker DAO v2版本(又名多抵押DAI或McDAI)本应启动安全措施(紧急关闭和治理延迟),以防恶意的MKR持有者窃取所有抵押品(攻击者还可能在该过程中抢劫与Maker集成的大量Uniswap、Compound及其它系统)。然而,他们并没有选择这样去做。
一家银行
Maker DAO,正是这个东西让DAI在工作,目前,它在v1和v2版本中锁定了价值约3.4亿美元的ETH。它也是一个“被治理”的系统,与uniswap.exchange或者augur.net不同,这意味着一些财阀可以控制系统的行为。
Maker DAO的设计
治理系统可以调用各种各样的内部函数,这些函数允许管理者做他们想做的任何事情。治理是一个相当简单的“stake the leader”系统,在这个系统中,你将你的MKR质押在你想要控制系统的合约当中,而质押最多MKR的合约,就拥有这样的控制权。
由于当前的执行合约(又名执行提议)上大约质押了80,000 MKR,所以,做任何你想做之事的原始成本大约是80000 MKR(或大约4100万美元)。
为了减轻恶意参与者的威胁,系统有一种机制,其在选择新的执行合约后,在采取任何行动之前会有一个 延迟 。在此延迟期间,任何拥有足够MKR的人,都可以触发整个系统的全局结算,在新的执行合约做出任何不利的事情之前有效地将其关闭。这意味着,如果一个窃贼出现,并试图在他们自己的执行合约中投票,而该合约的程序是窃取所有抵押品,即使他们拥有比其他执行合约更多的权益,他们也将不得不等待这一延迟,并希望在此期间没有人触发防御机制。
疏忽之处
而问题在于,Maker基金会决定此治理延迟的适当值为 0秒 。好的,防御者有0秒的时间来防御(富有但恶意的)一方发起的攻击。
微妙之处
鉴于上述情况,攻击者可以执行以下操作:
这种攻击的回报率是令人难以置信的(8倍),但它的执行成本很高,幸运的是,只要耐心一点,我们就能把这次攻击的成本降低50%。
- 尽一切可能获得80000 MKR;
- 创建一个执行合约,它会把所有抵押品从Maker系统转走;
- 立即(在同一交易中)对合约进行投票表决;
- 立即(在同一交易中)激活合约;
- 带走价值3.4亿美元的ETH(别费心去拿你的MKR了,这种攻击发生后,它就一文不值了);
还记得上面我们如何描述现行投票制度的运作方式吗?即拥有最多投票权的执行合约拥有着所有控制权。无论何时提出治理投票,都会有一段时期,让MKR质押权益从旧的执行合约转移到新的执行合约。这种情况从来不会一下子发生,通常是随着时间的推移,个人将把他们的选票向前迁移。因此,将会有一个时间点,其中80,000枚积极参与的MKR将被分割在两个执行合约当中,其中每个都有大约40000 MKR。一个擅长写脚本的家伙,可以很容易地确定交易的时间,这样当MKR在两个合约之间以最佳方式分配时,它就可以在这个时候执行上述攻击,而只需要花费40000 MKR(约2000万美元)的金额。
取款机
如果对你而言,偷窃3.4亿美元还不够的话,你还可以在执行攻击的过程中为自己铸造千万亿DAI。在抢劫Maker的同一笔交易中,你可以将这些DAI转到Uniswap,并窃取DAI:ETH交易对中可用的ETH。为了从倒霉的银行客户口袋里得到一点额外的零钱,你也可以去Compound借出一千万亿DAI,并借入所有可用的借贷资本(你永远不会偿还贷款,只保留借来的资产)。如果你行动迅速,你甚至可以在铸造所有DAI后立即在IDEX、Paradex、RadarRelay等半去中心化交易所进行套现。
群体
但是等等,还有更多!以太坊是一个建立在有约束力合约之上的系统!这意味着一个人可以创建一个智能合约,在这个合约中,不信任对方的多个人可以在一套严格的规则下进行合谋。
规则集可能是这样的:
如果这个合约收集40000 MKR,那么任何人都可以触发它,它将立即抢劫Maker。抢劫成功后,赃物将平均分配给贡献者。而抢劫失败后,MKR可被参与者撤回。任何人都可以随时收回他们的MKR。
这个非常简单的合约对于参与MKR贡献的人来说是一个有约束力的协议,他们没有必要信任他人,这与传统的抢劫有很大的不同。
任何人都不能带着所有的战利品逃跑,任何人都不能窃取任何其他参与者的贡献,任何人都不能将贡献的MKR用于除执行约定的抢劫之外的任何事情。
有人可能会争辩(Maker基金会这样做了),任何攻击者都必须将他们的存在通知众源,而Maker基金会可以简单地破坏“我们不参与治理”的规则来阻止攻击,将基金会所有的MKR扔进投票,从而使攻击花费达到400,000,000 MKR,而不是40,000 MKR(即无法进行攻击)。
虽然Maker基金会确实可以阻止这种情况的发生,但并不能保证他们会立刻看到这种情况的发生。例如,攻击者可能在其他地方有资金,他们可以利用这些资金在交易所外获得MKR。攻击者也可能是MKR持有者,他们知道其他MKR持有者也有这种攻击意图,然后就可以私下进行协调。
即使有约束力的协议合约是公共知识,它也可以设计成一种混淆参与者的方式。例如,你可以让感兴趣的每个人向中心服务提供商提交一笔预先签署的交易(无需完全信任它们),然后中心服务提供商将等待广播这些交易,直到有足够的MKR。在这种情况下,Maker基金会要么在不知道是否有人真正参与的情况下介入到集中控制系统,要么他们什么也不做,而冒着随时可能发生攻击的风险,届时攻击发生时,他们将无力及时做出反应。
内部攻击的可能
值得注意的是,如果Maker 基金会愿意的话,他们现在就可以用这种方式攻击系统,他们持有的MKR超过了所需的80,000数量,更糟糕的是,a16z现在也有足够的MKR,另外还有几个MKR持有者或者机构,他们的身份对我来说是未知的,而他们也有足够的MKR来执行这种攻击,而其它人则需要进行合谋才能执行这样的攻击。
所以,让人害怕的是,这并不是DeFi,而是CeFi,但它并非是一家能让个人能偷走你所有钱的银行,而是说银行或任何一个大股东,或一群小股东可以决定在任何时候偷走你所有的钱。
攻击带来的后果
那么,如果有人执行这样的攻击,Maker用户会发生什么情况呢?首先,每个拥有CDP/金库的人都会被伤害到。因为攻击者盗窃的就是所有的抵押品,由此产生的连锁反应是,DAI将变得100%缺乏抵押,其价格可能会归零。之后,MKR的价值也可能会归零,因为它的整个系统基本上都失败了,并且在这种失败之后,它不太可能会恢复。以太坊也可能会因此而受伤,因为这将是以太坊生态系统中的又一次大失败。但我认为以太坊仍然会复苏,因为它是一个很好的平台,但这很好地提醒了人们,“不要把坏事建立在好事之上”。
辩方的回应
我已经向Maker提出了这个攻击场景,他们已经明确表示,这不值得他们放弃即时的治理控制来抵御这种攻击。他们的辩护理由一般如下(这是我的解释,如果你想要第一手陈述,请与他们交谈),以及我的反驳:
1、攻击向量已经存在相当长的一段时间,但到目前为止一切都很好。
反驳:Heartbleed(OpenSSL攻击)存在10年后才被发现。Maker的源代码是出了名的难以理解,并且这些抱怨是来自以太坊开发社区中的很大一部分人。我之前曾亲自告诉他们,我没有审核Maker的合约,因为阅读他们的代码实在太难了。在Maker v2推出之后,我终于还是尝试了,因为理论上它应该是安全的(不像Maker v1,很多人说它是不安全的,尽管我并不知道它有多不安全)。仅仅因为还没有人执行攻击,并不意味着他们将来不会执行攻击。当向量变得更加广为人知时,这一点尤其正确。
2、这种攻击的代价对任何人来说都太昂贵了,只有少数人才能执行。
反驳:参见上面的“群体”部分,还要注意的是,它只需要一个人来攻击,因此“太贵了,只有少数人拥有这种可能”并不能保证系统的安全。
3、攻击者必然会泄露他们的攻击。
反驳:只有当攻击来自一大批共同工作的MKR持有者,只有当Maker愿意在一个可能有人准备攻击的提示下进行防御时才发生。
4、我们会对任何攻击者采取法律行动。
反驳:这基本上是在打脸#DeFi,以太坊生态系统中的很多人明确地试图保护自己免受政府的侵害,“你的钱是安全的”的这种声明,根本就不让人放心。
此外,这还假定攻击者不是匿名的(见下文)。
5、在以太坊平台上很难实现匿名。
反驳:是的,在以太坊是实现匿名是有点棘手,尽管如此,The DAO 的攻击者至今都还是一个未知数,许多非常富有的ETH持有者至今也是未知的。对于一次大赚一笔的攻击而言,强硬并不是一个好的防御措施。
6、这是一个已知的风险,但还有一些未知的风险可能更糟。
反驳:我强烈反对这种风险评估,你有一个已知的风险,而通过它攻击系统会是非常有利可图的,然后去拿未知影响和未知风险进行比较。这种思路大致是这样的:“没有任何攻击向量值得我们放弃控制。”
披露
Maker在Maker v2发布之前就已经意识到了这个问题,而且可能是从一开始就知道。尽管如此,他们还是选择不堵住这个漏洞(要堵住它很容易)。正因为如此,我不认为让我闭嘴是我的责任,也不希望任何攻击者知道谁应该明白Maker的治理模式。
Maker基金会回应
截至发稿时,Maker基金会已发布新的治理规则提议,将延迟时间从0增加到24小时,该基金会在博客中这样写道:
“自MCD启动以来,延迟时间设置为0,这使得社区能够立即采取行动,减少技术错误、预言机故障或异常情况,如市场恐慌或经济攻击。译者简评:Maker基金会已快速作出反应,以解决这一潜在漏洞的威胁,但这也同时印证了漏洞提出者的说法。创新的同时,也需要谨慎,否则就容易重现The Dao式的惨剧,所幸的是,这一漏洞的执行要求非常高,而符合这一条件的几个机构,也不太可能去进行这样的攻击,否则,这又是一场大祸。由于这些事件的可能性在MCD启动后开始降低,现在就快到审查GSM关于制定最佳延迟量讨论的时候了。
由于基金会收到一篇博文的通知,该博文详细介绍了一系列可能导致利用治理系统的事件,因此该版本现在已经升级。
此前,社区曾考虑过该漏洞的可能性,但这并不是一个紧迫的问题。然而,由于来自上述博客的潜在宣传,利用此漏洞的可能性增加了。出于这个原因,在我们典型的辩论和寻求共识的过程之前,社区正在接受一项民意测验,以减轻这种假设性的利用。
”
相关链接:
1、 https://medium.com/coinmonks/how-to-turn-20m-into-340m-in-15-seconds-48d161a42311
2、 https://blog.makerdao.com/governance-security-module-gsm/