1. 背景
2022年2月2日,Wormhole跨链桥遭到攻击,损失120,000 wETH,约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_index | Guardian集合版本号 |
| 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. 防御建议
- 在Solana上,验证每一个传入的AccountInfo参数
- 对sysvar账户使用运行时提供的访问方法
- 实施多层防御:签名验证 + nonce检查 + Guardian set验证
- 跨链桥的安全审计应重点关注账户验证逻辑
- 从EVM迁移到Solana的开发者必须理解账户模型差异
8. 行业影响
跨链桥攻击对比:
| 项目 | 时间 | 损失 | 攻击类型 |
|---|---|---|---|
| Wormhole | 2022.2 | $326M | sysvar身份伪造 |
| Ronin Bridge | 2022.3 | $625M | 私钥钓鱼 |
| Nomad | 2022.8 | $190M | 消息证明伪造 |
| Harmony Horizon | 2022.6 | $100M | 2/5密钥泄露 |
| Wintermute | 2022.9 | $160M | 热钱包私钥泄露 |
跨链桥是DeFi生态中最脆弱的一环:多链部署、多密钥管理、复杂的攻击面。一旦被攻破,攻击者可以凭空铸造代币。
#区块链安全 #跨链桥 #Wormhole #智能合约审计 #DeFi安全 #Solana安全 #Web3安全