逃离黑暗森林

2020-09-25 03:06:44

2020年9月15日,一小群人通宵工作,从一份脆弱的智能合约中拯救了超过960万美元。这是我们的故事。

我正要结束当晚的工作,就在这时我决定再看一看一些漂亮的合同。

当然,我没想到会有什么有趣的事情。在过去的几周里,我看到无数高产农业克隆公司推出了完全相同的口号:把你的代币押在我们身上,你就可能成为下一位加密货币百万富翁。大多数只是经过良好审计的代码的分支,尽管也有一些零碎的调整,有时会产生灾难性的结果。

但是,在所有的喧嚣中,有一些我以前没有见过的代码。这份合同持有超过25000以太,当时价值超过960万美元,对于任何试图在其逻辑中发现错误的人来说,这将是一个非常丰厚的发薪日。

我迅速查看了代码,找出了Ether被调出的地方,发现了两个匹配的项目。其中一个将以太网传输到硬编码的令牌地址,因此可以忽略该地址。第二个是烧录功能,它将以太传输给发送者。在跟踪此函数的使用情况后,我发现对任何人来说,免费为自己铸造令牌,然后将其烧毁以换取合同中所有的以太是微不足道的。我的心跳了起来。突然,事情变得很严重。

一些挖掘发现,我找到的那份合同是连财行协议的一部分。不幸的是,他们的团队是匿名的!他们唯一支持的IM平台是Telegram,我不能确定该频道的管理员是否真的是协议开发人员,或者只是几个早期的支持者。我最不想做的事就是不小心把漏洞泄露给了错误的人。

在浏览了他们的网站一段时间后,我注意到他们已经与Consensys Diligence和CertiK合作进行了一次审计。这似乎是一个很好的途径,因为Consensys和CertiK都必须在审计期间与开发人员进行交互。我很快就用电报给毛雷利安打了个电话。

不幸的是,时间一分一秒地过去,我的心在不停地跳动,但毛热莲没有回应。他好像已经睡着了。走投无路时,我给ETHSecurity电报频道发了一条信息。

不出几分钟,我就收到了一个过去和我共事过很多次的人发来的信息--亚历克斯·韦德(Alex Wade)。

我的头刚碰到枕头,就听到敲门声。是我的室友打来的:“山姆在ETHSec电报里找勤奋公司的人。”

我了解萨姆,这不可能是好事。我找到了我们几个月前和Lien建立的频道和一个电子邮件地址。总比什么都没有好,因为他们的球队还没回来。

我还在半睡半醒。山姆不想把细节放在短信上,他要求拨打Zoom电话。我昏昏沉沉地希望自己回到了床上,试图判断情况的严重性:

山姆和我一起复习了代码。至此,Sam已经准备了一个利用示例,并且能够在他的机器上确认该问题。谈话很快转向讨论各种选择:

这两个都不是有吸引力的选择。第一个是有风险的,因为正如丹·罗宾逊(Dan Robinson)和乔治·康斯坦托普洛斯(Georgios Konstantopoulos)在“以太是一片黑暗的森林”(Etherum Is A Dark Forest)中所讨论的那样,我们的交易获得前置的可能性非常真实。第二种选择也有类似的风险,因为公开宣布会引起人们对这个问题的关注,并为攻击者创造一个机会之窗。我们需要第三种选择。

回忆起“以太是一片黑暗的森林”中的一段话,萨姆联系了斯科特·毕格罗(Scott Bigelow):

如果您发现自己遇到了这样的情况,我们建议您联系Scott Bigelow,他是一名安全研究员,一直在研究这个主题,并且有一个更好的迷惑器的原型实现。

在参加了最终输给领跑者的以太是一片黑暗森林的恢复尝试后,我渴望重赛。我花了很多时间监控领跑者,并设计了一个简单的系统,它似乎能够愚弄普通的领跑者,至少我可以用200美元来测试它。当山姆在深夜用一句听起来很天真的话来找我时,我迫不及待地想试一试!我已经在想办法了:如何做一些调整,熬夜几个小时,在帮助拯救和归还几千美元的用户资金后感到一种成就感,以及如何睡个好觉。

当萨姆与我分享合同时,这些计划立即泡汤了:约2.5万欧元,价值960万美元,岌岌可危。不管我多么想要这场重赛,960万美元远远超出了我卑微的剧本的重量级别。

在过去的几个月里,我一直在努力与矿工建立联系,目的就是为了这个目的:白帽交易合作。如果说有什么时候可以呼吁矿商包括一笔交易,而不让领跑者有机会窃取的话,那就是现在。幸运的是,在过去的几个月里,蒂娜和我一直在为建立这种合作而共同努力。这在当时看起来机会渺茫,但值得一试:让我们把蒂娜带到救援行动中,与一个矿池合作,开采一笔私人交易。

我刚刚从山猫森林大火中撤离,正在黑暗太平洋海浪的单调声音中啜饮着未知的海滩饮料,突然山姆的一封电报DM让我回到了一个更黑暗的现实:“资金处于风险之中,可以直接转移。”在过去的几周里,我一直在与萨姆和斯科特合作进行一个关于MEV的研究项目,在他们发送之前,我就已经猜到了他们的要求:一个直接的渠道,可以保护一架白帽德克萨斯州不被纪念池的“黑暗森林”中的“高级捕食者”狙击。

由于这是一个冒险的举动,需要将我们的战略暴露给矿工,我们决定首先尝试获得匿名留置权团队的批准。当Alex试图通过协商一致的内部渠道取得联系时,我们也试图在CertiK中循环。

我意识到,可能还需要4个小时,Certik';驻美国的审计师才会醒来,但时间在滴答作响。除了为相当多的亚洲项目提供服务外,我对CertiK一无所知,我试图联系CertiK中国团队,以套利时区差异。我在“定义世界”和“黄帽子”微信组合中随意地发了一条声音信息。在30分钟内,四条导线独立进入了我的DMS,证实了我联系的微信ID确实是Certik首席技术官倪兆忠的真面目。我被添加到一个由5名CertiK团队成员组成的微信小组,但在这一点上,我仍然不能透露该项目或漏洞。为了将风险和潜在责任降至最低,我们只能邀请Certik的一名成员加入我们的白帽业务。通过官方电子邮件通过最终验证后,CertiK的工程主管Georgios Delkos加入了我们的行列。

在乔治奥斯的帮助下,亚历克斯得以迅速与连队取得联系,并核实了他们的身份。我们向他们介绍了当前情况的最新情况,并请求他们允许他们尝试直接与矿池合作,以拯救脆弱的资金。经过深思熟虑后,连战团队同意,试图直接拯救基金或发布警告的风险太高,并批准继续下去。

现在我们需要确定一个矿池,它的基础设施已经准备就绪,并愿意尽快与我们合作。我们应该挖掘哪个矿池?泳池中的哪位联系人能够迅速做出技术决策,帮助我们分秒必争?

我想到了SparkPool,因为我知道他们一直在建设一块名为太极网络的公共基础设施,可以很容易地提供我们需要的东西。我决定联系SparkPool的联合创始人张少平,他过去曾帮助我调查过Mempool事件。

半小时后,少平回应说:“你是说我们有交易白名单服务吗?对不起,我们没有。“。哎呀,翻译中遗漏了一些东西,“白帽”和“白名单”在中文中听起来很相似。

“有价值1000万美元的资金面临风险。Samczsun正处于危险之中。“。我再次尝试沟通情况,但没有透露任何细节。

“你们又要拯救世界了吗?你需要我们矿池的帮助吗?“。令我吃惊和欣慰的是,绍平开玩笑地主动伸出援手。在官方电子邮件验证后,邵平在一屋子SparkPool开发人员的支持下加入了我们的马拉松式的Zoom Call。

午饭后,就在我正要睡午觉的时候,我收到了蒂娜发来的一条消息:“SparkPool曾经帮助过白帽交易吗?”起初,我误以为它把一笔交易列入了白名单。以前没有白帽接触过我们,我们也不熟悉“白帽交易”的含义。在Tina更详细地解释之后,我意识到他们需要的是私人交易服务,即白帽们想要发送交易来保存Defi合同,但为了防止被抢先,他们需要一个挖掘池来包括交易而不广播它。

我们一直在我们的太极网上开发一个“私人交易”功能,这个功能还在开发中,还没有经过测试。我将白帽们的请求带给了我们的开发团队,并解释了其紧迫性:我们的私有事务特性需要在几小时内投入生产。我们的开发人员说他们会尽最大努力按时完成,我们立即开始工作。我们在2小时内完成了私有事务特性的开发,然后花了一些时间修复错误。

完成内部测试后,我们将Whitehat.taichi.network端点发送给Scott Bigelow以交付白帽有效负载。

当SparkPool正在努力交付这个全新的白帽API时,Sam和我正在完成生成4个连续签名事务的脚本。按顺序处理这些交易本身不会撤回约25,000个ETH,但会将30,000个SBT+LBT令牌(“虚假”创建)转移到Lien团队,允许他们提交最终交易以将这些令牌转换回ETH。通过将无限微小的SBT+LBT令牌转移到Lien而不是ETH,我们使用了更多的交易来掩盖来自一般领跑者的攻击是如何运作的(在重组的情况下),我能够避免招致960万美元的收入,即使是一瞬间。

一旦我们生成了4个签名事务,Sam和我就花了很长时间使用各种多呼叫事务模拟工具来验证它们的组合行为。这4笔交易总共不到1.5KB的数据,只要除了SparkPool之外没有人看到它们,就已经准备好抢劫960万美元的资产,直到为时已晚。

我用一个无意义的事务测试了SparkPool的白帽端点,它完全按照预期工作:该事务在内存池中看不到,然后突然作为SparkPool块的一部分出现!这就像看着水蒸气在没有讨厌的液相的情况下直接变成冰一样。

在调整事务创建脚本以将事务直接提供给SparkPool的新端点之后,是时候了。我犹豫了一会儿,但这绝对是我们最大的努力。我们可能会损失960万美元,但不会后悔:我在IntelliJ点击了“Run”。我不知道为什么,但我预计这需要一段时间,就像Node会理解情况的严重性并不着急。但事实并非如此;交易在几毫秒内就被发送出去了。

电话会议上的每个人都开始以如此的活力刷新EtherScan,我想知道EtherScan团队是否会看到流量在3分钟内激增。由于只有SparkPool拥有交易,而SparkPool的散列率中只有一部分专门用于此目的,因此除了汗流浃背和等待之外别无选择。其他矿工出现的每一个街区都在嘲笑我们。电话会议上的某个人会紧张地咯咯笑着宣布矿工的消息。在我们的交易被包括在内之前,它花了大约15个街区,感觉像是几个小时,但最终,我们有了我们完美的交易:挖掘,有序,而不是还原。

我们松了一口气,看到越来越多的街区在我们的基础上建造起来,我们对街区重组的担忧很快就消退了。连队现在拥有了足够的SBT+LBT令牌来清算他们的整个系统,山姆去协调救援的最后阶段。

现在我们已经成功地将代币转移给连,没有任何领先、企图或其他的迹象,我们迅速向他们传达了这个好消息。他们确认收到了令牌,并立即发出交易,要求撤回合同中储存的大部分乙醚。几秒钟后,Etherscan上出现了一个挂起的事务。

当我们看着装载指示器旋转时,我借此机会反思了导致这一时刻的事件。从快速浏览一些合同开始,最终变成了全面的作战室,吸引了来自世界各地的专家。如果没有Alex和Georgios,我们不可能与Lien开发商取得联系。如果没有斯科特,我们就会陷入救援盲区。如果没有蒂娜,我们不可能与CertiK或SparkPool取得联系。如果没有SparkPool,我们注定要重蹈丹几周前写下的历史的覆辙。

然而,在一个星期二的深夜,我们这个不太可能的团体团结在一个共同的事业下,不知疲倦地工作,试图确保将超过960万美元归还给他们的合法所有者。在过去的7个小时里,我们所有的努力都导致了这笔悬而未决的交易,以及随之而来的旋转的圆点。

当装载指示器最终变成绿色复选标记时,通话中紧张的沉默让位于集体松了一口气。

这篇文章是许多人辛勤工作的结晶。特别感谢Alex Wade、Scott Bigelow、Tina Jen、Georgios Delkos和SparkPool在生态系统最需要你的时候出现在那里,以及Alex Obadia和Dan Robinson审阅这篇文章并提供反馈。

如果您对漏洞背后的技术细节感兴趣,请单击此处了解更多信息。如果因为某些原因你还没有读到“以太是一片黑暗的森林”,你肯定也应该读一读。