在過去一週(2026/07/06 - 2026/07/12),共識別出 3 起重大安全事件,造成約 $36.29M 的損失。
| 日期 | 事件 | 類型 | 預估損失 |
|---|---|---|---|
| 2026/07/06 | Summer.fi | 配置錯誤 | ~$6.04M |
| 2026/07/06 | BonkDAO | 治理機制不當 | ~$21.2M |
| 2026/07/11 | Bonzo Lend | 簽名驗證不當 | ~$9.05M |
- Summer.fi:被選為重點案例,因為它說明了在多層 vault 協議中,一個未完全下線的下游組件如何在頂層悄然破壞份額價格,突顯了在受損倉位被利用之前完成退役操作的重要性。
- Bonzo Lend:被選為重點案例,因為它展示了預言機層中 BLS 驗證的細微缺陷如何完全繞過簽名安全性,導致偽造價格根值,並對依賴受影響驗證器的協議造成系統性風險。
Web3 最佳安全審計機構
在上線前驗證設計、程式碼與業務邏輯
本週精選:Summer.fi
本事件被選為精選案例,因為它說明了在多層 vault 協議中,一個未完全下線的下游組件如何在頂層悄然破壞份額價格。此模式廣泛適用於任何從巢狀或外部來源彙總數值、卻未驗證每個貢獻者是否仍正常運作的系統。
2026 年 7 月 6 日,Summer.fi 在以太坊上的 FleetCommander vault 遭到攻擊,損失約 $6.04M [1][2]。根本原因在於 Summer.fi 的 FleetCommander 在計算 totalAssets() 時,仍將一個已設定存款上限(即將下線)但尚未從活躍集合中移除的策略組件(稱為 Ark)納入計算。攻擊者積累了大量陳舊且被高估的 vgUSDC 代幣——該 Ark 仍將其定價接近面值——然後直接將其轉入 Ark,以抬高 FleetCommander 的份額價格,再以膨脹後的價格贖回。
背景
Summer.fi 是一個基於 vault-of-vaults 架構構建的 DeFi 收益聚合器。用戶將資產存入名為 FleetCommander 的 ERC-4626 父 vault,後者透過一組稱為 Arks 的策略適配器,將資金路由至各種底層借貸和收益協議。FleetCommander 的總資產由每個 Ark 的自報價值彙總而成,用戶可隨時根據此彙總估值贖回其份額。
底層收益來源之一是 Morpho。FleetCommander 透過 Ark 將資金存入 Morpho Vault,並以其持有的 vault 份額來計算自身價值。當用戶贖回 FleetCommander 份額時,若父 vault 的現金緩衝不足,則會從底層 vault 逐層向上提取資金:
用戶贖回 FleetCommander 份額
| (1) 銷毀用戶的份額
v
FleetCommander
| (2) 優先從緩衝中支付;然後從 Arks 提取
v
Ark
| (3) 為籌集現金,在底層 vault 中贖回自己的份額
v
Morpho Vault
(4) 為支付款項,從底層市場提款
每個 Ark 透過查詢自身在底層 vault 中的代幣餘額,再將這些份額轉換為資產,來計算其 totalAssets()。由於這些份額是標準 ERC-20 代幣,任何人都可以直接將額外份額轉入 Ark,而無需經過 FleetCommander 的存款流程。
漏洞分析
受影響的 FleetCommander 分別為 LowerRisk USDC vault(0x98C4...cF17)和 HigherRisk USDC vault(0xE9cD...cB06)。被操縱的 Silo Varlamore Ark 為 0x61d7...76c2。
兩個條件為攻擊創造了前提:
-
陳舊且被高估的資產。 2025 年 11 月 Stream Finance 崩潰 [3] 後,其收益代幣
xUSD價值下跌超過 75%,持有以xUSD為抵押品倉位的 Silo「Varlamore USDC Growth」vault 因此幾乎無法恢復。然而,該 vault 的鏈上帳務從未反映此損失:vgUSDC代幣透過convertToAssets()持續以接近面值的價格報告,儘管底層USDC已陷入困境。 -
部分移除的 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 vault 調用
forceDeallocate(),將 4,318,535USDC從 Morpho Blue 市場拉回至 vault 的閒置餘額。這確保了在後續步驟中有足夠的流動資本來支付膨脹後的贖回。

-
步驟 4:攻擊者在 Uniswap V4 上用 20,000
USDT換取約 68,421xUSD,再在 Balancer V3 上將該xUSD兌換為約 4.7627 億枚vgUSDC。此舉以極低的實際成本積累了額外的陳舊代幣。 -
步驟 5:攻擊者向 FleetCommander LVUSDC 存入 64,828,534
USDC,並獲得 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(),再以膨脹後的價格贖回。兩個 vault 的合計獲利約為 $6.04M。
結論
這是一起由操作失誤而非程式碼漏洞引發的份額價格膨脹攻擊。因 Stream Finance 崩潰而受損的 Silo Ark 在下線過程中仍被計入 FleetCommander 的 totalAssets() [2]。攻擊者將低成本積累的陳舊、被高估的 vgUSDC 捐入此 Ark,膨脹份額價格,並以其他存款人為代價,贖回了超過存入金額的資產。
將存款上限歸零並不等同於下線 Ark。對於多層 vault 系統,totalAssets() 必須排除已退役的倉位,且持倉應以可實現價值而非陳舊的鏈上報價進行定價。任何正在下線的組件,在其可能成為膨脹向量之前,應完全從彙總估值中移除。
參考資料
本週更多事件
Bonzo Lend
2026 年 7 月 11 日,Hedera 上的借貸協議 Bonzo Lend 遭受約 $9.05M 的損失 [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 驗證路徑。攻擊交易提交了一個針對交易對 425(SAUCE/WHBAR)的價格更新,委員會 ID 為 2,簽名值為歸零的 [0, 0]。
對於正常的 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:攻擊者向 Bonzo Lend 存入 250
SAUCE作為抵押品。 -
步驟 2:攻擊者向 Supra 的拉取式預言機合約提交惡意預言機更新。該更新使用上述歸零的 BLS 簽名證明,將
SAUCE價格設定為極度膨脹的值。

-
步驟 3:
verifyOracleProofV2()在requireRootVerified()成功返回後接受了提交的根值。該函數驗證了 Merkle 葉節點數據,並為較新的饋送輪次調用了packData(),導致被操縱的SAUCE/WHBAR值成為最新儲存的預言機值。 -
步驟 4:Bonzo Lend 從預言機讀取最新的
SAUCE價格。由於儲存的饋送值已被膨脹,協議將攻擊者的 250SAUCE抵押品計算為遠超其市場價值的金額。 -
步驟 5:攻擊者以膨脹的抵押品價值借出了約 660 萬
USDC和 3450 萬WHBAR。異常價格持續存在,直到後來一次合法的預言機更新將SAUCE恢復至正常範圍。
結論
此事件是一起預言機驗證失敗事件,而非借貸池帳務漏洞。攻擊者無需操縱 SAUCE 市場或繞過 Bonzo Lend 的內部抵押品檢查。偽造的價格被上游 Supra 預言機驗證器接受,寫入饋送,並透過 Bonzo Lend 的正常價格讀取路徑被消費。
使用外部饋送的協議繼承了整個預言機驗證路徑的安全假設。對於基於 BLS 的預言機更新,必須在調用配對預編譯之前拒絕零點。密碼學層面的輸入驗證並非可選項;配對方程式的數學有效性並不意味著底層簽名的真實性。
參考資料
- [1] Bonzo Finance 事件報告



