Back to Blog

每週 Web3 安全事件彙整 | 2026年4月13日 – 4月19日

Code Auditing
April 22, 2026
19 min read
Key Insights

在過去一週(2026/04/13 - 2026/04/19),BlockSec 偵測並分析了四起攻擊事件,預估總損失約 $310M。下表彙整了這些事件,各案例的詳細分析請見後續各小節。

日期 事件 類型 預估損失
2026/04/18 KelpDAO 基礎設施遭入侵 $290M
2026/04/16 Rhea Finance 記帳錯誤 $18.4M
2026/04/13 Hyperbridge 驗證不當 $242K
2026/04/13 Dango 驗證不當 $1.5M

Web3 最佳安全審計機構

在上線前驗證設計、程式碼與業務邏輯

本週焦點:KelpDAO

關於此事件漏洞利用後的連鎖效應、Arbitrum 鏈上恢復機制及更廣泛治理影響的專題報告,請參閱:去中心化困境:KelpDAO 危機中的連鎖風險與緊急權力

本事件因其新穎的基礎設施層攻擊向量(針對唯一 DVN 的 RPC 投毒,而非智能合約漏洞利用)、透過 DeFi 可組合性在多條鏈上產生的連鎖影響,以及 Arbitrum 強制狀態轉換以追回被盜資金所引發的治理問題,而被列為本週焦點。

2026 年 4 月 18 日,KelpDAO 的 rsETH LayerZero OFT 橋接遭受攻擊,損失約 $290M,此攻擊被歸咎於國家支持的行為者,極可能是朝鮮的拉撒路組織(Lazarus Group)[1]。根本原因在於 KelpDAO 採用了 1-of-1 DVN 配置,將跨鏈訊息驗證簡化為單一失效點。攻擊者毒化了 LayerZero Labs DVN 所信任的 RPC 基礎設施,迫使其對一則偽造的跨鏈訊息進行認證,導致 116,500 枚 rsETH 在以太坊上被釋放,而 Unichain 上並無任何對應的來源端事件。

背景

LayerZero 是一個建立在模組化安全架構上的跨鏈訊息協議。其核心是由去中心化驗證者網路(DVN)強制執行跨鏈訊息完整性,這些鏈下實體負責獨立驗證源鏈上發送的訊息是否確實發生,然後才在目標鏈上執行。在 LayerZero 上部署的每個應用程式都可以自行配置 DVN 設定,包括信任哪些 DVN、需要多少個,以及必須達到什麼共識門檻。這種模組化設計賦予應用程式完全控制其安全模型的能力,但同時也承擔全部責任:薄弱的配置無法由協議本身兜底。

KelpDAO 的 rsETH 以 OFT(全鏈同質化代幣)的形式部署在 LayerZero 上,橋接路由連接 Unichain(來源)和以太坊主網(目標)。OFT 標準允許代幣在來源鏈上銷毀並從目標鏈的鎖倉中釋放,跨鏈訊息是釋放的唯一授權。以太坊端的適配器(0x85d456...e98ef3)負責在有效的跨鏈訊息經過驗證並送達後,向接收者釋放 rsETH。關鍵在於,KelpDAO 以 1-of-1 DVN 配置設置此路由,指定 LayerZero Labs 為唯一驗證者。這意味著單一 DVN 的認證就足以授權任何代幣釋放,無需第二方意見。

為履行驗證職責,LayerZero Labs DVN 向多個 RPC 節點查詢,以確認來源鏈上確實發生了跨鏈發送事件。這些 RPC 節點包括自營基礎設施和外部提供商,DVN 在簽署認證前依賴其集體回應。此流程的完整性建立在大多數被查詢節點返回真實數據的假設之上。

漏洞分析

此漏洞是基礎設施與配置層面的系統性失敗,由三個相互疊加的弱點構成。

首先,KelpDAO 的 1-of-1 DVN 配置消除了驗證層的所有冗餘。LayerZero 建議的安全態勢明確要求採用具有獨立驗證者的多 DVN 設置,使任何單一 DVN 均無法單方面授權訊息。通過僅依賴 LayerZero Labs DVN,KelpDAO 確保了對該唯一驗證者的任何入侵都足以授權任意代幣釋放。

其次,DVN 的故障轉移機制將驗證查詢路由至仍然可達的任何 RPC 節點。此設計假設節點不可用是偶然而非蓄意的。然而,這創造了一個條件,使攻擊者無需入侵所有數據源:通過 DDoS 使健康節點離線,並讓已投毒節點作為唯一可達的替代方案,攻擊者即可完全控制 DVN 接收到的數據。

第三,替換 RPC 節點上的 op-geth 可執行文件需要對底層服務器的操作系統級訪問權限。確切的初始訪問向量未被披露,但入侵位於不同集群的兩個獨立節點可能表明,控制這些服務器訪問的方式存在共同弱點。

這三個條件共同構成了完整的攻擊鏈:第一個確保沒有獨立的 DVN 來交叉核對被認證的訊息,第二個確保攻擊者可以完全控制唯一 DVN 接收到的數據,第三個提供了使數據操縱成為可能的初始立足點。任何單一弱點都不足以單獨完成攻擊。若沒有 1-of-1 配置,查詢獨立基礎設施的第二個 DVN 就會拒絕偽造的訊息。若沒有故障轉移行為,健康節點就會以多數票否決已投毒的節點。若沒有服務器入侵,攻擊者就無法在一開始注入偽造數據。

攻擊分析

以下分析基於交易 0x1ae232...4222 及 LayerZero Labs 的官方事件聲明。

  • 步驟 1:攻擊者獲取了 LayerZero Labs DVN 所信任的特定 RPC 節點列表。此列表構成了高價值情報目標,因為知道確切節點使攻擊者能夠策劃精準打擊,而非廣泛的基礎設施攻擊。

  • 步驟 2:攻擊者獲得了兩個 RPC 節點的操作系統級寫入權限,並將運行中的 op-geth 二進制文件替換為惡意版本。這兩個節點被描述為運行在沒有直接連接的獨立集群上,這表明初始訪問向量涉及共同的上游依賴(例如,遭入侵的部署憑證、CI/CD 流水線,或對有權訪問兩者的操作員進行社會工程攻擊)。LayerZero Labs 未披露確切的初始訪問方法。此步驟是所有後續數據操縱的先決條件。

  • 步驟 3:惡意 op-geth 二進制文件實現了有針對性的回應邏輯:它僅向 DVN 的 IP 地址返回偽造的交易數據,同時向所有其他請求者(包括 LayerZero 自己的監控基礎設施、區塊瀏覽器和掃描服務)提供真實的區塊鏈狀態。這種選擇性投毒使攻擊對所有現有可觀測系統均不可見;從每個外部視角來看,來源鏈看起來一切正常。

  • 步驟 4:DVN 的內部共識需要已投毒節點和未受損 RPC 節點之間達成一致。為解決這一衝突,攻擊者在攻擊窗口期間(太平洋時間上午 10:20 至 11:40)對剩餘健康節點發動 DDoS 攻擊,觸發 DVN 的故障轉移邏輯,迫使其完全依賴已投毒的基礎設施。此步驟是必要的,因為健康節點否則會返回與偽造回應相矛盾的真實數據。

  • 步驟 5:在 DVN 現在僅接收攻擊者控制的數據後,一條偽造的 LayerZero 跨鏈訊息被呈現為有效。DVN 在以太坊目標端點認證了 nonce 308,而這個 nonce 在 Unichain 上沒有對應的出站事件(源端點仍然報告最大出站 nonce 為 307,這已得到確認)。

  • 步驟 6:以太坊端的 rsETH 適配器收到經過有效認證的訊息後,向攻擊者的接收地址(0x8b1b6c...0d3b)釋放了 116,500 枚 rsETH,該地址數小時前已通過 Tornado Cash 預先注入資金。被盜代幣立即分散至七個分支錢包,並通過 Aave 抵押倉位、直接 ETH 兌換和重新橋接至 Arbitrum 等方式變現,最終收益匯集至以太坊上的 0x5d3919...7ccc 及 Arbitrum 上對應的收款地址。

  • 步驟 7:惡意二進制文件在完成後執行了自毀程序,刪除自身及所有本地日誌和配置文件。這大大阻礙了事後取證恢復工作,並體現了攻擊者的高度操作複雜性。

  • 步驟 8:攻擊者隨後試圖利用相同路徑再次竊取 40,000 枚 rsETH(約 $95M),但在 KelpDAO 發現異常並暫停以太坊主網和 L2 上所有相關合約後被阻止 [2]。

更廣泛的影響

損害遠不止於最初的 $290M 橋接漏洞利用。攻擊者在多個市場向 Aave 存入了約 89,567 枚 rsETH(約 $221M),以 E-Mode 93% LTV 借出 WETH [4]。由於 Aave 無法區分合法橋接的 rsETH 與通過偽造訊息釋放的代幣,「被投毒」的抵押品被視為完全有效。由此產生的 WETH 儲備凍結蔓延至以太坊、Arbitrum、Base、Mantle 和 Linea,影響了完全沒有 rsETH 敞口的用戶。這種連鎖傳播——從單一橋接配置缺陷到多鏈借貸市場中斷——說明了 DeFi 可組合性如何放大單一失效點的影響範圍和成本。

事後同樣引發了關於去中心化運營現實的重要問題。LayerZero Labs 宣布,其 DVN 將不再為使用 1-of-1 配置的應用程式簽署訊息 [1],這意味著僅靠協議層面的去中心化無法彌補應用層面的配置弱點。

在鏈級層面,Arbitrum 安全委員會採取了緊急行動,凍結了攻擊者在 Arbitrum One 上持有的 30,766 枚 ETH。根據 BlockSec 的分析 [5],這是通過鏈級強制狀態轉換實現的:安全委員會臨時升級了以太坊收件箱合約,注入了一條模擬攻擊者地址的未簽名 L1 至 L2 訊息,並恢復了原始實現,整個過程無需持有者簽名 [3]。

此行動是依據治理規定的緊急權力合法行使,以透明方式並配合執法機構進行。然而,它也表明 L2 鏈在設計上保留了集中式干預能力:原則上,Arbitrum One 上的任何資產都可以被安全委員會通過相同機制移動。正如此事件在每個層面所展示的,系統的理論信任模型與其實際信任邊界之間的差距,正是最重大風險所在。

結論

此事件表明,橋接安全不能僅歸結為協議的正確性。LayerZero 協議本身按設計運作;漏洞完全存在於其上方的操作層。核心教訓是:鏈下驗證基礎設施是信任邊界的一部分,其安全態勢必須與它所保護的價值相匹配。

以下三種緩解措施中的任何一種都能單獨阻止此結果:

  • 多 DVN 配置:要求多個獨立 DVN 之間達成共識,將使單一 DVN 的入侵不足以授權訊息,無論該 DVN 被欺騙的程度如何。

  • 具備故障轉移感知的 RPC 選擇:在活躍驗證窗口期間,可達節點數量的突然下降應被視為潛在的攻擊信號,而非例行的可用性事件。DVN 實現應暫停或發出警報,而不是以減少的節點集繼續執行。

  • RPC 基礎設施加固:能夠替換生產環境 RPC 節點上的運行可執行文件,表明底層服務器的訪問控制不足。DVN 依賴於獲取源鏈基本真相的基礎設施,應受到與 DVN 簽名實例本身相同的安全邊界約束。

更廣泛地說,任何依賴鏈下認證的橋接或跨鏈協議都應審計不僅僅是智能合約層,還要審計從源鏈事件到目標鏈執行的完整數據流水線。當數億美元依賴於此時,RPC 基礎設施默認可信的假設已不再站得住腳。

參考資料

[1] LayerZero Labs,「KelpDAO 事件聲明」,2026 年 4 月 20 日。https://x.com/LayerZero_Core/status/2046081551574983137

[2] KelpDAO,「4 月 18 日事件:補充說明」,2026 年 4 月 21 日。https://x.com/KelpDAO/status/2046332070277091807

[3] Arbitrum,「安全委員會緊急行動」,2026 年 4 月 21 日。https://x.com/arbitrum/status/2046435443680346189

[4] LlamaRisk,「rsETH 事件報告」,2026 年 4 月 20 日。https://governance.aave.com/t/rseth-incident-report-april-20-2026/24580

[5] BlockSec,「Arbitrum 安全委員會凍結機制分析」,2026 年 4 月 21 日。https://x.com/Phalcon_xyz/status/2046467830498173088

立即使用 Phalcon Explorer

深入分析交易,明智決策

免費立即試用

本週其他事件


Rhea Finance

2026 年 4 月 16 日,Rhea Finance 旗下在 NEAR 上的借貸與保證金交易協議 Burrowland,因其保證金交易模組存在業務邏輯缺陷,遭受約 $18.4M 的損失。在開立槓桿倉位時,協議依賴 verify_token_out() 來驗證預期的兌換輸出,然後接受該倉位。然而,每當代幣與最終輸出代幣匹配時,此函數錯誤地累積了中間兌換步驟的 token_out 數量,未能考慮到這些中間數量隨後被重複用作 token_in 的事實。攻擊者部署了假代幣和假流動性池,然後構造了一條循環兌換路徑,虛增了被感知的輸出數量並通過了償債能力檢查,從協議中提取了約 $18.4M。

背景

Burrowland 是 NEAR 上的一個開源借貸與保證金交易協議。除標準的供給和借貸功能外,它還支持保證金交易,並引入了三個關鍵變量來表示用戶的槓桿倉位:token_c(抵押品)、token_d(債務資產)和 token_p(倉位資產)。

對於多頭倉位,用戶存入 token_c 作為抵押品,並以選擇的槓桿率(例如 5 倍)借入 token_d。借入的 token_d 隨後在 DEX 上兌換為 token_p,即用戶希望獲得敞口的資產。在正常情況下,收到的 token_p 價值約等於花費的 token_d 價值。協議代表用戶持有 token_p,同時記錄借入的 token_d 為債務。

對於空頭倉位,用戶同樣存入 token_c 並以槓桿借入 token_d(他們想做空的資產)。借入的 token_d 被兌換為另一種資產(token_p),有效地對 token_d 建立空頭敞口。同樣,在正常市場條件下,兌換預計會保值。

在倉位的整個生命週期中,token_p 一直由協議保管,用戶無法直接提取。倉位必須平倉才能實現盈虧,此時 token_p 被兌換回 token_d 以償還債務。

開立保證金倉位由 internal_margin_open_position() 處理,它設置倉位參數並將借款分發至 DEX。

在協議接受新倉位之前,它依次評估四項保護措施:is_min_amount_out_reasonable() 根據 Pyth 預言機隱含的兌換輸出交叉核對用戶聲明的 min_token_p_amount 以限制滑點,is_open_position_liquidatable() 驗證預期的倉位和抵押品價值是否高於清算線,is_open_position_forcecloseable() 驗證賬戶在賬面上是否尚未資不抵債,get_open_position_lr() 強制執行 token_d / token_c 價值不超過最大槓桿率。

所有四項檢查都使用 min_token_p_amount 作為倉位資產的價值,因為兌換尚未執行,沒有已實現的數量可用。因此,每個關卡的正確性都取決於 min_token_p_amount 被約束在 DEX 實際將交付的範圍內。這種約束正是 verify_token_out()(通過 RefV1TokenReceiverMessage::get_token_out() 實現)應該在用戶提交的兌換訊息上強制執行的。

漏洞分析

缺陷位於 verify_token_out() 內部。該函數選取最後一個兌換步驟的 token_out 作為最終輸出代幣,然後將每個產生相同代幣的兌換步驟的聲明 min_amount_out 相加,假設每個此類產出都對最終輸出有貢獻。這對真正的多路徑(分路由)兌換是正確的,但它不排除那些 token_out 立即作為下一步 token_in 被消耗的步驟。像 A->B->A->B 這樣的往返路徑會導致每個 ->B 步驟都被計入總和,即使其輸出在隨後的 B->A 步驟中被消耗,從未到達 Burrowland。verify_token_out() 批准的累計 min_amount_out 不再代表 DEX 實際將返回的數量。

一旦 verify_token_out() 被繞過,虛增的 min_token_p_amount 在整個 internal_margin_open_position() 中被視為基本事實。每個本應阻止不安全開倉的償債能力關卡都基於一個虛構數字進行計算,因此倉位被接受,協議將借入的 token_d 連同循環兌換訊息一起分發至 DEX。

攻擊分析

以下分析基於交易 GcXEKm...fnFT

第一階段:部署假代幣和假流動性池

攻擊者部署了三個假代幣並創建了五個假流動性池。

  1. 假代幣 ID:

    1. Fake1: 31623e1d98275d2b0db4f50e102f6bf40877c1345e06e4ca6727f58c89564bb2

    2. Fake2: 6a28e3d3c7af1415ec22c6264013e1138bab00f85b8b6055d882d7d46afdf49b

    3. Fake3: e081e03daf58f5bb04cf95a03017e58449b76e704f1974771d7e3bd52835b6e5

  2. 假流動性池 ID:

    1. Zec-Fake1: 7509

    2. Fake1-Fake2: 7510

    3. USDC-Fake2: 7511

    4. Fake2-Fake3: 7512

    5. Fake3-USDC: 7513

第二階段:開立保證金倉位

  • 步驟 1:攻擊者使用 Burrowland 的保證金交易功能,以合法有價值的資產作為 token_c,以真實儲備資產作為 token_d 開立了槓桿倉位,並附上了一條兌換訊息,其操作列表是一條完全通過第一階段攻擊者控制池路由的往返路徑 A->B->A->B
  • 步驟 2:由於 verify_token_out() 將每個 token_out 與終端輸出匹配的步驟的 min_amount_out 相加,往返路徑使攻擊者能夠將聲明的 min_token_p_amount 虛增至任意值。

  • 步驟 3:虛增的 min_token_p_amount 通過了 internal_margin_open_position() 中每個開倉時的健康狀況檢查,因此倉位被接受,協議將 token_d 連同循環兌換訊息一起分發至 Ref-Finance。

  • 步驟 4:循環兌換僅返回極少量的 token_pon_open_trade_return() 在未進行任何重新檢查的情況下將其記入賬,導致倉位從創建之初就資不抵債。

  • 步驟 5:借入的 token_d 在路徑中的攻擊者控制池內結算;攻擊者通過 remove_liquidity() 將其提取。

  • 步驟 6:由於借款是有槓桿的,提取的 token_d 價值超過了存入的 token_c。差額是每個週期的淨利潤,無法收回的債務被強制平倉至 protocol_debts。攻擊者重複此操作,直到提取了約 $18.4M。

結論

此事件是由 Burrowland 保證金開倉路徑中的業務邏輯缺陷引起的。函數 RefV1TokenReceiverMessage::get_token_out() 在中間輸出與最終代幣匹配時錯誤地進行了聚合,假設這些數量將作為最終輸出保留。然而,循環兌換路徑打破了這一假設,因為這些代幣可以在路徑中被重複使用和消耗。因此,計算出的 min_token_p_amount 可以被人為虛增,導致所有後續的償債能力檢查依賴於不正確的值,並允許在不驗證實際接收數量的情況下基於虛構的健康狀態開立倉位。

對於生產環境的保證金交易合約,開發者應:

  • 將用戶聲明的 min_amount_out 視為未經驗證的輸入,只取最後一跳的 min_amount_out,或明確拒絕重新消耗之前已產生的 token_out 的兌換路徑(目標代幣不得有循環)。

  • 用相對於預言機隱含兌換輸出的下限和上限共同約束聲明的滑點,使攻擊者無法單方面虛增聲明值以繞過償債能力斷言。

立即使用 Phalcon Security

偵測每一個威脅,警示重要事項,阻止攻擊。

免費立即試用

Hyperbridge

2026 年 4 月 13 日,以太坊上的跨鏈訊息橋接 Hyperbridge 因 MMR(梅克爾山脈)證明驗證邏輯中缺少輸入驗證而遭受約 $242K 的損失。函數 MerkleMountainRange.VerifyProof() 未強制執行 leaf_index < leafCount,使攻擊者得以偽造跨鏈證明,並執行包括鑄造 1,000,000,000 枚 DOT 代幣在內的特權操作。

背景

Hyperbridge 為跨鏈訊息採用以太坊端的驗證器和分發器模型。在以太坊上,合約 HandlerV1 根據儲存的 overlayRoot 驗證提供的證明,若證明被接受,則將訊息分發至目標模組,例如合約 TokenGateway

合約 TokenGateway 是一個特權資產管理模組。除正常的資產橋接外,它還支持治理式操作,例如資產創建、取消注冊和管理員管理。對於實現為 ERC6160Ext20 的橋接資產,管理員可以通過調用函數 changeAdmin() 直接轉移鑄幣授權,新管理員隨後可以通過函數 mint() 鑄造任意供應量。

這意味著整個資產橋接的安全性取決於 HandlerV1 中證明驗證路徑的正確性。若偽造的訊息能夠通過驗證,下游模組將把攻擊者控制的有效載荷視為真實的跨鏈指令。

漏洞分析

核心問題位於合約 HandlerV10x6c84ed...6d64)的 MMR 證明驗證流程中。入口函數 handlePostRequests() 首先根據攻擊者提供的輸入構建 MmrLeaf(leaf.kIndex, leaf.index, commitment)。然後調用 MerkleMountainRange.VerifyProof() 執行證明驗證。

MerkleMountainRange.VerifyProof(root, request.proof.multiproof, leaves, request.proof.leafCount)

然而,VerifyProof() 僅檢查 root == CalculateRoot(proof, leaves, mmrSize),未驗證每個 leaf.index 是否在範圍內(即 leaf.index < leafCount)。通過選擇 leafCount = 1leaf_index = 1,攻擊者使 CalculateRoot() 跳過將偽造的請求承諾折疊到計算根中,直接返回峰值根。這打破了訊息到證明的綁定,允許任意有效載荷針對歷史 overlayRoot 通過驗證。

攻擊分析

以下分析基於交易 0x240aeb...1109 [1]。

  • 步驟 1:攻擊者 EOA 0xC513...F8E7 在同一交易中部署了輔助合約 0x518A...8f260x31a1...ca9AB

  • 步驟 2:輔助合約 0x31a1...ca9AB 通過 HandlerV1 中易受攻擊的驗證路徑提交了一個偽造請求。由於 VerifyProof() 未拒絕越界的 leaf_index,偽造的請求承諾被從根計算中省略,但證明仍然匹配了一個歷史 overlayRoot

  • 步驟 3:偽造的訊息被接受後,HandlerV1 將其分發至 TokenGateway,執行 ChangeAssetAdmin 操作。這將 DOT 代幣的管理員更改為攻擊者控制的輔助合約 0x31a1...ca9AB

  • 步驟 4:輔助合約鑄造了 1,000,000,000e18 枚 DOT 代幣。

  • 步驟 5:輔助合約通過 Odos Router V3 將新鑄造的 DOT 代幣兌換為 108.2 枚 ETH

  • 步驟 6:攻擊者將 108.2 枚 ETH 轉移至其 EOA 賬戶。

結論

此事件是由 Hyperbridge MMR 驗證邏輯中的不當證明驗證引起的。由於未強制執行 leaf_index < leafCount,攻擊者得以偽造一條其承諾從未真正包含在計算根中的訊息,卻仍能通過對歷史狀態根的驗證。緩解措施應在證明驗證前強制執行嚴格的邊界檢查,例如 leaf_index < leafCount

參考資料

[1] BlockSec,「Hyperbridge 攻擊分析」,2026 年 4 月 13 日。https://x.com/Phalcon_xyz/status/2043601549893738970


Dango

2026 年 4 月 13 日,基於 Cosmos AppChain 構建的永續合約 DEX Dango 因缺少符號檢查而遭受約 $1.5M 的損失。函數 replenish_insurance_fund() 使用 is_non_zero() 而非 is_positive() 驗證輸入數量,使攻擊者得以提供負的 UsdValue 並從保險基金中提取資金至其保證金倉位。

背景

Dango 是一個基於 Cosmos AppChain 構建的永續合約 DEX。用戶將 USDC 作為抵押品存入永續合約,並通過鏈上中央限價訂單簿(CLOB)對 BTCETHSOL 等資產開立槓桿多頭或空頭倉位。每個用戶的抵押品餘額在永續合約中以保證金賬戶形式追蹤。

為保護流動性提供者(LP)免受壞賬損失,協議維護了一個保險基金:一個保存在永續合約內的 USDC 儲備,用於彌補清算倉位的抵押品不足以全額償還其債務時的缺口。若沒有它,此類缺口將直接由 LP 社會化承擔。任何用戶都可以從其永續賬戶向保險基金貢獻保證金。

漏洞分析

根本原因在於合約 0x90bc84...bea4f 的函數 replenish_insurance_fund() 未能拒絕負數輸入數量。該函數有兩個守衛,但均未阻止負的 amount

  1. ensure!(amount.is_non_zero()) 檢查數量是否不為零,但未檢查它是否為正數。
  2. ensure!(user_state.margin >= amount) 檢查用戶是否有足夠的保證金,但任何正數保證金都滿足 >= 負數

通過兩個守衛後,函數執行 user_state.margin.checked_sub_assign(amount)state.insurance_fund.checked_add_assign(amount)。當 amount 為負數時,減去它會增加用戶的保證金,加上它會減少保險基金,完全逆轉了預期的資金流向。

攻擊分析

交易:

交易編號 操作 交易哈希
1 漏洞利用 5505BB...A901
2 橋接 95AD18...00B6
3 橋接 95B5D7...D9AD
4 橋接 2DA851...90E6
5 橋接 4B141D...1CD4
6 橋接 FD1BFF...2E4E
7 橋接 641015...E126
8 橋接 9B951D...2858

第一階段:

在交易 1 中,攻擊者執行了以下步驟以從 Dango 的保險基金中提取資產:

  • 步驟 1:攻擊者存入 1e6 USDC 開立了一個保證金倉位。這是調用 replenish_insurance_fund() 的先決條件。
  • 步驟 2:攻擊者以負的 amount(即 -1500000)調用 replenish_insurance_fund()。由於驗證不當,負的 amount 被接受,從保險基金中提取資產至攻擊者的保證金倉位。

  • 步驟 3:攻擊者從保證金倉位提取了所有資產,獲得了 $1,500,000 的 USDC

第二階段:

在交易 2-8 中,攻擊者調用 transfer_remote() 將被盜資產橋接至以太坊。最終,$410,000 的 USDC 被橋接至以太坊。

結論

此攻擊的本質是一個在無符號上下文中使用的有符號整數類型,卻沒有符號守衛。UsdValue 類型在設計上是有符號的(永續合約的盈虧可以為負),但保險基金捐贈路徑僅對正數貢獻有意義。使用 is_non_zero() 而非 is_positive() 留下了一個一詞之差的漏洞,允許任何調用者翻轉資金流向,從保險基金中提取 USDC 至自己的保證金。攻擊者在單筆交易中(存入 $1,提取 $1.5M,取款 $1,500,001)執行了整個攻擊,然後緩慢地將資金橋接出去。橋接速率限制是唯一限制損失的機制:若沒有它,全部約 $1.5M 將被無可挽回地橋接至以太坊。


關於 BlockSec

BlockSec 是一家全棧區塊鏈安全與加密合規提供商。我們構建產品和服務,幫助客戶在協議和平台的整個生命週期中執行代碼審計(包括智能合約、區塊鏈和錢包)、實時攔截攻擊、分析事件、追蹤非法資金,以及履行反洗錢/反恐融資義務。

BlockSec 在頂級會議上發表了多篇區塊鏈安全論文,報告了多起 DeFi 應用的零日攻擊,阻止了多起黑客攻擊以救回超過 2000 萬美元,並保護了數十億美元的加密貨幣。

Sign up for the latest updates

Best Security Auditor for Web3

Validate design, code, and business logic before launch. Aligned with the highest industry security standards.

BlockSec Audit