Bitget App
交易“智”变
行情交易合约跟单策略理财Web3
Blast 链 9700 万美元争夺战,某国黑客生疏了?

Blast 链 9700 万美元争夺战,某国黑客生疏了?

TechFlow深潮TechFlow深潮2024/03/28 05:16
作者:TechFlow深潮
Munchables 项目遭到攻击,约 9700 万美元暴露于风险中,究竟发生了什么?

撰文:CertiK

背景

Blast 是由 Blur 的创始人 Pacman(Tieshun Roquerre、aka.铁顺 ) 推出的 Ethereum Layer2 网络,在 2 月 29 日启动主网,目前约有 19500 ETH 和 640000 stETH 质押在 Blast 主网。

被攻击的项目 Munchables 是 Blast 举办的 Bigbang 竞赛胜出的优质项目。

Blast 官方对质押 ETH 在 Blast 主网的用户会发放普通积分:

为了鼓励用户参与 Blast 生态上的 DeFi 项目,Blast 官方会挑选出优质项目进行推荐,并鼓励用户将 ETH 二次质押到 DeFi 里,可以获得更快的积分增加速度以及黄金积分,因此有相当多的用户将质押在 Blast 主网的 ETH 质押到了新创建的 DeFi 项目。

而这些 DeFi 项目的成熟度、安全性还有待考察,这些合约是否具有足够的安全考虑来保管用户的数千万、甚至上亿美元。

事件概述

Blast 主网上线不到一个月,在 2024 年 3 月 21 日就发生了针对 SSS Token(Super Sushi Samurai)的攻击,Token 合约中存在一个转账逻辑错误,导致攻击者可以凭空增加指定账户的 SSS Token 余额,最终项目损失了超过 1310 ETH(约 460 万美元)。

而在 SSS Token 攻击事件过去不到一周的时间,Blast 上又发生了一起更大的攻击事件,Munchables 项目被攻击者一把卷走了 17413.96 ETH,共约 6250 万美元。

在这笔攻击交易发生的半小时后,项目方合约里的 73.49 WETH 也被黑客盗取到的另外一个地址。

此时项目方的合约地址上,还存着 7276 个 WETH、7758267 个 USDB、4 个 ETH,随时会落入黑客手里,而黑客拥有拿走整个项目的所有资金的权限,共计约 9700 万美元暴露于风险之中。

在事件后发生的第一时间,X(Twitter)的知名链上侦探 zachXBT 指出本次攻击的根本原因是由于雇佣了某国黑客所致。

让我们深入看看,「某国黑客」是如何完成一次接近一亿美元的攻击。

现场还原

受害者发声

[UTC+0]2024 年 3 月 26 日 21 点 37 分(攻击发生 5 分钟后),Munchables 官方在 X(Twitter)发文表示遭到攻击。

按链上侦探 ZachXBT 的调查,是因为他们有一位开发者是「某国黑客」,aavegotchi 的创始人 coderdannn 也在 X(Twitter)上表示:「Aavegotchi 的开发团队 Pixelcraft Studios 在 2022 时曾短期雇用过 Munchables 攻击者来进行一些游戏开发工作,他技术很糙,感觉确实像一名某国黑客,我们在一个月内解雇了他。他还试图让我们雇用他的一位朋友,那个人很可能也是一名黑客。」

由于这次攻击让社区的用户损失巨大,我们立即启动了链上调查,让我们深入看看这个「某国黑客」的攻击细节。

第一现场

[UTC+0]2024 年 3 月 26 日 21 点 32 分,涉及 17413.96 ETH 的攻击发生了。

通过 Blastscan 我们可以看到这笔攻击交易:https://blastscan.io/tx/0x9a7e4d16ed15b0367b8ad677eaf1db6a2a54663610696d69e1b4aa1a08f55c95

受损合约(0x29..1F)是一个代理合约,存放了用户质押的资金,我们可以看到,攻击者调用了质押合约的 unlock 函数,并通过了所有的权限校验,转走了合约中所有的 ETH 到攻击者地址 1(0x6E..c5)。

看上去攻击者调用了一个类似 withdraw 行为的 unlock 函数,取走了受损合约(0x29..1F)上大部分 ETH。

是项目方的金库忘了上锁吗?

受损合约(0x29..1F)中的 unlock 存在两个相关校验,我们一个一个来看。

首先,我们发现在校验权限的流程中,调用了合约(0x16..A0)的 isRegistered 方法来查看当前的 msg.sender,也即是黑客地址 1(0x6E..c5)是否已经被注册过:

答案是:通过了验证。

这里涉及到了合约(0x16..A0)以及其对应的最新的逻辑合约(0xe7..f1)

[UTC+0]2024 年 3 月 24 日 08 点 39 分(攻击发生的 2 天前),合约(0x16..A0)对应的逻辑合约被升级了。

逻辑合约升级交易:

https://blastscan.io/tx/0x9c431e09a80d2942319853ccfdaae24c5de23cedfcef0022815fdae42a7e2ab6

逻辑合约被更新至 0xe7..f1。

最初的逻辑合约地址在这里能看到,为 0x9e..CD。

https://blastscan.io/tx/0x7ad050d84c89833aa1398fb8e5d179ddfae6d48e8ce964f6d5b71484cc06d003

此时,我们怀疑黑客是更新代理合约的逻辑实现合约,将为 0x9e..CD 变成恶意的 0xe7..f1,完成了验证权限的绕过。

真的是这样吗?

在 Web3.0 从来不需要猜测和听信别人,你只需要掌握技术就能自己得到答案。

我们通过对比两份合约(未开源合约),最初的 0x9e..CD 合约与更新后 0xe7..f1 存在一些明显的区别:

0xe7..f1 的 initialize 函数部分实现如下:

0x9e..CD 的 initialize 函数部分实现如下:

可以看到,攻击者在最初的逻辑合约(0x9e..CD)中,将攻击者地址(0x6e..c5)设置为 register,同时还有其他两个攻击者地址 0xc5..0d、0xbf..87 也被 register 了,并且它们的 field0 被设置为初始化时的区块时间,field0 后面会解释用处。

实际上,和我们猜测的恰好相反,真正的藏有后门的逻辑合约,反而是最初就存在,而后面更新的反而是正常的!

等等,这个更新出现在[UTC+0]2024 年 3 月 24 日 08 点 39 分(攻击发生的 2 天前),也就是在这个事件之前,逻辑合约已经变成没有后门的合约了,为什么后面攻击者还可以完成攻击?

这是因为 delegatecall 的原因,所以实际的状态存储更新是在合约(0x16..A0)中,这也就导致了即使之后逻辑合约被更新至没有后门的逻辑合约 0xe7..f1,合约(0x16..A0)中被更改的 slot 依然不会恢复。

我们来验证一下:

可以看到,合约(0x16.....A0)中对应的 slot 是有数值的。

这使得攻击者能够通过 isRegistered 方法的校验:

攻击者之后再将后门合约更换为正常合约掩人耳目,其实此时后门早已种下。

另外,在 unlock 的流程中,还涉及到第二个校验:

对于 lock 时间的检查,这一部分是保证锁定的资产不会在未到期就被转走。

攻击者需要保证当 unlock 被调用时的区块时间大于要求的锁定过期时间 (field3)。

这一部分校验就涉及到受损合约 (0x29..1F) 以及对应的逻辑合约 0xf5..cd。

在[UTC+0]2024 年 3 月 21 日 11 点 54 分(攻击发生的 5 天前)的交易中,

https://blastscan.io/tx/0x3d08f2fcfe51cf5758f4e9ba057c51543b0ff386ba53e0b4f267850871b88170

我们可以看到受损合约 (0x29..1F) 合约最初的逻辑合约是 0x91..11,而在仅仅四分钟后,就在

https://blastscan.io/tx/0xea1d9c0d8de4280b538b6fe6dbc3636602075184651dfeb837cb03f8a19ffc4f

被升级为了 0xf5..cd。

我们同样来对比两份合约,可以发现攻击者和之前一样,也在 initialize 函数做了手脚,

0xf5..cd 的 initialize 函数部分实现:

0x91..11 的 initialize 函数部分实现:

可以看到,很明显的,又是运用了同样的手法,将自己持有的 ETH 数量解锁时间都进行了篡改,之后再替换回正常合约掩人耳目,当项目方和安全研究人员在 Debug 的时候,看到的逻辑合约全是正常的,而且由于合约均为未开源合约,更难以看清问题的核心。

至此,我们了解了这笔涉及 17413 ETH 的交易,攻击者是如何做到的,但是这个事件背后的信息,只有这么多吗?

我们上面的分析中,其实看到黑客在合约内部内置了 3 个地址:

0x6e..c5(攻击者地址 1)

0xc5..0d(攻击者地址 2)

0xbf..87(攻击者地址 3)

而我们上面发现的攻击交易中只看到 0x6e..c5,其他两个地址都做了什么?而且里面的 address(0)、_dodoApproveAddress、_uniswapV3Factorty 到底还隐藏着什么秘密?

第二现场

我们先来看看攻击者地址 3(0xbf..87),通过同样的手法盗取了 73.49 WETH:

https://blastscan.io/tx/0xfc7bfbc38662b659bf6af032bf20ef224de0ef20a4fd8418db87f78f9370f233

并且攻击 gas 的来源地址(0x97..de),同时给 0xc5..0d(攻击者地址 2)和 0xbf..87(攻击者地址 3)都提供了手续费。

而攻击 gas 来源地址(0x97..de)的 0.1 ETH 的资金源头来自 owlto.finance(跨链桥)。

0xc5..0d(攻击者地址 2)收到手续费后,并未进行任何攻击,但它其实肩负了一个隐藏的计划,我们继续看下去。

实际上,根据官方的事后救援交易,原来受损合约 (0x29..1F) 地址上并不止 73.49 枚 weth,直到攻击结束,也仍有 7276.5 WETH 7758267 USDB。

救援交易:

https://blastscan.io/tx/0x1969f10af9d0d8f80ee3e3c88d358a6f668a7bf4da6e598e5be7a3407dc6d5bb

原本攻击者是打算盗取这些资产的,可以看到 0xc5..0d(攻击者地址 2)这个地址原本是用来偷取 USDB 的。

这里的_dodoApproveAddress 为 0x0000000000000000000000004300000000000000000000000000000000000003

为 usdb 的 address

0xbf..87(攻击者地址 3)这个地址是用来偷取 weth 的:

这里的_uniswapV3Factory 为 0x0000000000000000000000004300000000000000000000000000000000000004

为 weth 的 address

而 0x6e..c5(攻击者地址 1)负责盗取的是 address(0),即是原生资产 ETH。

攻击者通过设置 field0,即可通过如下逻辑对对应资产进行盗取:

问题

为什么攻击者没有盗走所有资产?

理论上他可以盗取所有的资产,即剩下的 WETH 和 USDB。

0xbf..87(攻击者地址 3)只盗取了 73.49 WETH,0xbf..87(攻击者地址 3)其实完全可以把所有的 7350 WETH 拿走,也可以借助 0xc5..0d(攻击者地址 2)把 7758267 USDB 全部拿走,为什么只拿了一点点 WETH 就停下来了,我们不得而知,可能需要知名链上侦探深入内部的调查了。

https://blastscan.io/tx/0xfc7bfbc38662b659bf6af032bf20ef224de0ef20a4fd8418db87f78f9370f233

为什么攻击者没有把 17413ETH 转到 Ethereum 主网?

众所周知,Blast 主网是有可能通过中心化的方式拦截这些 ETH,让它永久停留在这里,从而不会造成实质上的用户损失,但是一旦这些 ETH 进入 Ethereum 主网,就没有办法拦截了。

我们评估了当前 Blast 的跨链桥,官方跨链桥没有限制数量,但是需要 14 天的退出时间,因此足以让 Blast 官方来准备拦截的计划。

而第三方的跨链桥是可以接近实时到账的,就像攻击者的手续费来源一样,很快完成跨链,为什么攻击者没有第一时间进行跨链?

实际上攻击者在第一时间(攻击的 2 分钟内)进行了跨链:

https://blastscan.io/tx/0x10cf2f2b884549979a3a1dd912287256229458ef40d56df61738d6ea7d9d198f

而且资金花了 20 秒就在 Ethereum 主网到账了,理论上攻击者可以持续不断进行跨链,可以在跨链桥人工干预之前,将大量 ETH 跨链转走。

至于为什么只能每次 3 ETH,原因是跨链桥的流动性限制,从 Blast 上跨到 ETH 上:

另一家支持 Blast 的跨链桥则支持的更少:

而在这一笔跨链交易后,攻击者没有继续其他的跨链操作,原因我们不得而知,看上去「某国黑客」似乎是没有为资金退出 Blast 进行充足的准备。

攻击后的事件发展

根据社区用户 Nearisbuilding 的反馈,他找到了攻击者的更多身份信息,并且想办法促使攻击者归还资金。

https://twitter.com/Nearisbuilding/status/1772812190673756548

最终,在加密社区的关注和努力下,「某国黑客」也许因为害怕暴露身份,向项目方提供了以上 3 个攻击者地址的私钥,并归还了所有资金,项目方也进行了救援交易,把受损合约的资金全部转到多签合约进行保管。

0

免责声明:文章中的所有内容仅代表作者的观点,与本平台无关。用户不应以本文作为投资决策的参考。

PoolX:锁仓获得新代币空投
不要错过热门新币,且APR 高达 10%+
立即参与!

你也可能喜欢

Clayton (CLAY):TON 生态系统充满乐趣的吉祥物和游戏中心

什么是Clayton Project(CLAY)? Clayton (CLAY) 是 Telegram 中的一款小程序,提供有趣、易玩的游戏和 CL 积分形式的奖励。作为吉祥物,Clayton 象征着 TON 中的游戏、互动和成长精神,鼓励用户深入游戏、获得奖励并邀请朋友加入。 这个概念简单而强大:用户与 Clayton 互动、玩游戏并赚取 CL 积分,这是生态系统内的一种应用内货币。这些积分以后可用于各种目的,尤其是当 Clayton 团队扩展其功能时。 谁创立了 Clayton (CLAY)? Clayton 的创始人依然未知。 哪些风险投资支持 Clayton Project(CLAY

Bitget Academy2024/11/05 12:33

比特币的未来:2024 年美国大选对加密货币市场意味着什么

随着 2024 年美国总统大选临近,金融界充斥着关于它将如何影响比特币和更广泛的加密货币市场的预测。特别是,比特币最近的价格走势、历史趋势以及主要候选人唐纳德·特朗普和卡马拉·哈里斯的立场,让人们再次关注选举将如何影响下一次价格大涨。 要了解可能发生的情况,必须了解比特币的历史行为、政治气氛以及一些关键的市场因素,例如它与标准普尔 500 指数的关系以及对比特币看涨期权的需求不断增长。让我们分析一下这些因素,并探讨它们对比特币的未来意味着什么。 比特币和 2024 年美国总统大选 不同的候选人,不同的加密货币政策 候选人对加密货币的立场显示出鲜明的对比。唐纳德·特朗普公开拥抱加密货币行业,倡

Bitget Academy2024/11/05 12:27

Swell Network (SWELL):让每个人都能享受以太坊质押和重新质押的便利

什么是Swell Network(SWELL)? Swell Network (SWELL) 是一个流动性质押平台,允许用户通过质押或重新质押 ETH 赚取被动收入。质押涉及锁定一定数量的 ETH 以帮助验证以太坊区块链上的交易。作为回报,用户将获得奖励。Swell 使这个过程更容易、更容易实现,即使对于那些没有大量 ETH 或技术专长的人来说也是如此。 谁创立了 Swell Network (SWELL)? Swell Network 由 Swell Labs 开发,该团队致力于创造安全、去中心化和透明的金融未来。Swell Labs 的目标是让每个人都能享受金融自由,不受歧视或审查。 哪

Bitget Academy2024/11/05 10:41

【首发上币】Swell(SWELL)将上线 Bitget,参与瓜分 23,440,000 SWELL!

我们非常高兴地宣布,Swell(SWELL)将在创新区和 LSD 区上线。详情如下: 充值开放时间:已开放 交易开放时间:2024年11月7日18:00(UTC+8) 提现开放时间:2024年11月8日19:00(UTC+8) 现货交易链接:SWELL/USDT 活动1:Launchpool——锁仓 BGB 和 USDT,瓜分 19,500,000 SWELL 锁仓时间:2024年11月7日18:00至2024年11月14日18:00(UTC+8) 立即锁仓 SWELL 总奖池 19,500,000 SWELL BGB 奖池 16,000,000 SWELL USDT 奖池 3,500,00

Bitget Announcement2024/11/05 10:00