逃离黑暗森林

转载
1515 天前
9366
碳链价值

来源:碳链价值     作者:一名玩家


在2020年9月15日,一小群人在夜里不眠不休为了从一个或将被攻击的智能合约拯救出960万美元的资金。这是我们的故事。

那一晚在临睡之前,我决定先到处游览一些智能合约。

当然我也不期待任何有趣的事情发生。在过去的几个星期我阅过了无数的流动性挖矿合约克隆都说着:’把你的代币抵押在我们平台或许下一个加密货币百万富翁就是你!’大多数合约都是直接分叉已审计好的合约,而有些经过了调整后,却带来灾难性的结果。

但在众多合约中我发现了一些我没见过的代码。这代合约里持有25000 ETH, 在当天价值超过9600000 美元,假设有谁在合约内发现漏洞的话就真的是赚到了。

我快速的阅过这些代码,想找出ETH被转出的记录,最终发现了2笔交易。其中一笔把ETH转进了写死的代币地址,所以这个可以忽略。第二笔则是 burn 功能把ETH 转到发送者。沿着这功能去进行追踪后,发现它可以为自己免费铸币,我发现这操作对任何人来说也太烦琐,但随后把这些币燃烧后可换取合约里所有的 ETH! 我的心跳了一下,突然间,事态严重了。

在继续挖掘后我发现这是属于Lien 协议的一部分合约。但不幸的是,他们是匿名团队!他们唯一所使用的即使通讯软件只有Telegram,而我也不确定群组里的管事是不是协议的开发者还是早期的支持者。而我最不想做到的就是无意间把漏洞告知给不适当的人。

在我继续游览他们的网站后,我发现他们与ConsenSys Diligence及 CertiK 在审计上有所合作。这看起来是个很好的做法,毕竟 ConsenSys 及 CertiK 在审计之时肯定有与开发者来往。我赶紧在Telegram 上联系了 maurelian 。


你绝对不想要信息就在此停止。

但很不幸的,随着时间流失,我的心不停跳动,maurelian 还没对我的信息做出反应。看起来他应该是睡着了。绝望之下,我在 ETHSecurity 电报群发了条信息。


仿造信息,原句已删除。

在几分钟后,我收到他 — Alex Wade的信息,我们之前有合作过几次。

在我临睡之际有人在敲我的门房。那是我的室友:‘Sam 在 ETHSec 电报群里寻找 Deligence 的团员。’


确实,是个很漫长的夜晚

我还是在半睡半醒中,Sam不想要以信息交留,建议使用 Zoom。虽然我很想直接回到床上睡觉,但我还是尝试了解事情的严重性。


五分钟后,果然还是需要还是咖啡辅助。

Sam与我一起检阅了这些代码。在那时候,Sam已经准备好了一些攻击方式且确认了问题的存在。我们的话题迅速的转移到了一下讨论选择:

  • 自己攻击漏洞
  • 联系Lien让他们通知用户撤出资金

这二项都不是很好的选择。第一项太过于冒险,可参考 Ethereum is a Dark Forest 由 Dan Robinson 及 Georgios Konstantopoulos 编写, 我们被提前交易的可能性很高。第二个选项也相对的冒险,相公众公开的话会引起攻击者的注意,让他们有机可乘。我们需要第三种选择。

想起了 Ethereum is a Dark Forest 里的其中一段文 ,Sam联系了 Scott Bigelow:

如果你发现自己陷于如此情景,我们建议你联系 Scott Bigelow, 一名对此案例研究了很久安全学者,也拥有比较好的混淆器原型。

在参与之前 Ethereum is a Dark Forest 的解救过程失败后,我渴望重赛很久了。我花了很多时间观察提前交易,也开发了一款可愚弄普遍性提前交易的系统,至少之前使用了$200来测试没问题。当 Sam 在深夜里以无辜口吻联系我 “你愿意再熬多一小时吗”,我真的很迫不及待想尝试!我已经准备就绪:我会如何做调整,在线多几个小时,帮助用户赎回几千美元后得到的成就感,然后再好好睡个觉。

这些计划在Sam与我分享后马上破灭: ~25,000 ETH, 价值$960万, 处于危机状态,虽然我很想再重赛,但$960万属于另一种级别了。

在过去的几个月,我一直都在尝试与矿工保持联系,为了一个目的:白帽交易。如果要在对的时刻向矿工呼吁加入一笔交易,让提前交易机器人无法夺走里面的资金,那就是现在。很幸运的是,Tina 与我在前几个月一起合作想要成立这种合作。虽然看起来机会渺茫,但还是值得一试的:把 Tina带进这场解救行动,与矿池合作挖一笔私人交易。

我刚从山猫大火撤离,饮着不知名的桃子饮品,在太平洋海单调的海浪声放空中,当 Sam在电报私聊我时把我拉回了更黑暗的现实:“资金有风险,可被提前交易”。在过去的几周,我与Sam及Scott在MEV上进行项目考研,已经可以在他们发出交易之前猜到他们的要价:一个保护白帽交易避免被“高级捕食者”在内存池里的”黑暗森林“捕食的通道。

既然这是一步非常冒险的步骤,或许将对矿工们泄漏我们的策略,我们决定现向匿名的Lien团队获取许可。而在Alex尝试联络 ConsesSys内部时,我们则想办法带入 CertiK。

我发现CertiK美国方审计员还需要4小时左右才会起床,但时间依然流逝中。我对CertiK的了解不太多,只知道他们服务了一些亚洲的项目,我便尝试联系CertiK中国。我在”DeFI the World”及 “Yellow Hats“的微信群里发了些消息。在30分钟内收到来自4位的私聊,确认了微信号后才确定我是与真正的倪兆中博士沟通。我被拉入了一个拥有5位CertiK团员的微信群,但在此期间我还是无法透露相关漏洞。为了降低曝光及可能性的亏空,我们只能邀请1位CertiK团员加入我们的白帽行动。在确认了官方邮件后,Georgios Delkos, CertiK的工程负责人加入了我们的交流。

在 Georgios的协助下,Alex得以快速的接触Lien团队及确认他们的身份。我们赶紧让他们了解目前的状况及获取他们的许可直接与矿池合作,帮忙解救将受到攻击的资金。在经过一阵的考虑后,Lien团队同意假设直接性的解救资金或公开作出警告的风险太高,便给了我们许可继续工作。

接下来我们要找出拥有完善设施,以及愿意马上与我们配合的矿池。我们应该找那个矿池?我们应该联络池里的哪位才能在短时间内作出技术上的决策?

星火矿池 SparkPool一闪而过,我知道他们有个名为太极网络的设施或许可以给到我们所粗腰的。我决定联络星火矿池联合创办人少平,之前有协助过我调查内存池的一些活动。

在半小时过后,少平回应:“你是指我们是否有交易的白名单服务?对不起我们没有。” 哎呀,翻译上除了些问题,”白帽” 及 “白名单” 有些相似。

“有将近$1000万的资金岌岌可危。samczsun也在线上。“我尝试再次沟通,但没有透露出太多明细。


“你俩在拯救世界?需要矿池帮忙吗?” 我感到惊讶后松了一口气,少平边开玩笑的愿意协助我们。在确认过官方邮件好哦,少平也加入了我们的Zoom,许多的SparkPool程序员也一起在线。

在吃过午餐后,刚要小睡,我收到来自Tina的信息:“星火矿池曾经有协助过白帽交易吗??我误以为是把一笔交易放入白名单。之前不曾有白帽来接触过我们,我们也不是很理解“白帽交易”意味着什么。在 Tina 更仔细的解释后,我发现他们需要的是私人交易服务, 例如:一名白帽想发一笔交易解救DeFi 合约,但为了避免被提前交易,他们需要矿池把交易在不广播的情况下纳入。

我们在太极网络建立一个“匿名交易”功能,目前还在开发中,而且未经过测试。我把白帽的请求带到开发团队,也解释了当务之急:我们的匿名交易功能必须在几小时后可使用。我破门的开发团队表示可以尽量在限时内完成,随后就动工了。在2小时内我们完成了开发,随后再花一点时间修复补丁。

我们完成了内部测试后,就把whitehat.taichi.network 发给Scott 进行白帽负载。

在星火矿池 赶工推出全新的白帽API之时,Sam与我则在完成可进行4笔顺序交易的脚本。进行这些交易并不会撤出那~25,000ETH,但会把 30,000 SBT+LBT(已创建但”不真实的“)转发给 Lien 团队,允许他们可以提交最后一笔交易,把这些转变回 ETH。与其把 ETH转回给LIEN,我们把可无限铸造的SBT+LBT 代币转发给Lien,我们使用了比较多笔的交易来混淆普遍的提前交易机器人(万一重组),这么做我可以避免遭到$960万被盗走,即使是一阵子

一旦我们生成了这4笔签署交易,Sam 与我花了一段时间使用了各种不同的模拟工具来验证他们的组合表现。这4笔交易少过1.5KB的数据,已经准备好抢劫 $960万的资产,前提是必须由星火矿池先发现他们。

我发了无意义的交易测试了星火矿池的白帽端點,与我预期的结果一样,内存池里找不到交易,然后就直接成为星火矿池区块里的一份子了!这就好像盯着水蒸气直接结成冰,省去了变成一滩水的步骤。

在适应了把脚本直接导入星火矿池的新端点后,是时候了。我犹豫了一整子,但这绝对是我们最好的努力了。我们或许将失去 $960万,但我们不会后悔。我在 IntelliJ按下了 ‘run’。我不知道为什么,但我预期它会花一些时间,就好像节点会了解事情的重量而将会花些时间。但并非如此,这些交易在那毫秒里就转过去了。

在通话里的各位就开始疯狂刷新Etherscan页面,我在想Etherscan 团队是否有留意到那3分钟里流量的提升。既然只有星火矿池持有那笔交易,而且也只有一部分的算力被安排过来这个任务,我们只能冒汗等待。每个区块显示不一样的矿工就如在嘲笑我们。在我们之前的~15区块犹如过了几个小时,但最终,我们的交易记录被完美的成交了。

接下来有更多的区块建立在我们的区块上,我们也松了一口气,重组的可能性就消逝了。Lien团队已经拥有足够的 SBT+LBT来清算他们的整个系统,Sam也继续指导救援的最后阶段。

现在我们已经成功地把代笔转移到Lien,也没有提前交易的迹象,我们赶紧联系Lien这个好消息。他们确认了交易后便马上开了一笔交易要把合约里的 ETH 赎回。几秒后,Etherscan里出现了交易提交中。

我们在看着加载指示不停打转之时,我回顾了一下整个过程。就因为起初的随意浏览合约,最终集合了来自世界各地的专家到这个作战室。没有 Alex及 Georgios, 我们便无法与Lien开发团队 沟通。没有 Scott, 我们就像眼睛蒙布援救。没有Tina,我们便无法接触到 CertiK 或 SparkPool。 没有 SparkPool, 我们估计将历史重演,就如 Dan几周前写的一样。

但在一个星期二的深夜,一群不太可能的组合却因为同一个原因一起团结,孜孜不倦的工作确保超过$960万的资金会回到主人手里。这7小时的努力带来了这一笔的交易,而打转的圈圈也随之而来。

当加载的标示最终变成青色的复选标记,通话里紧张的沉默被松口气的叹声打破了。


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

我们逃离了黑暗深林。

这贴是由许多人的共同努力创出来的。特别感谢 Alex Wade, Scott Bigelow, Tina Zhen, Georgios Delkos, 及 SparkPool 在生态需要你们的时候及时出现,也感谢Alex Obadia 及 Dan Robinson检阅这张贴文及提供反馈。