Nomad Bridge 可信根初始化为零事件复盘
基于公开披露资料的事后复盘,非 umibit 受托审计。2022-08-01,一次例行升级把 Replica 合约的 可信根错误地初始化为 0x00;由于 Solidity 中未设置的 mapping 键默认返回 0x00,任何伪造消息的 证明校验都会命中这个「可信」零根而通过。漏洞公开后被数百人复制 calldata、替换收款地址哄抢, 史称「首例去中心化哄抢式抢劫」,960 笔交易掏空约 $1.9 亿。
本页基于公开披露资料对一起真实安全事故做事后分析,用于安全研究与方法论说明,并不代表 umibit 与 Nomad(乐观式跨链消息桥) 存在任何业务关系。文中每一项结论均可对照下方「核验来源」独立核查。
- 报告编号
- NOMAD-2022
- 受影响项目
- Nomad(乐观式跨链消息桥)
- 区块链
- Ethereum
- 语言
- Solidity
- 损失规模
- ≈ $190M(近乎全部 TVL)
- 报告版本
- 复盘 v1.0
- 事件日期
- 2022-08-01
- 事件评级
- 严重风险
相关合约 / 链上对象
事件涉及的合约 / 链上对象及其可核验身份(地址 / commit),据公开披露整理。
| 名称 | 类型 | commit | 地址 |
|---|---|---|---|
| Replica.sol · process() | 消息处理 | — | — |
| Replica.sol · acceptableRoot() / confirmAt | 根校验 | — | — |
| Replica 合约(据公开披露) | 链上地址 | — | 0xb92336759618f55bd0f8313bd843604592e27bd8 |
根因与漏洞
严重 3| ID | 标题 | 严重 | 状态 | 类别 |
|---|---|---|---|---|
| NOMAD-01 | 升级时把可信根初始化为 0x00(confirmAt[0x00] 被设为有效时间戳) | 严重 | Resolved 已修复 | 初始化 |
| NOMAD-02 | 未设置的 mapping 键默认返回 0x00,致任意伪造消息证明通过 acceptableRoot | 严重 | Resolved 已修复 | Merkle / 跨链证明 |
| NOMAD-03 | 漏洞可被无门槛复制(替换收款地址即可),引发群体哄抢 | 严重 | Resolved 已修复 | 业务逻辑 |
公开事件复盘。 本页基于公开披露资料对一起真实安全事故做事后分析,用于安全研究与方法论说明, 并非 umibit 受托审计。文中数据请以「核验来源」所列公开资料为准。
事件概览
Nomad 是一座乐观式(optimistic)跨链消息桥。2022-08-01,其桥合约在数小时内被掏空 约 $1.9 亿—— 几乎是全部 TVL(WBTC、WETH、USDC、USDT、DAI 等)。与多数攻击不同,这次没有「一个黑客」:漏洞一旦公开, 数百个地址复制同一份攻击 calldata、只把收款地址换成自己,演变成一场公开哄抢,共 960 笔交易、1,175 次提款。
根因:可信根被初始化为零
Replica 合约的 process() 在执行跨链消息前,会用 acceptableRoot() 检查该消息对应的 Merkle 根是否「可信」,
其依据是 confirmAt[root] 这个 mapping 中记录的确认时间戳。
一次例行升级把可信根 初始化为 0x00,即 confirmAt[0x00] 被设成了一个有效时间戳。而 Solidity 的语义是:
任何未显式设置的 mapping 键都默认返回 0x00。于是对于 任意伪造消息,其「未被确认」的根都会取到 0x00,
再被当成那个「可信零根」而 acceptableRoot() 返回 true——证明校验形同虚设,任何人都能让桥相信「这条提款已被证明」。
时间线细节:错误初始化约在 2022-05-26 引入,并在 2022-06-21 的升级中进入生产环境。
影响与处置
- 白帽陆续归还资金,普遍报道 约 $30M+;Nomad 设立回收地址并承诺归还 90% 者不追究法律责任。
- 后续有关键嫌疑人被引渡至美国(据 TRM Labs)。
AI 视角 · 为什么这类风险只会更多
Nomad 是 「升级/初始化引入的单点致命错误」 的典型:一行被错误初始化的状态,叠加 Solidity「零值默认」的语义陷阱, 就让整座桥的证明校验归零。它还展示了 Web3 特有的放大效应——链上漏洞一旦暴露即被群体复制,从单点变成踩踏。
启示有二:其一,每次升级/初始化都必须被当作完整审查对象(最危险的改动往往只有一行);其二,攻击者复制与变体的速度 正被自动化与 AI 拉满,留给团队的反应窗口越来越短。把「初始化不变量、零值/默认值假设、升级前后差异」纳入可规模化的 自动核查,并在上线前跑满覆盖,是与这种速度赛跑的唯一现实做法。
核验来源
本页结论所依据的公开资料,每项数据与论断都可对照独立核查。
请对照上方「核验来源」所列的官方根因分析、安全机构报告与区块浏览器,独立核查事件日期、损失规模、根因与链上地址等每一项论断。