慢雾

Aztec Connect 漏洞分析:219 万美元被提取,ZK-Rollup 结算边界绕过致 L1/L2 状态分歧Article

Aztec Connect 漏洞分析:219 万美元被提取,ZK-Rollup 结算边界绕过致 L1/L2 状态分歧

Aztec ConnectnumRealTxsZK-Rollup

事件背景:一个已弃用合约的致命一击 2026年6月14日,以太坊主网上一个早已被官方弃用的合约突然被攻击者精准利用,一次性从资金池中抽走了约219万美元的资产。受害合约正是Aztec Connect的RollupProcessorV3代理(地址0xff1f2b4adb9df6fc8eafecdcbf96a2b351680455)。Aztec Connect作为曾经知名的ZK-Rollup隐私交易协议,早在2024年3月就已停止运营并弃用了大部分核心设施,但遗留的用户资产因合约的不可变性而长期滞留池中。这一次,攻击者没有攻击任何活跃的网络,而是直指这份沉睡的“遗产”,用一种极为巧妙的方式撕裂了L1与L2的状态一致性。 更令人震惊的是,整个攻击过程仅通过一笔原子交易完成,攻击者甚至用了一套精心编排的智能合约组合,把铸造虚增余额和提款套现一次性打包,让传统风控根本没有拦截的余地。本文将结合链上calldata与合约源码,全面还原此次攻击的技术细节,并深入探讨ZK-Rollup当中容易被忽视的结算边界问题。 攻击概览:一笔交易,七轮铸造,七轮提款 攻击交易哈希为0x074ec9317d8336db37e8c348fbdd7515573ff4088239c77ab429f522509aeeb1。攻击者EOA为0x0f18d8b44a740272f0be4d08338d2b165b7edd17,他部署了一个总控入口合约0x06f585f74e0da633ae813a0f23fb9900b61d0fcd,并配合三个中继合约来组装恶意calldata。整个攻击过程在单笔交易中执行了14次processRollup()调用,形成“前7次铸造+后7次提款”的两段式结构,由于都在同一原子交易内,即使后续部分失败,整个交易也会回滚,但攻击者完美地让所有操作一次性成功。 获利资产明细让人触目惊心:908.987 ETH、270,513.054 DAI、167.890 wstETH、16.570 yvWETH、4,873.857 yvDAI、9,273.734 LUSD和359.047 yvLUSD,全部属于RollupProcessor合约中未迁移的用户资金。值得注意的是,这些资产最终都停留在攻击者EOA中,截至案发一天后,尚未发生任何混币或转移行为,似乎攻击者在等待更安全的时机进行清洗。 漏洞根因:numRealTxs与被忽略的空槽 要理解这次攻击的根源,必须先从RollupProcessorV3如何处理calldata说起。该合约在接收rollup证明数据时,会解析出一个关键参数numRealTxs,它代表本次rollup中实际包含的用户交易数量。在合约源码中,numRealTxs由calldata偏移4516字节处直接读取,并且没有任何范围检查,完全由调用者任意指定。 Decoder.sol中的致命取整 在Decoder.sol汇编代码中,有这样一段逻辑: // 从calldata读取numTxs numTxs := and(calldataload(add(inPtr, NUM_REAL_TRANSACTIONS_OFFSET)), 0xffffffff) let numTxsPerRollup := div(rollupSize,...

Live Support