AztecConnect被盗219万美元资产分析:ZK-Rollup结算边界绕过致L1/L2状态分歧"

admin 2026-10-22 07:47:52 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image

Aztec Connect 被盗 219 万美元资产分析:ZK-Rollup 结算边界绕过致 L1/L2 状态分歧

原创

慢雾安全团队
慢雾安全团队

慢雾科技

2026年6月15日 18:30
中国香港

在小说阅读器读本章

去阅读

******## 背景

2026 年 6 月 14 日,已弃用的 Aztec Connect RollupProcessor 合约(0xff1f2b4adb9df6fc8eafecdcbf96a2b351680455)遭到利用。攻击者通过构造 numRealTxs 与 decoded\_slots 之间的边界缺口,在单笔原子交易中从 L1 资金池提取了约 219 万美元的资产。Aztec Connect 已于 2024 年 3 月弃用,但该不可变合约因持有遗留用户资产而持续暴露风险。本文从合约源码与链上 calldata 两个维度还原本次攻击的完整技术细节。

攻击概览**

*##*

**| | |
| --- | --- |
| 字段 | 详情 |
| 攻击类型 | ZK-Rollup L1/L2 状态分歧(numRealTxs 边界绕过,逻辑错误) |
| 受害合约 | 0xff1f2b4adb9df6fc8eafecdcbf96a2b351680455(RollupProcessorV3 代理);逻辑实现 0x7d657ddcf7e2a5fd118dc8a6ddc3dc308adc2728 |
| 攻击者 EOA | 0x0f18d8b44a740272f0be4d08338d2b165b7edd17 |
| 攻击合约 | 0x06f585f74e0da633ae813a0f23fb9900b61d0fcd(总控入口),另有 3 个中继合约 0xe810f602..0bce / 0xd109..e0f8 / 0x276e..f6ec |
| 获利金额 | 约 219 万美元 |
| 所在链 | Ethereum 主网 |
| 交易数量 | 单笔原子交易(0x074ec9317d8336db37e8c348fbdd7515573ff4088239c77ab429f522509aeeb1) |
| 获利资产明细 | 908.987 ETH + 270,513.054 DAI + 167.890 wstETH + 16.570 yvWETH + 4,873.857 yvDAI + 9,273.734 LUSD + 359.047 yvLUSD |

漏洞根因

RollupProcessorV3 在处理 rollup 结算时,L1 结算循环的遍历范围与ZK 公开输入哈希的承诺范围之间存在结构性缺口。攻击者利用这一缺口,使 31/32 个公开输入槽的内容被 ZK 证明承诺进 L2 状态根,却不经过 L1 合约层的任何结算校验。

Decoder.sol:numRealTxs 完全由攻击者控制**

**###

numRealTxs 从 calldata 偏移 4516 处读取,且没有任何 on-chain 约束:

// Decoder.sol(汇编内联)numTxs := and(calldataload(add(inPtr, NUM_REAL_TRANSACTIONS_OFFSET)), 0xffffffff)// ⚠️ numTxs 完全由攻击者控制,没有任何范围检查
let numTxsPerRollup := div(rollupSize, numInnerRollups)let numFilledBlocks := div(numTxs, numTxsPerRollup)numFilledBlocks := add(numFilledBlocks,    iszero(eq(mul(numFilledBlocks, numTxsPerRollup), numTxs)))// ⚠️ decoded_slots 向上取整到 numTxsPerRollup 的整数倍// 当 numTxs=1, numTxsPerRollup=32 时,decoded_slots=32,产生 31 个 gap 槽decodedTransactionDataSize := mul(mul(numFilledBlocks, numTxsPerRollup), TX_PUBLIC_INPUT_LENGTH)

decoded\_slots 向上取整至 numTxsPerRollup 的倍数,这是 SHA256 预编译的数据布局要求。但这一取整操作在 numRealTxs 与 decoded\_slots 之间制造了一个攻击者可以自由填充的 gap 区域。

RollupProcessorV3.sol:结算循环仅覆盖 numRealTxs 个槽**

**###

// RollupProcessorV3.sol — processDepositsAndWithdrawals()end := add(proofDataPtr, mul(_numTxs, TX_PUBLIC_INPUT_LENGTH));// ⚠️ 循环上界 end 仅为 numRealTxs 个槽,gap 槽 [numTxs, decoded_slots) 被完全跳过 while (proofDataPtr < end) {    ...    if (proofId == 1) {        // ⚠️ 存款扣减:仅对 L1 可见槽执行        decreasePendingDepositBalance(assetId, publicOwner, publicValue);    }    if (proofId == 2) {        withdraw(publicValue, publicOwner, assetId);    }    unchecked { proofDataPtr += TX_PUBLIC_INPUT_LENGTH; }}// ⚠️ 循环结束后,31 个 gap 槽无任何 L1 层面检查,其 publicValue 可为任意值**

*###*

*### 安全假设的断裂*

**###

正常流程的安全假设是:每个公开输入槽要么经过 L1 合约层校验(存款时扣减 pendingDepositBalance),要么被 ZK 电路约束 publicValue == 0。但在本漏洞场景中:

  1. SHA256 预编译覆盖全部 32 个槽(实测输入 8192 字节 = 32 × 256B),gap 槽的内容已被 ZK 证明承诺。
  2. L1 结算循环仅遍历前 1 个槽,gap 槽 [2..32] 不受任何 L1 层面校验。
  3. ZK 电路对 gap 槽 publicValue 的约束(应为 0)被攻击者绕过或未施加。

三条防线互相依赖,但没有一条能够独立为 gap 槽提供安全保障——当 ZK 电路约束缺失时,L1 合约层同样无法察觉。

双路径分歧模型**

**###

同一份 calldata 被两条路径以不同上界消费:

两条路径对\"哪些槽算数\"的认知不一致(ZK 认 32 个、L1 只认 1 个),正是凭空铸造的根源。

攻击流程**

**##

攻击交易 0x074ec931…aee1 共包含 14 次 processRollup() 调用,呈\"前 7 铸造 + 后 7 提款\"的两段式结构,全部在单笔原子交易内完成。

第一阶段:铸造 — 在 L2 凭空获得资产(Rollup #13277–13283,7 次)**

**###

  1. 攻击者 EOA 0x0f18d8b44a740272f0be4d08338d2b165b7edd17 调用总控入口合约 0x06f585f74e0da633ae813a0f23fb9900b61d0fcd,触发选择器 0x6f3ce701。
  2. 总控合约依次调度 3 个中继合约,每个中继合约硬编码了若干份恶意 rollup calldata。每份 calldata 的关键参数:
  • numRealTxs = 1,rollupSize = 1024,numInnerRollups = 32

  • 第 1 个槽(L1 可见):proofId = 0(noop),publicValue = 0

  • 第 2–32 个槽(31 个 gap 槽,L1 不可见):proofId = 1(存款),publicValue = N,publicOwner = 攻击者 L2 地址

  • 附带对应 ZK 证明(电路未约束 gap 槽 publicValue 为 0)

  1. 中继合约 A 依次调用 RollupProcessor.processRollup()(Rollup #13277–13281,5 次):
  • Verifier 验证 ZK 证明通过 — SHA256 承诺覆盖全部 32 槽
  • L1 结算循环 end = 1 × TX\_PUBLIC\_INPUT\_LENGTH = 1 槽,仅处理 noop
  • gap 槽 [2..32] 的伪造存款被 ZK 承诺进新 Merkle root → 攻击者 L2 余额获得 5 × 31N
  1. 中继合约 B 以同样方式处理 Rollup #13282–13283(2 次),攻击者 L2 余额再获 2 × 31N。至此,攻击者 L2 账户累计获得 7 × 31N 的无支撑充值,而 L1 资金池未减少一分钱。

第二阶段:提款 — 将 L2 虚增余额兑现为 L1 资产(Rollup #13284–13290,7 次)**

**###

攻击者以 7 次提款 rollup 将铸造阶段获得的全部 L2 余额兑换为 L1 资产:

  1. Rollup #13284(DAI):withdraw() → RollupProcessor 直接 transfer 270,513.054 DAI → 0x0f18…edd17
  2. Rollup #13285(wstETH):transfer 167.890 wstETH → 攻击者
  3. Rollup #13286(yvDAI):transfer 4,873.857 yvDAI → 攻击者
  4. Rollup #13287(yvWETH,中继合约 C 接管):transfer 16.570 yvWETH → 攻击者
  5. Rollup #13288(LUSD):transfer 9,273.734 LUSD → 攻击者
  6. Rollup #13289(yvLUSD):transfer 359.047 yvLUSD → 攻击者
  7. Rollup #13290(ETH,最后一笔):RollupProcessor 通过内部 CALL 转出 908.987 ETH → 攻击者。

单笔原子交易执行成功(gasUsed = 4,513,539),合约层面不可部分回滚。攻击者净获约 $2.19M,全部来自 RollupProcessor 的合法用户资产池。

资金追踪**

**##

根据链上取证追踪(截至 2026-06-15,案发约 1 天后),被盗资金的状态如下:

所有资产在单笔交易内从 RollupProcessor 经中间攻击合约 0x06f585…d0fcD 直接转入攻击者 EOA 0x0F18D8b44a740272f0be4d08338d2b165b7EdD17。中间合约未持有残余资金。

当前被盗资金 100% 原封不动停留在攻击者 EOA,尚未开始洗钱。

**

**## 总结

本次攻击的核心教训是:ZK-Rollup 合约的结算循环上界必须与 ZK 公开输入哈希的承诺范围严格对齐。在 L1 合约层的循环边界 numRealTxs 与 SHA256 承诺的 decoded\_slots 之间存在差距时,任何依赖 ZK 电路对 gap 槽施加约束的安全假设都可能被攻击者绕过——L1 必须对每一个被 ZK 证明承诺的公开输入槽进行独立校验,而不能将校验责任外包给电路层。

慢雾安全团队建议项目方在 Rollup 系统部署前进行完整的外部安全审计,重点关注 L1/L2 状态分界线上的逻辑一致性、calldata 解码的可信边界、以及 ZK 公开输入的 on-chain 二次验证。对于已弃用但持有遗留资产的合约,建议执行有序资产迁移或销毁以消除持续暴露的风险。

本文由 SlowMist 威胁情报团队结合 MistEye 威胁情报系统、MistTrack 追踪平台及 SlowMist Agent AI 驱动分析编写,有任何问题欢迎咨询反馈。******

往期回顾

威胁情报|从 Python 到 Bun:Shai-Hulud Hades 变种跨运行时攻击链分析

威胁情报|Red Hat Cloud Services npm 包供应链投毒

威胁情报|TrapDoor 分析:横跨生态的供应链凭据窃取行动

黑色五月连环劫:GitHub 被黑始末

威胁情报|Shai-Hulud 供应链投毒:云凭据窃取与自我扩散分析

慢雾导航

慢雾科技官网

https://www.slowmist.com/

慢雾区官网

https://slowmist.io/

慢雾 GitHub

https://github.com/slowmist

Telegram

https://t.me/slowmistteam

Twitter

https://twitter.com/@slowmist\_team

Medium

https://medium.com/@slowmist

知识星球

https://t.zsxq.com/Q3zNvvF


AztecConnect被盗219万美元资产分析:ZK-Rollup结算边界绕过致L1/L2状态分歧" 网络安全文章

AztecConnect被盗219万美元资产分析:ZK-Rollup结算边界绕过致L1/L2状态分歧"

2026年6月14日AztecConnectRollupProcessor合约遭黑客攻击,损失约219万美元。攻击者通过构造numRealTxs与decoded\\_slots间的边界缺口,使ZK证明承诺的31个公开输入槽绕过L1合约层校验,在L2凭空铸造资产后提现。漏洞根源在于L1结算循环范围与ZK承诺范围未严格对齐,暴露ZK-Rollup结算层设计缺陷。慢雾团队建议项目方加强L1/L2状态一致性审计并及时迁移弃用合约的遗留资产。
最新版Shiro反序列化漏洞综合利用工具ShiroAttack2v5.1.1|功能依旧强大!" 网络安全文章

最新版Shiro反序列化漏洞综合利用工具ShiroAttack2v5.1.1|功能依旧强大!"

ShiroAttack2v5.1.1是一款针对Shiro-550反序列化漏洞的GUI/CLI双模式利用工具,支持多版本CommonsBeanutils链、自动AES模式探测、内存马注入及多种回显方式。文档指出该漏洞长期存在源于默认密钥固化、密钥更换困难及低利用成本等现实因素。工具提供密钥替换、自定义请求头、JSON输出等功能,适用于渗透测试和漏洞验证场景。
AI+代码审计实战Net源码&审计+验证+报告全自动" 网络安全文章

AI+代码审计实战Net源码&审计+验证+报告全自动"

本文介绍了使用AI工具(如DeepSeek-V4Pro)实现.NET源码自动化代码审计的全流程,包括反编译、鉴权分析、漏洞审计验证及报告生成。文章通过实战案例展示了AI在提升代码审计效率方面的应用,同时指出AI只能放大现有技术能力而无法替代基础技能。文档后半部分为代码审计培训课程的广告内容,详细介绍了PHP、JAVA、.NET三语言的课程体系与收费标准。
ICEV1.0—综合渗透测试工具集" 网络安全文章

ICEV1.0—综合渗透测试工具集"

ICEV1.0是威零安全团队开发的Windows桌面端渗透测试工具箱,集成信息收集、武器库、工具箱、编码转换四大类18+模块,包括端口扫描、子域名挖掘、JWT破解、反弹Shell生成、社工字典生成等功能。项目基于Python开发,旨在降低渗透测试中的工具切换成本,适用于授权测试环境。文档提供了完整的安装步骤、模块详解及免责声明,强调仅限合法安全测试使用。
评论:0   参与:  0