在过去一周(2026/07/06 - 2026/07/12),共发现 3 起值得关注的安全事件,造成约 3629 万美元的损失。
| 日期 | 事件 | 类型 | 预计损失 |
|---|---|---|---|
| 2026/07/06 | Summer.fi | 配置错误 | ~$6.04M |
| 2026/07/06 | BonkDAO | 治理机制不当 | ~$21.2M |
| 2026/07/11 | Bonzo Lend | 签名验证不当 | ~$9.05M |
- Summer.fi:入选原因在于它揭示了在多层金库协议中,一个未完全下线的下游组件如何在顶层静默地破坏份额价格,突显了在受损仓位可被利用之前完成下线操作的关键重要性。
- Bonzo Lend:入选原因在于它展示了预言机层中 BLS 验证的细微缺陷如何完全绕过签名安全性,导致价格根数据被伪造,并对依赖受影响验证器的协议造成系统性风险。
Web3 最佳安全审计机构
在上线前验证设计、代码和业务逻辑
本周重点事件:Summer.fi
本事件被重点介绍,是因为它揭示了在多层金库协议中,一个未完全下线的下游组件如何在顶层静默地破坏份额价格。这一模式广泛适用于任何从嵌套或外部来源聚合价值、却未验证每个贡献者是否仍处于健康状态的系统。
2026 年 7 月 6 日,以太坊上的 Summer.fi FleetCommander 金库遭到攻击,损失约 604 万美元 [1][2]。根本原因在于:Summer.fi 的 FleetCommander 在计算 totalAssets() 时,仍将一个已设置存款上限(准备下线但尚未从活跃集中移除)的策略组件(称为 Ark)纳入计算。攻击者积累了大量过时、被高估的 vgUSDC 代币(该 Ark 仍将其定价接近面值),然后直接将其转入该 Ark 以抬高 FleetCommander 的份额价格,并以虚高价格赎回。
背景
Summer.fi 是一个基于金库嵌套架构构建的 DeFi 收益聚合器。用户将资产存入名为 FleetCommander 的 ERC-4626 父级金库,该金库通过一组名为 Arks 的策略适配器,将资金路由至各种底层借贷和收益协议。FleetCommander 的总资产由每个 Ark 自报价值聚合而来,用户可随时根据该聚合估值赎回其份额。
底层收益来源之一是 Morpho。FleetCommander 通过 Ark 将资金存入 Morpho Vault,并以其持有的金库份额来计算自身价值。当用户赎回 FleetCommander 份额时,若父级金库的现金缓冲不足,则会从底层金库逐层向上提取资金:
用户赎回 FleetCommander 份额
| (1) 销毁用户份额
v
FleetCommander
| (2) 优先从缓冲区支付;不足时从 Arks 提取
v
Ark
| (3) 为筹集现金,在底层金库中赎回自身份额
v
Morpho Vault
(4) 为支付赎回,从底层市场提取资金
每个 Ark 通过查询其在底层金库中的代币余额,再将这些份额转换为资产来计算其 totalAssets()。由于这些份额是标准的 ERC-20 代币,任何人都可以直接将额外份额转入 Ark,而无需经过 FleetCommander 的存款流程。
漏洞分析
受影响的 FleetCommander 分别为 LowerRisk USDC 金库(0x98C4...cF17)和 HigherRisk USDC 金库(0xE9cD...cB06)。被操纵的 Silo Varlamore Ark 地址为 0x61d7...76c2。
两个条件共同构成了可被利用的前提:
-
过时且被高估的资产。 2025 年 11 月 Stream Finance 崩溃 [3] 后,其收益代币
xUSD贬值超过 75%,持有以xUSD为背书仓位的 Silo "Varlamore USDC Growth" 金库基本无法恢复。然而,该金库的链上记账从未反映这一损失:即便底层USDC仍处于无法提取的状态,vgUSDC代币仍通过convertToAssets()持续报告接近面值的价格。 -
未完全移除的 Ark。 持有此受损敞口的 Ark 正在下线,其存款上限已被设为 0。然而,将上限归零仅阻止通过 FleetCommander 进行新的存款,并不会将该 Ark 从
totalAssets()的计算中移除。
Ark 通过调用 vault.balanceOf(address(this)) 再调用 vault.convertToAssets(shares) 来计算其 totalAssets()。由于这些份额是可转移的 ERC-20 代币,任何人都可以直接将更多过时、被高估的 vgUSDC 转入 Ark,在不铸造任何新份额、也不增加任何真实可提取流动性的情况下,虚增 Ark 的报告价值。这一虚增会向上传导至 FleetCommander 的份额价格。


攻击分析
以下分析基于交易 0x0db528...43da12。
-
步骤 1:在此前三个月内,攻击者通过多个钱包积累了约 190.8 亿枚
vgUSDC,并在攻击执行前将其合并至攻击合约中。 -
步骤 2:攻击者从 Morpho Blue 获取了 1,000,000
USDT的闪电贷,并嵌套了第二笔 65,419,171USDC的闪电贷以资助本次攻击。 -
步骤 3:攻击者对多个 Morpho V2 金库调用
forceDeallocate(),将 4,318,535USDC从 Morpho Blue 市场拉回至金库的闲置余额中。这确保了后续步骤中足够的流动资金可用于支付虚高价格下的赎回。

-
步骤 4:攻击者在 Uniswap V4 上用 20,000
USDT兑换了约 68,421 枚xUSD,再在 Balancer V3 上将xUSD兑换为约 4.7627 亿枚vgUSDC。以极低的实际成本积累了更多过时代币。 -
步骤 5:攻击者将 64,828,534
USDC存入 FleetCommander LVUSDC,获得 60,787,156 份份额。 -
步骤 6:攻击者直接将约 195.5 亿枚
vgUSDC份额转入vgUSDCArk。由于 Ark 的totalAssets()会计入其持有的全部份额,无论这些份额以何种方式到达,此举虚增了 Ark 的报告价值,并相应地虚增了 FleetCommander 的totalAssets()。

- 步骤 7:攻击者赎回 60,766,209 枚 FleetCommander 份额,获得 70,959,584
USDC,从虚高份额价格与原始存款之间的差额中获利。

- 步骤 8:在同一原子交易中,攻击者对 HigherRisk USDC FleetCommander 实施了类似的虚增操作。HigherRisk 部分使用的是捐入 HigherRisk Term Ark 的 Term 份额(而非
vgUSDC),但底层机制相同:通过捐赠虚增totalAssets(),再以虚高价格赎回。两个金库合计获利约 604 万美元。
总结
这是一次由操作失误而非代码漏洞导致的份额价格虚增攻击。受 Stream Finance 崩溃影响而受损的 Silo Ark 在下线过程中仍被纳入 FleetCommander 的 totalAssets() 计算 [2]。攻击者将以极低成本积累的过时、被高估的 vgUSDC 捐入该 Ark,虚增份额价格,并以高于存入金额的价格赎回,损害了其他存款人的利益。
将存款上限归零并不等同于下线一个 Ark。对于多层金库系统,totalAssets() 必须排除已退役的仓位,且持仓应以可实现价值而非过时链上报价来计价。任何正在下线的组件,应在其可被用作虚增载体之前,从聚合估值中彻底移除。
参考资料
本周更多事件
Bonzo Lend
2026 年 7 月 11 日,Hedera 上的借贷协议 Bonzo Lend 遭受约 905 万美元的损失 [1]。攻击者向该协议的第三方价格数据提供商 Supra 提交了一个针对 SAUCE 价格数据源的伪造预言机更新。预言机验证器接受了一个零签名证明,并将虚高的 SAUCE/WHBAR 价格写入链上。Bonzo Lend 随后读取了被操纵的数据源,允许攻击者以远超所质押 SAUCE 实际价值的金额借入资产。
背景
Bonzo Lend 是 Hedera 上的一个借贷协议。其市场记账依赖外部价格数据源,包括第三方预言机网络 Supra,用于 SAUCE 等生态系统资产的定价。Bonzo Lend 本身不对每个预言机委员会签名进行验证;它直接读取预言机链上数据源中已存储的最新值,并在计算抵押品价值和借款额度时使用该值。
Supra 的拉取式预言机更新路径在将数据写入存储之前,会对提交的根数据进行验证。在相关代码路径中,verifyOracleProofV2() 遍历提交的预言机数据,对尚未缓存在 merkleSet 中的根数据调用 requireRootVerified(),验证 Merkle 叶子节点,然后通过 packData() 写入更新的数据轮次。
if (merkleSet.contains(oracle.data[i].root)) {
continue;
}
requireRootVerified(oracle.data[i].root, oracle.data[i].sigs, oracle.data[i].committee_id);
if (!merkleSet.set(oracle.data[i].root)) {
revert RootIsZero();
}
数据源更新的安全性依赖于 requireRootVerified() 能够拒绝未经配置的预言机委员会真实签名的根数据。
漏洞分析
存在漏洞的合约为 Supra 预言机验证器(0.0.4323006)。
根本原因在于上游 Supra 预言机验证器中存在无效的 BLS 验证路径。攻击交易提交了委员会 ID 为 2、签名值为 [0, 0](即零值)的第 425 对(SAUCE/WHBAR)价格更新。
在正常的 BLS 验证流程中,验证器应在调用配对预编译之前,验证签名和公钥非零、位于曲线上且处于正确的子群中。而存在漏洞的验证器使用零签名点和零委员会公钥点构造了配对检验。Hedera 配对预编译返回了 true,这是因为单位点的配对积在数学上是成立的,而非因为存在真实的委员会签名。
验证器必须检查输入的有效性;预编译仅负责检验配对等式。由于在配对前未对零点进行拒绝检查,预言机接受了伪造的根数据,并允许被操纵的价格数据写入存储。
function requireHashVerified_V2(
bytes32 _message,
uint256[2] calldata _signature,
uint256 committee_id
) public view {
bool callSuccess;
bool checkSuccess;
(checkSuccess, callSuccess) = BLS.verifySingle(
_signature,
committee_public_key[committee_id],
BLS.hashToPoint(domain, abi.encode(_message)),
blsPrecompileGasCost
);
if (!callSuccess) {
revert BLSInvalidPublicKeyorSignaturePoints();
}
if (!checkSuccess) {
revert BLSIncorrectInputMessaage();
}
}
攻击分析
以下分析基于交易 0.0.995584-1783731093-686041919。
-
步骤 1:攻击者将 250 枚
SAUCE存入 Bonzo Lend 作为抵押品。 -
步骤 2:攻击者向 Supra 的拉取式预言机合约提交了恶意预言机更新。该更新使用上述零值 BLS 签名证明,将
SAUCE价格设置为极度虚高的数值。

-
步骤 3:
verifyOracleProofV2()在requireRootVerified()成功返回后接受了提交的根数据。该函数验证了 Merkle 叶子节点数据,并针对更新的数据轮次调用了packData(),使被操纵的SAUCE/WHBAR值成为最新存储的预言机价格。 -
步骤 4:Bonzo Lend 从预言机读取最新的
SAUCE价格。由于存储的数据源价格已被虚高,协议将攻击者 250 枚SAUCE的抵押品计算为远超其市场价值的金额。 -
步骤 5:攻击者凭借虚高的抵押品价值,借入了约 660 万枚
USDC和 3450 万枚WHBAR。异常价格持续有效,直至后续合法的预言机更新将SAUCE恢复至正常范围。
总结
本次事件是预言机验证失败,而非借贷池记账漏洞。攻击者无需操纵 SAUCE 市场,也无需绕过 Bonzo Lend 内部的抵押品检查。伪造的价格被上游 Supra 预言机验证器接受,写入数据源后,Bonzo Lend 通过正常的价格读取路径消费了该数据。
使用外部数据源的协议,继承了整个预言机验证路径的安全假设。对于基于 BLS 的预言机更新,零点必须在调用配对预编译之前被拒绝。密码学层面的输入验证不是可选项;配对等式的数学成立性并不意味着底层签名的真实性。
参考资料
- [1] Bonzo Finance 事件报告



