欢迎回到Sherlock的漏洞聚焦,我们在这里突出在Sherlock审计中发现的一个重要漏洞。 本周,我们讨论的是存款欺骗。 这个漏洞是由@0xalpharush和@bernd_eth在@zetablockchain跨链比赛中发现的。🧵
这是@bernd_eth对漏洞的总结: 1. ZetaChain的观察者监控外部链上的交易(例如,以太坊、索拉纳),并将其添加到集中式入站跟踪器中,以将其处理为存款和取款,假设交易成功。 2. 与EVM集成不同,索拉纳的实现跳过了交易成功检查,允许恶意观察者添加失败的存款,铸造无支持的ZRC20 SOL,并抽走桥接资金。 3. 尽管观察者被ZetaChain明确列入白名单,但确保没有单一方能够危害链或 siphon 资产至关重要。
通常,观察者不会处理失败的交易,但这条代码路径未能执行与其EVM对应部分相同的验证。虽然这需要一个“特权”角色,但每个验证者都是观察者,而BFT共识应该是拜占庭容错的,即容忍<1/3的恶意方。因此,一个恶意观察者不应该能够伪造存款,并诱使诚实的验证者通过缺乏验证的入站跟踪器投票铸造ZRC20 Sol,以应对失败的交易,这个入站跟踪器缺乏其Solana实现的验证。
此漏洞的根本原因: ProcessInboundEvents 函数并不要求交易必须成功,与 EVM 入站观察者在这里正确处理的方式不同。由于指令被解码为成功,恶意观察者可以伪造整个 ZRC20-SOL 余额的存款,然后提取锁定在桥接的 Solana 侧的 SOL,从而窃取桥中的所有 lamports。此攻击还可以用于提取 SPL 代币或执行任意存款和调用。例如,在存款指令中从网关的 PDA 中移除可写属性会导致交易失败(请参见 POC 中的锚约束错误),但一旦通过 MsgAddInboundTracker 添加到入站跟踪器中,它仍然可以被处理。
内部前提条件: 一个恶意或疏忽的观察者通过 MsgAddInboundTracker 向入站跟踪器添加一个失败的 Solana 交易,该交易包含网关指令,导致所有验证者处理并投票铸造 Zetachain 上的 ZRC20 Sol。 CCTX 收到足够的投票,未担保的 ZRC20 Sol 在 Zetachain 上被铸造。
外部前提条件: 任何一方向网关发送失败的交易,并附带存款指令(或存款和调用)。 Zetachain上的ZRC20 Sol的接收方提取它,并在Solana上接收lamports。
攻击路径: 1) 任何一方向网关发送带有存款指令(或存款和调用)的失败交易。 2) 一个恶意或疏忽的观察者使用 MsgAddInboundTracker 将包含网关指令的失败 Solana 交易添加到入站跟踪器,导致所有验证者处理并投票铸造 Zetachain 上的 ZRC20 Sol。 3) ProcessInboundTrackers 任务导致伪造的 CCTX 收到足够的投票,从而在 Zetachain 上铸造未支持的 ZRC20 Sol。 4) Zetachain 上的 ZRC20 Sol 的接收者提取它并在 Solana 上收到 lamports。
这有什么影响? 所有存入Solana桥的lamports和SPL代币都可能被盗,因为存款可以伪造为任何金额(尽管Gateway程序导致交易回滚,但仍会处理这些存款)。
缓解措施: 在 Solana Observer 的入站跟踪器处理过程中,在对交易进行投票之前,检查交易是否成功。
我们很自豪能够通过这一发现帮助确保 @zetablockchain 的安全。 当绝对需要安全时,Sherlock 是正确的选择。
2.52K