这次我们杀出了以太坊 DeFi 黑暗森林,完美拯救 960 万美元

撰文:Sam Sun、Alex Wade、Scott Bigelow、Tina Zhen、少平

2020 年 9 月 15 日,一个行动小组彻夜合作,从一个脆弱的智能合约中救出 960 万美元。下文讲述了他们的故事。

 

Sam Sun aka samczsun 自述

 

下面我总结一下审阅部分智能合约发生的故事。

当然我没想到会有什么有趣的事儿。过去的几周中我看了无数收益耕种(yield farming)克隆项目一模一样的宣传模式:把你的代币放到我们手中,你就可能会成为下一个加密百万富翁。多数克隆项目只是对经过良好审计的代码进行分叉,加上些许的调整,而这有时会带来灾难性的结果。

但是在所有的喧嚣中,有些代码我以前从未见过。本文中的主角、这份智能合约持有超过 25,000 个 以太币 Ether,当时价值超过 960 万美元,对于那些拼命从逻辑上发现错误的人来说,这将是一次收获满满的狩猎。

我迅速看了一下将 ETH 转出的代码,发现了两个匹配项。其中之一将 ETH 转移到了硬编码的代币地址,因此可以忽略。第二个是将 ETH 转移给发送方的焚毁功能。在跟踪了此功能的用法之后,我发现任何人可以免费为自己铸造代币,然后将其焚毁,换取该智能合约中的所有以太币都是不费吹灰之力的。我的心跳加速了。突然,问题变得严重了。

我那份智能合约是 Lien Finance 协议。不幸的是,他们的团队是匿名的!唯一的即时讯息支持平台是 Telegram,而我不确定该 Telegram 频道的管理员是开发者还仅仅是某些早期支持者。我可万万不想将这一漏洞意外透漏给错误的人。

在他们的网站又多浏览了一段时间,我发现他们曾与 ConsenSys Diligence 和 CertiK 合作,接受其代码审计。这看起来像是很不错的途径, ConsenSys Diligence 和 CertiK 在审计期间肯定和开发者进行过互动。我迅速在 Telegram 上私聊了 ConsenSys Diligence 的安全工程师 John Mardlin (aka maurelian) 。

发起聊天等回复是太煎熬的事儿。不幸的是,时间一分分过去,maurelian 没回应。他好像已经睡了。绝望之下, 我向 ETHSecurity Telegram 频道发了条消息,询问 ConsenSys 有没有哪位没有睡,请速联系。

几分钟后,我收到了一位过去有过几次合作的人的回复——Alex Wade,ConsenSys Diligence 的另一位安全工程师。

 

Alex Wade 自述

 

我的脑袋刚刚沾上枕头,听到我室友敲门。「Sam 在 ETHSec Telegram 频道问有谁认识 ConsenSys Diligence 的任何人。」

Sam 与 Alex 对话中说今晚可能会是个漫漫长夜,事实确实如此

一听说是 Sam,我就知道这不会是什么好事。我找到了几个月前建立的与 Lien 沟通的频道以及一个电邮地址。他们团队可是个匿名团队,有这些总比什么都没有强。

我当时依然半睡半醒。Sam 不想在聊天中具体详谈,要求 Zoom 对话。我一面后悔干嘛要起床,一面评估事态的严重性:

五分钟后,我清楚了解我得喝咖啡提提神开始干活了。

Sam 和我一起审阅了代码。Sam 当时已经准备好一个样品测试,能在其机器上确认这一问题。我们的对话寻找转移到讨论可行性方案:

  1. 我们自己动手拯救这笔钱。
  2. 联络上 Lien 团队,让他们公开身份,敦促用户撤资。
两者都不是很让人满意的选择。第一个举动极为危险,如果您读过 Dan Robinson 与 Paradigm 研究合伙人 Georgios Konstantopoulos 所讨论的以太坊 DeFi 黑暗森林(链闻中文版)一文 ,我们的交易被抢跑截胡的概率极高。第二种选择几乎同样危险,因为公开声明会引发外界对该问题的关注,给攻击者带来一个机会窗口。我们需要的是第三种方案。

回想起以太坊 DeFi 黑暗森林一文中的部分内容,Sam 联络了 Amberdata 工程副总裁 Scott Bigelow:「如果你切实陷入了这种困境,我建议你去找 Amberdata 工程副总裁 Scott Bigelow,他是一直研究这一课题的安全研究人员,有一套能更好实现瞒天过海目的的原型实施策略。」

 

Scott Bigelow 自述

 

我参加了 以太坊 DeFi 黑暗森林 一文中的资金拯救行动,最终败给黑暗森林狙杀者之后,我非常渴望能重赛一场。我花了一些时间监控抢跑截胡行动,设计了一个简单的系统,似乎能够骗过一般的抢跑者,至少我个人投入测试的 200 美元是成功拯救了出来。当 Sam 深夜联络我,诚恳得说「介意占用你大约一个小时左右时间吗」,我摩拳擦掌准备尝试了!我已经设想了那个画面:我如何做几个技术调整,需要几个小时,然后成功拯救用户数千美元的资产,戴着那种成就感,好好地睡上一晚。

当 Sam 分享给我这个智能合约后,这些计划瞬间七零八碎:大约 25,000 个 ETH,价值 960 万美元。我虽然非常想进行这种重赛,但我那几行破代码可不是给 960 万美元这种级别资产设计的。

过去几个月,我一直试图与矿工们拉上关系,就为了这一目的:进行这类白帽拯救交易。如果有一个时间点需要矿工们帮忙,在其挖矿中写入一笔交易,以免被抢跑者偷走这笔钱,那就是现在。幸运的是, Tina Zhen 和我过去几个月联手寻求建立这种协作关系。当时这一拯救行动的成功希望渺茫,但值得一试:让 Tina 参与这一拯救行动,与一个矿池合作挖出一笔私下交易。

 

Tina Zhen 自述

 

我刚刚因为加州代号「山猫」的森林大火从家撤离,当时正在喝着不知名的沙滩饮料,听着暗淡的太平洋送来的海浪声,Sam 的 Telegram 私信使我回到了一个更黑暗的现实:「资金有风险,可能被截胡」。过去的几周中,我一直与 Sam 和 Scott 合作开展有关「矿工可提取价值」MEV 的研究项目,并且在他们发送请求之前就已经猜到了:一个直接的渠道,可以保护白帽交易在以太坊内存池 mempool (待处理、未确认的交易集)这一「黑暗森林」中免遭「抢跑者」掠夺。

由于这是一个冒险的举动,需要将我们的策略暴露给矿工,因此我们决定首先尝试从匿名的 Lien 团队获得开绿灯批准。当 Alex 试图通过 ConsenSys 内部频道进行联系时,我们也尝试联系 CertiK。

我意识到, Certik 在美国的审计人员得过四个小时才会起床,但时间已经刻不容缓。 我对 CertiK 了解不多,只是知道他们曾审计过几个亚洲项目,于是试图联络 CertiK 中国团队。我在「 DeFi the World 」和「Yellow Hats」两个微信群里分别留了一条语音留言。我的私聊里 30 分钟内接到四条信息,确认了我微信好友中的这个 ID 是真正的 CertiK 首席技术官倪兆中 Zhaozhong Ni。我被拉进由五位 CertiK 团队成员组成的一个微信群中,而当时我依然不能透露相关项目或漏洞。为了将暴露风险和潜在责任降至最低,我们只能邀请一位 Certik 成员加入我们的白帽行动。经过官方邮件最终确认后,CertiK 的工程负责人 Georgios Delkos 加入我们的对话。

在 Georgios 的帮助下,Alex 得以迅速联络到 Lien 团队,并验证确认其身份。我们让他们最快速度了解到目前的严峻形势,争取其同意,直接与一家矿池合作拯救这笔脆弱的资金。在考虑之后, Lien 团队赞同直接拯救资金或发布预警声明过于危险,同意我们推进这一方案。

现在我们需要找一家基础设施充分到位、愿意尽快与我们合作的矿池。我们应该找哪家矿池?这家矿池的哪位联络人能迅速做出技术决策,帮助我们争分夺秒执行这一行动?

我们想到了星火矿池 SparkPool,我知道了他们一直在打造名为 Taichi Network 的公众基础设施,能轻松给予我们所要的支持。我决定私聊星火矿池联合创始人少平 Shaoping Zhang ,他之前曾帮我调查过 mempool 安全事件。

半个小时后,少平回复了:「你是说我给交易开白名单?抱歉,我们不能。」 好吧, lost in translation, 中文里「白帽」whitehat 和「白名单」 whitelist 看起来有点像。

「现在有 1000 万美元危在旦夕。我和 Samczsun 在线,」我再次试图在不透露任何具体细节的情况下沟通这一局面。

「你俩在拯救世界?需要矿池帮忙吗?」有点意外也让我松了一口气,少平调侃着表示愿意提供帮助。在经过官方邮件确认后, 少平进入我们马拉松般的 Zoom 电话会,并由大批星火矿池开发人员给予技术支持。

 

少平自述

 

吃过午饭,我正准备小睡一会儿,然后收到了 Tina 的一条微信:「星火矿池帮忙进行过白帽交易吗?」我一开始看错了,当时看成了给交易开白名单。以前没有人联系我们进行白帽交易,我们也不熟悉「白帽交易」具体什么情况。Tina 更详细解释了以后,我意识到他们需要一笔私下交易服务,比如,白帽黑客想发送交易来拯救一个 DeFi 智能合约,但要防止被别人抢跑截胡,他们需要矿池在不广播交易的情况下将交易写入区块。

我们一直在 Taichi Network 打造私下交易功能,这个功能还在开发中,还没测试过。我把白帽黑客的请求告诉了我们的开发团队,并强调了这种紧迫性:我们的私下交易功能需要在几个小时内顺利进入生产阶段。 我们的开发人员说会尽力完成,然后迅速投入工作。我们在两个小时内完成了私下交易功能的开发,又花了点时间修复了 bug。

我们完成了内部测试后,把 hitehat.taichi.network 端点发送给 Scott Bigelow ,来完成白帽任务。

 

Scott Bigelow 自述

 

星火矿池加班加点推出了全新的白帽 API,Sam 和我也完成了脚本编程,生成四个先后衔接的签名交易。依次处理这些交易本身不会取出 25000 个 ETH,但会把(「错误」生成的) 30,000 个 SBT+LBT 代币转移给 Lien 团队,他们可以将其提交给最终交易,将这些代币再转换成 ETH。

通过将可以无限铸造的 SBT+LBT 代币转移给 Lien 团队而不是 ETH,我们使用了更多交易作为障眼法,迷惑广义强迫者的攻击(如果遭遇重组),能够让 960 万美元的收入一直不会进入我的腰包,片刻也不可以。

我们生成四个签名交易后, Sam 和我花了大量时间、利用各种多方交易模拟工具验证其连环行动。总数据量不到 1.5 KB 的这四个交易程序,就是拯救 960 万美元资产的杀器,保障在星火矿池捕获这些交易之前不会被任何人先知先觉。

我用一笔无意义的交易测试了星火矿池的白帽端点,其执行过程毫无偏差:该交易不会在 mempool 中看到,然后突然出现在星火矿池的一个区块中!就像眼睁睁看着水蒸气直接变成了冰,中间令人讨厌的液化过程完全看不到!

我们调整了交易生成脚本,将交易直接提交给星火矿池的新端点,现在该是行动的时刻了。我犹豫了一会儿,但这绝对是我们能做到的最好的努力。我们可能会损失掉这 960 万美元,但不会后悔:我在 IntelliJ 中点击了「运行」。我不确定为什么,但我之前预计整个过程会花点时间,就像节点会了解情况的严重性,然后在其中消耗一些时间。但实际上它没有;交易以毫秒为单位发送。

Zoom 通话中的每个人都开始疯狂刷新 Etherscan,我怀疑 Etherscan 团队是否看到了这 3 分钟的流量高峰。由于只有星火矿池有交易,并且星火矿池的哈希率中只有一部分专用于此目的,我们能做的只能冒着冷汗焦急等待。每一个其他矿工挖出的每个区块都让我们胆颤心惊。Zoom 电话会中会有人伴随着紧张的笑声念出挖出区块的矿工名称。我们的交易被写入区块之前大约会产生 15 个区块,我们却感觉度日如年,像是经历了几个小时,但最终,我们完成了完美无缺的交易:依次挖出,没有回滚。

我们如释重负地看着越来越多的区块叠加在我们的区块之上,对区块重组的担忧迅速消失。Lien 团队现在拥有足够的 SBT + LBT 代币来清算整个系统的资金,Sam 负责协调救援的最后阶段。

Sam Sun 自述

现在我们已经成功地将代币转移给了 Lien 团队,并没有发现任何强迫截胡迹象、尝试或其他迹象,我们很快用私聊告诉了他们这一好消息。他们确认已收到代币,并立即发送交易,以取出智能合约中锁定的大部分 ETH。几秒钟后,Etherscan 上出现了这一待处理的交易。

看着进度条转圈时,我借此机会反思了这一行动。最开始就是看了看智能合约,最终演变成吸引了世界各地专家通力协作的一场「拯救大兵瑞恩」行动。如果没有 Alex 和 Georgios,我们将无法与 Lien 开发人员取得联系。没有 Scott,我们的拯救行动可能早就陷入困境。没有 Tina,我们将无法与 CertiK 或星火矿池取得联系。没有星火矿池,我们注定要重演 Dan 几周前文章中写的悲剧。

然而在周二深夜,我们这个看似完全没有可能合作的团队为了同一个目标通力合作,经过不懈努力,最终确保 960 万美元物归原主。我们过去七个小时的努力最终汇成一笔待确认的交易和这个转圈的进度条。

当进度条最终显示为绿色对勾,Zoom 电话会的紧张气氛终于烟消云散,大家都长舒了一口气。

https://etherscan.io/tx/0xe99ccb0b21854b65a2fa283638ab9ef01962b61c3310b596b4597bf22b911a43

我们终于成功杀出黑暗森林。


本文记录了很多人努力工作的成功。特别感谢拯救危难的 Alex Wade、Scott Bigelow、Tina Zhen、Georgios Delkos 和星火矿池 SparkPool,以及审校本文并给予反馈的 Alex Obadia 和 Dan Robinson。

如果你对这一行动背后的技术细节很感兴趣,请 点击这里 了解更多。如果因为种种原因,你还没读过 以太坊 DeFi「黑暗森林」 一文,你确实应该读一下。

写评论,请先登录