Wormhole $326M跨链桥攻击完整技术复盘:一个sysvar伪造如何绕过19个Guardian签名

4 阅读1分钟

1. 背景

2022年2月2日,Wormhole跨链桥遭到攻击,损失120,000 wETH,约326M。这是当时仅次于PolyNetwork326M。这是当时仅次于Poly Network 611M事件的第二大DeFi攻击。

Wormhole不是一个普通的桥。它是DeFi生态里最底层的基础设施之一。ETH从Ethereum到Solana通过Wormhole。USDC跨链通过Wormhole。NFT元数据跨链通过Wormhole。攻击发生时,Wormhole连接了9条链,TVL超过$1B。

Wormhole的19个Guardian节点由Jump Trading、Everstake、Certus One等知名机构运行,使用secp256k1曲线签名。

安全假设:如果你不能伪造一个被阈值Guardian签名过的VAA,你就不能在目标链上铸造代币。

攻击者没有打破密码学。他打破的是验证逻辑。


2. 架构分析

跨链消息流

用户在源链锁定代币 → 19个Guardian节点观察链上事件 → 各自用secp256k1私钥签名VAA → 用户在目标链提交VAA → 程序验证签名阈值 → 铸造等量代币

VAA结构

字段说明
guardian_set_indexGuardian集合版本号
timestamp事件时间戳
nonce防重放nonce
emitter_chain源链ID
payload转账详情
signatures[]Guardian的secp256k1签名

3. 漏洞分析

Solana sysvar机制

在Solana上,sysvar是一种特殊的系统级账户。Instructions sysvar包含当前交易中所有指令的序列化数据。

load_instruction_at的陷阱

Solana SDK提供的load_instruction_at函数从sysvar账户中加载指令数据。关键问题:这个函数不验证传入的AccountInfo是否为真正的instructions sysvar。

用比喻:保安检查身份证格式,但从不核实是否是公安局发的。假身份证照样放行。

漏洞伪代码

pub fn verify_signatures(
    instruction_sysvar: &AccountInfo,  // 预期:真正的sysvar
    guardian_set_index: u32,
    signatures: &[Signature],
) -> Result<(), ProgramError> {
    
    // ❌ 没有检查 instruction_sysvar 是否为真正的 sysvar
    let ix_data = load_instruction_at(ix_index, instruction_sysvar)?;
    let sig_bytes = extract_signatures(&ix_data)?;
    
    for sig in &sig_bytes {
        verify_secp256k1(sig, guardian_public_key, payload)?;
    }
    
    if sig_bytes.len() < THRESHOLD {
        return Err(ProgramError::InvalidSignature);
    }
    Ok(())
}

verify_secp256k1本身没问题。问题是签名数据从哪里来——攻击者控制了数据源。


4. 攻击复现

Step 1: 找到一笔之前合法的跨链转账,获取19个Guardian的真实签名Step 2: 创建伪造的sysvar账户,放入合法签名数据Step 3: 构造新VAA声称120,000 wETH转账,用伪造sysvar传入Step 4: verify_signatures从伪造sysvar读到旧签名,验证通过Step 5: 铸造120,000 wETH

一笔交易,$326M。签名重放攻击,但在验证函数读取数据源层面实现。


5. 链上追踪

  • 攻击者Solana地址:多个地址用于攻击序列
  • 伪造sysvar在同一交易块中创建
  • 93,750 wETH通过其他桥转回以太坊
  • 剩余资金通过Tornado Cash清洗
  • Jump Trading在数小时内补仓120,000 ETH
  • Wormhole悬赏$10M,攻击者未回应

6. 修复方案对比

方案描述效果
验证sysvar地址检查account.key == Sysvar ID修复当前漏洞
验证sysvar owner检查account.owner == system_program双重验证
运行时API用Solana运行时方法直接读取从根源避免参数传入
nonce唯一性检查VAA sequence是否已处理防御重放
Guardian set版本验证签名来自当前活跃集合防御旧签名利用

7. 防御建议

  1. 在Solana上,验证每一个传入的AccountInfo参数
  2. 对sysvar账户使用运行时提供的访问方法
  3. 实施多层防御:签名验证 + nonce检查 + Guardian set验证
  4. 跨链桥的安全审计应重点关注账户验证逻辑
  5. 从EVM迁移到Solana的开发者必须理解账户模型差异

8. 行业影响

跨链桥攻击对比:

项目时间损失攻击类型
Wormhole2022.2$326Msysvar身份伪造
Ronin Bridge2022.3$625M私钥钓鱼
Nomad2022.8$190M消息证明伪造
Harmony Horizon2022.6$100M2/5密钥泄露
Wintermute2022.9$160M热钱包私钥泄露

跨链桥是DeFi生态中最脆弱的一环:多链部署、多密钥管理、复杂的攻击面。一旦被攻破,攻击者可以凭空铸造代币。

#区块链安全 #跨链桥 #Wormhole #智能合约审计 #DeFi安全 #Solana安全 #Web3安全