重新定义低危漏洞 - Nomad 爆炸
有时候,数学不及格不只是能让你拿不到学位,甚至有可能让你成为蛆快链共产主义先锋。
发生了啥
由于 Nomad
桥的开发者使用了他们大概没有完全理解的 Sparse Merkle Tree
, 这一哈希树结构的特点是未使用的叶子将以空叶表现。我们认为 Nomad
采用这一结构是为了有效率的构建欺诈证明,从而高效率验证交易。Nomad
的审计机构, QuantumStamp
, 在他们的 审计报告 中指出了这一点,并且标记为了 Low Risk,甚至还认为项目方确认了。
不幸的是,在这个错误的下面(QSP-19), Quantumstamp 还用小字标出了一句话:
We believe the Nomad team has misunderstood the issue.
Quantumstamp
显然, Nomad
项目方认为,攻击者无法找到空叶的原像,但问题在于,空叶不是哈希为空,而是内容为空。所以任何以空内容调用他们桥合约的 proof
都可以确认并更改状态,这使得他们的欺诈证明完全失效。
但是这一问题本身不足以造成 Hack 发生。合约 中的 Replica.sol::44
将 messageHash
映射到了 message
对应的状态树根,问题在于,以太坊中未初始化的map取出的值为0,而 nomad
项目方不幸的,把 0x00
设为了可接受的roothash。
简直像狂欢一样
不幸的,在升级之后的 UTC 时间 8月1日晚上10点,有人发现了这个问题。
之后的大约两个小时内,以太坊上的科学家们简直像狂欢一样,他们用空叶作为证明,快乐的将 Nomad
跨链桥中的一亿六千五百万美元的资产进行了一个款的提,对于跟风者来说这个活动简直像共产主义一样 ——
只要修改交易的接收者,币种和数额,就会有免费的钱进入他们的账户,也许这就是真正的共产主义吧。
宁睡醒辣?
在大家提完款后之后的大概两小时,Nomad
团队终于睡醒辣,并且终于想起来把他们的合约赶紧下线。不幸的是,钱已经被各类来建设共产主义领取 Free Money 的人提取干净了。
我们不能说 Nomad
反应迟钝,毕竟我们看到 Ronin 的朋友花了一周的时间才发现有问题,而Harmony的朋友也花了14个小时,只能说他们不算反应迟钝了。