学院 热点聚焦 文章

又一跨链桥被盗1.9亿美金!链上卫士深度分析Nomad Bridge攻击事件

2022.08.02 0xc730

北京时间 2022 年 8 月 2 日凌晨,Nomad Bridge 遭受攻击,导致价值约 1.9 亿美元的损失。发生被盗事件,用户主要关注的是被盗金额以及事件发生的原因和过程。本文将从这几个维度深度分析本次 Nomad Bridge 攻击事件。

数据概览

OKLink 链上卫士追踪显示,Nomad Bridge 攻击事件共涉及 1251个 ETH 地址,涉及 14 个币种,涉案金额约 1.9 亿美金;其中包含 12个 ENS 地址,ENS 地址涉案金额超 6980 万美金,约占总金额的38%;在利用漏洞获利后,直接进行交易的地址数达 739 个,占比近60%。但值得注意的是并不是所有地址都是恶意攻击,已知已有白帽骇客公开表态愿意归还资金,OKLink 已对剩余的地址进行了监控,后期若发生异动,会通过微博、推特向用户同步。

事件原因

这次漏洞产生的原因是 Replica 合约在初始化的时候将 confirmAt[0x00] 赋值为 1,使得storage变量 messages 中未初始化的键值对都能够成功通过检测。

详细经过

大约从第 15259101 个区块开始,攻击者对 Replica 合约的 Process 函数进行了多次的调用。

图片来源:OKLink
图片来源:OKLink

对交易 https://www.oklink.com/zh-cn/eth/tx/0xb1fe26cc8892f58eb468f5208baaf38bac422b5752cca0b9c8a871855d63ae28 进行分析可以看到,当交易执行到 acceptableRoot 函数的时候,可以发现很不寻常的地方。从下图可以看出,acceptableRoot函数的输入参数为全0,且该函数返回结果为 true

根据 _messageHash 获得的 messages[_messageHash] 值为 0 字符串,有两种情况,一是 _messageHashmessages mapping 中没有对应的值,二是存在有对应值但被设为了 0,并且我们从返回结果 true 得知,输入 0 值可以绕过这个 require 检查,这是很异常的情况。

进入到 acceptableRoot 函数,当输入 _root 为 0 时,意味着 confirmAt[_root] 满足不为零且小于等于 block.timestamp 的值。

confirmAt[] 只在 initialize,update 和 setConfirmation 三个函数中出现被修改的情况,导致此次攻击事件发生的问题出现在 initialize 函数中。可以看到在调用 initialize 函数对合约变量进行初始化的时候,将 confirmAt[_committedRoot] 的值设为了 1。

在该合约的初始化交易中可以看到,输入的所有变量都为 0 ,也就是说在初始化阶段 confirmAt[0x00..0] 的值被设为了 1。这也就直接导致了 acceptableRoot 函数中发生了不合理的绕过。初始化交易:https://www.oklink.com/zh-cn/eth/tx/0x53fd92771d2084a9bf39a6477015ef53b7f116c79d98a21be723d06d79024cad

回到 process 函数中,在了解了上述漏洞产生的原因后,只需要每次输入没有被使用过的 _messageHash ,就能在 messages mapping 中获取到 0 值,从而绕过 !proven 的检测,最终从跨链桥上盗取资产。

漏洞分析

对 Replica 合约的 process 函数进行分析,在require(acceptableRoot(messages[_messageHash]), “!proven”);这个判断条件中,messages[_messageHash]的值需要经过 acceptableRoot 函数的逻辑检验,返回值为 true 才能继续往下执行。

注意到 acceptableRoot 函数中,传入的 _root 参数,在confirmAt[_root] 大于 0 且小于等于block.timestamp的情况下,就会返回 true。

那么该漏洞的核心就在对confirmAt这个 mapping 赋值的过程。从initialize函数输入参数可以看到,_committedRoot使用了0x00。一般情况使用0值做初始化参数没有问题,但是在Nomad的这个场景下,就导致了任意message都能通过检测的安全漏洞。

链上卫士分析师建议在initialize函数中也进行严格的安全检查和判断。

后记

本次事件影响十分广泛,参与地址数众多,其中出现了许多 ENS 地址。主要原因是执行攻击的门槛成本低,后续参加的攻击者只需要将先前攻击者的 calldata 稍作修改就可以完成攻击,并且项目方在攻击事件发生时没有相应的项目应急停止机制,导致发生了哄抢事件。链上卫士作为区块链安全领航者,将持续跟进链上安全事件,为链上安全保驾护航。

免责声明:OKLink学院仅提供信息参考,不构成任何投资建议。

相关推荐

hot-news