9月7日,Bitcoin 侧链 Liquid Network 发生了一起重大安全事件,约 4000 枚BTC 从 Liquid Federation 的 BTC 储备中被提走。攻击者利用 Liquid 底层软件 Elements 中的验证缓存漏洞,额外铸造了约 4000 枚 L-BTC;随后再通过合法的 peg-out 流程,把这些伪造出来的 L-BTC 兑换成了主网上的真实 BTC。
目前,攻击者已返还 3400 枚BTC,剩余的 598.5 枚BTC仍处于是否为“漏洞赏金”的争议中。Beosin对本次漏洞的分析如下:
一、漏洞分析
Liquid Network 是 Blockstream 参与开发的 Bitcoin 侧链。用户将 BTC 锁定在主网 Federation 多签地址后,可以在 Liquid 上获得等量的 L-BTC。理论上,每一枚 L-BTC 都应有一枚 BTC 作为储备支撑。
本次事件中,攻击者通过 Elements 的验证漏洞,在 Liquid 链上制造了约 4000 枚未被 BTC 支撑的 L-BTC。随后,攻击者将这些 L-BTC 发送至 SideSwap 的 peg-out 服务。SideSwap 按正常业务逻辑销毁 L-BTC,并通过有效的 Peg-out Authorization Key(PAK),向 Liquid Federation 发起提款请求。Federation 节点看到的是一笔形式上有效的 peg-out,于是释放了真实 BTC。
void SignatureCache::ComputeEntryRangeProof(uint256& entry,const std::vector<unsigned char>& proof,const std::vector<unsigned char>& commitment) const {CSHA256 hasher = m_salted_hasher_range_proof;hasher.Write(proof.data(), proof.size()).Write(commitment.data(), commitment.size()).Finalize(entry.begin());}
rangeProofCache.ComputeEntryRangeProof(entry,vchRangeProof,vchValueCommitment);
if (rangeProofCache.Get(entry, !store)) {return true;}
Hash(proof || value_commitment || asset_commitment || scriptPubKey)
三、安全建议
Liquid Network 此次安全事件是一场由底层验证缓存缺陷引发的系统性事故,旧代码把 range proof 的验证成功结果缓存到一个上下文绑定不完整的 key 下,导致本应重新验证的无效 proof 可以通过缓存命中绕过验证。攻击者利用这一点制造未被 BTC 储备支撑的 L-BTC,再通过 SideSwap 的正常 peg-out 流程换出真实 BTC。
对于密码学证明,验证结果往往依赖资产类型、金额承诺、脚本、交易上下文、协议版本等多个因素。遗漏任意关键字段,都可能导致验证结果被跨上下文复用。此外,在业务安全方面,任何桥、侧链、L2 或托管兑换服务,都应该考虑经济安全性,判断交易行为的合理性,对于巨额交易,应考虑设置单笔限额、日限额、储备比例限制、新地址冷却期、人工审批和异常流速报警等机制。
Beosin是一家领先的区块链安全与监管合规科技公司,专注于项目上线前的智能合约安全审计、项目运行时的安全风险监控与阻断、被盗追回、虚拟资产反洗钱(AML)以及调查追踪。Beosin已为全球20多个国家和地区的监管与执法机构、200多家虚拟资产服务商以及4500多家Web3项目提供“一站式”区块链合规产品+安全服务。欢迎点击公众号留言框,与我们联系。
