8月2日7时,加密KOL @0xfoobar发推称,跨链互操作性协议Nomad桥正在被黑客攻击,WETH和WBTC正以每次百万美元的频次转出,合约中仍有1.26亿美元可能存在风险。提醒用户尽快提取资金。最近的一次就有1万枚以太坊(约合1600万美元)转出,Nomad桥还有8000万美元的USDC正在流出。
Nomad官方团队称,已知晓涉及 Nomad 代币桥的事件,目前正在调查中。受该事件影响,Moonbeam称:Moonbeam 网络已进入维护模式,以调查网络上部署的智能合约的安全事件。在此期间,功能将受到限制,用户将无法执行常规用户交易和智能合约交互。治理、质押、取消暂停和升级的能力将继续有效。
截至目前,据defillama数据显示,Nomad TVL 中超过 1.9 亿美元的加密货币在几小时内被撤出,钱包中目前仅剩5336美元。Terra研究员FatMan评论此次攻击事件称,这是以真正的加密方式——第一次去中心化的抢劫。
对此,投资机构Paradigm研究员@samczsun试图还原黑客攻击的全过程:
1,一切都开始于@officer_cia分享@spreekaway ETH Security Telegram 频道的推文。尽管当时并不知道发生了什么事,但从桥上撤离的大量资产来看显然是一个不好的信号。
2,第一个想法是代币的小数点配置有误。毕竟,桥上好像在运行“发送 0.01 WBTC,返还 100 WBTC”的促销活动。
3,然而,在 Moonbeam 网络上进行了一些手动挖掘之后,确认虽然 Moonbeam 交易确实桥接了 0.01 WBTC,但以太坊交易以某种方式桥接了 100 WBTC。
4,此外,在 WBTC 中桥接的交易实际上并没有证明什么。它只是直接调用了`process`。可以说,能够在不首先证明的情况下处理消息是非常不好的
5,在这一点上,有两种可能性。要么是在较早的区块中单独提交了证明,要么是 Replica 合约存在严重错误。但是,绝对没有迹象表明最近有任何事情被证明。
6, 这只剩下一种可能性——副本合约存在致命缺陷。但是怎么做?快速浏览表明提交的消息必须属于可接受的根。否则,第 185 行的检查将失败。
7,幸运的是,有一种简单的方法可以检查这个假设。知道没有被证明的消息的根是 0x00,因为messages[_messageHash] 将未初始化。接下来所要做的就是检查合同是否会接受它作为根。
8,事实证明,在例行升级期间,Nomad 团队将可信根初始化为 0x00。需要明确的是,使用零值作为初始化值是一种常见的做法。不幸的是,在这种情况下,它具有自动验证每条消息的微小副作用。
9,这就是黑客如此混乱的原因——你不需要了解 Solidity 或 Merkle Trees 或类似的东西。你所要做的就是找到一个有效的交易,用你的地址找到/替换对方的地址,然后重新广播它。
10,例行升级将零哈希标记为有效根,这具有允许在 Nomad 上欺骗消息的效果。攻击者滥用它来复制/粘贴交易,并在疯狂的混战中迅速耗尽了桥。
A16z应用安全成员Matt Gleason发推介绍了Nomad 被攻击的原因:
Nomad 桥以与 Qubit 的 QBridge 类似的方式获得。桥的不安全配置导致特定路径允许发送任何事务。错误出现在 Replica 的“进程”函数中。
Process 旨在确保消息已被证明,然后处理该消息,这通常应该没问题。
它使用acceptableRoot 来执行此操作,它将检查根是否已被证明或在当前时间之前已被确认。
出现这个问题是因为在 solidity 中,如果一个映射键在此之前没有被看到,那么它将默认为零,从而导致尝试确认根值为零。但是,由于它们初始化时使用的是 0 的 confirmed Root ,这意味着零在技术上是一个已确认的根。
因此,系统会接受任何以前从未见过的消息,并将其当作真实消息来处理,这意味着你所需要做的就是要求所有的桥的钱,你就会得到它。
Paradigm工程师@ParadigmEng420发推提醒用户如果在Nomad 、Evmos、Moonbeam、Milkomeda有任何资金,需要交换出游牧资产,并使用不同的跨链桥,尽快回到以太坊或另一个链。他还指出,Nomad 暂停了中继器,并试图使用观察者审查所有桥接交易,但是,这可能没什么帮助,因为漏洞利用是在合同方面而不是在基础设施方面。