返回部落格

損失約8800萬美元:COLDCARD與LULA漏洞事件 | BlockSec Weekly

Code Auditing
2026年8月5日
閱讀約 12 分鐘
核心要點
  • 本報告收錄了2個值得關注的安全事件,合計造成比特幣和BNB Chain上約8800萬美元的損失。單一硬體錢包熵值故障(COLDCARD)造成了超過99%的總損失,這提醒我們:錢包固件中一個看似無害的建置配置錯誤,就足以破壞資金安全所依賴的熵值。

  • 這兩個事件揭示了不同的漏洞模式:一是錢包固件中有缺陷的熵值生成(COLDCARD),其中種子創建在未察覺的情況下退回使用確定性軟體偽隨機數生成器(PRNG),而非硬體隨機數生成器(RNG);二是BNB Chain代幣(LULA)中的業務邏輯缺陷,攻擊者可利用可觸及的路徑觸發具特權的recycle()函數,讓Rental合約將LULA從PancakeSwap V2交易對中轉出,並將其儲備重新同步至被操縱後的餘額。

  • COLDCARD的漏洞於2021年隨產品發布,但直到2026年7月下旬才被大規模利用,受影響的錢包在7月30日開始的一系列鏈上攻擊波次中被清空。根本故障在於固件從未驗證其種子生成API是否確實觸及了預期的硬體RNG:建置防護僅檢查配置巨集是否存在,而未檢查其數值。用於加密熵值的建置防護必須檢查巨集數值並在失敗時採取封閉式防護(fail closed),而鏈下簽名與金鑰生成元件同樣需要進行同等嚴謹的安全審查。

在過去一週(2026/07/27 - 2026/08/02),以下 2 起重大安全事件備受關注,合計損失約 8,800 萬美元。

日期 事件 類型 估計損失
2026/07/29 LULA 業務邏輯缺陷 ~57.8 萬美元
2026/07/30 COLDCARD 錯誤的熵生成 ~1,370 BTC (~8,800 萬美元)*

* COLDCARD 的損失因確認方式而異:上表所示的 ~1,370 BTC (~8,800 萬美元) 是可公開驗證的鏈上最低金額(coldcardwatch.com);私下渠道的核對結果(Galaxy Research,根據與 73 名受害者的通信)顯示更高,約為 1,596 BTC,若計入疑似但尚未確認的資金轉出,最高可達約 2,055 BTC (~1.3 億美元)。

選取原因

  • LULA:一個可移動 AMM 交易對餘額並強制儲備重新同步的特權代幣函數,透過價格操縱變成了一種可重複利用的流動性抽取手段。
  • COLDCARD:錢包固件中的一個構建與整合錯誤,悄悄地將種子生成過程導向了一個確定性的軟體回退方案,破壞了熵的保證,並將種子恢復變成了一次離線搜尋,最終升級為大規模資金損失。

Best Security Auditor for Web3

Validate design, code, and business logic before launch

本週焦點:COLDCARD

我們選擇 COLDCARD 作為本週焦點,因為一個錢包熵漏洞造成了此期間內最大的損失。其根本原因——一個構建防護機制僅檢查某個配置宏是否存在,而非其是否被啟用——正是那種功能測試無法察覺的隱性整合錯誤,其教訓適用於任何依賴鏈下隨機性來保障鏈上安全的系統。

COLDCARD 是一款比特幣硬體錢包,其於 2021 年發布的固件使用確定性的軟體來源生成錢包種子,而非原本設計中的硬體隨機數生成器(RNG)[1][2]。這一缺陷直到 2026 年 7 月底才被大規模利用,受影響的錢包從 7 月 30 日開始在多波鏈上清空行動中被洗劫:公開確認的損失總計至少 1,370 BTC(以 8 月 5 日 64,099 美元的價格計算約為 8,800 萬美元)[3],而私下確認的報告顯示這一數字可能高達約 1,596 BTC [4]。根本原因是一個構建與配置錯誤,將種子生成導向了一個軟體回退方案,而非原本設計的硬體 RNG。對於受影響的裝置,這將種子恢復從一個密碼學上不可行的問題,轉變成了一次離線搜尋。

背景

COLDCARD 是一款比特幣硬體錢包。錢包的私鑰和地址都是從一個單一的秘密值——其種子——衍生而來,因此任何自託管錢包的安全性都取決於該種子的兩個屬性:其保密性,以及其生成時的不可預測性。硬體錢包的存在主要是為了保護第一項屬性;而此次事件則是第二項屬性的失效。BIP-39 種子短語是人類可讀的,但不可預測性要求背後的安全屬性,仍然是用於生成它的隨機字節的熵。如果這些字節可以被重現,種子就可以被重現。其直觀類比是一個保險箱,其密碼組合是通過擲骰子選定的:如果骰子被灌了鉛,那麼無論鎖有多堅固,只要有人知道其偏差,保險箱對其而言就等於敞開著。

對於錢包而言,「被灌鉛的骰子」意味著一個弱隨機數生成器。硬體錢包被期望從其安全微控制器上的硬體真隨機數生成器(TRNG)中提取種子熵,因為軟體偽隨機生成器(PRNG)是確定性的:只要知道其內部狀態和調用歷史,其輸出就可以被精確重現。如果生成器的輸出是可預測的,那麼其候選範圍可以被枚舉並與公開的錢包資料(如地址、xpub 或公鑰)進行匹配,這使得種子恢復從一個密碼學上不可行的問題,變成了一次離線搜尋。

COLDCARD 的固件暴露了兩個獨立的 RNG 介面。MicroPython 附帶了一個 STM32 平台層,該層暴露了錢包的加密庫所期望的全域 rng_get() 符號,而 COLDCARD 同時也維護著自己的板載硬體 RNG 封裝。這兩個介面都旨在提供硬體熵,而錢包的加密庫則通過一個在固件構建時解析的單一全域 RNG 符號來訪問其中一個介面。

漏洞分析

根本原因在於圍繞 MICROPY_HW_ENABLE_RNG 配置宏的一個構建與整合錯誤。COLDCARD 的生產板配置將此宏設置為 0,因為固件本意是使用其自己的板載硬體 RNG 封裝,而非 MicroPython 的硬體 RNG 實現。然而,錢包生成路徑已被遷移至 ngu.random.bytes(32),而加密庫的 STM32 路徑最終依賴於由 MicroPython 解析的全域 rng_get() 符號。

問題鏈條如下:

generate_seed()
  -> ngu.random.bytes(32)
  -> libngu CHIP_TRNG_32()
  -> rng_get()
  -> MicroPython STM32 RNG module
  -> Yasmarang software fallback because MICROPY_HW_ENABLE_RNG == 0

板配置停用了 MicroPython 的硬體 RNG 分支:

// We have our own version of this code.
#define MICROPY_HW_ENABLE_RNG (0)

加密庫仍將該宏視為硬體 RNG 存在的充分證明 [5],因為它在調用 rng_get() 之前僅檢查該宏是否存在:

extern uint32_t rng_get(void);
#define CHIP_TRNG_32() rng_get()

#ifndef MICROPY_HW_ENABLE_RNG
#error "get a HW TRNG plz"
#endif

該防護機制忽略了危險的情況:一個被定義為 0 的宏仍然算是「已定義」,因此 #ifndef 檢查會通過,構建也會成功。由於 MicroPython 是根據該宏的值而非其是否存在來選擇其 RNG 實現,MICROPY_HW_ENABLE_RNG == 0 使得 rng_get() 被導向軟體回退分支,而非 COLDCARD 的板載封裝 [6]

#if MICROPY_HW_ENABLE_RNG
    // STM32 hardware RNG
#else
    // Yasmarang software fallback
#endif

其後果因裝置世代而異。對於 Mk2/Mk3 固件 v4.0.0-v4.1.9,Block 的分析 [7] 指出,ngu.random 沒有加入任何密碼學熵,因此一旦回退狀態和調用歷史為人所知,錢包生成過程就可能變成確定性的(Coinkite 的公告 [2] 對 Mk2/Mk3 範圍的界定略窄,為 v4.0.1-v4.1.9)。對於 Mk4/Q/Mk5,安全元件的材料經過了哈希處理,但僅有四個字節被傳入 ngu.random.reseed(),這將安全重新播種限制為單一的 32 位狀態字,其有效搜尋空間遠小於用戶所期望的錢包熵。對最終 32 個隨機字節進行哈希處理並不能增加結果的熵;它只是對一個已然有限的候選集進行了變換。

攻擊分析

與智能合約漏洞不同,此次事件沒有單一的鏈上攻擊交易可供追蹤。這是一起先發生離線種子恢復、隨後進行鏈上資金轉出的事件。其前提條件是,受影響的用戶通過存在漏洞的 ngu.random.bytes(32) 路徑生成了他們的錢包種子,因此其種子材料依賴於一個可重現的軟體回退狀態,而非完整的硬體熵。第二個(推斷出的)前提條件是,受影響的錢包僅憑種子即可被推導出來:一個強且獨特的 BIP-39 密碼短語,會通過 PBKDF2 混入獨立的、用戶提供的熵,這是 RNG 漏洞從未觸及的部分,因此設有此類密碼短語的錢包不在單純的種子枚舉範圍之內,而此次資金轉出的規模表明,大多數受影響的用戶都未設置此類密碼短語。由此,恢復過程可能按以下三個步驟進行:

  1. 攻擊者利用裝置元資料、啟動時序、RTC/SysTick 假設以及可能的 RNG 調用歷史,來限制或枚舉候選 RNG 狀態。
  2. 針對每一個候選狀態,攻擊者衍生出候選錢包種子,並根據公開的錢包資料(如地址、xpub 或生成的公鑰)進行離線核對。
  3. 一旦某個候選項與真實錢包匹配,攻擊者便恢復了該種子、重建了私鑰,並轉走了相關的比特幣。

在鏈上,這起盜竊表現為從 7 月 30 日開始的一連串地址清空行動。獨立的鏈上啟發式追蹤 [3] 識別出多波資金轉出,總計至少從 4,580 個已驗證地址中轉出 1,370 BTC(以 8 月 5 日 64,099 美元的比特幣價格估值,約合 8,800 萬美元),這是一個經驗證的最低數字,而非總數。同時,一個私下渠道 [4] 通過與 73 名受害者的通信得到確認,將這一數字提高到約 1,596 BTC,若加上疑似但尚未確認的資金轉出,則趨近於 2,055 BTC(約合 1.3 億美元)。

結論

COLDCARD 事件是一次熵生成失效事件:這個對安全至關重要的種子生成 API,悄無聲息地解析到了一個確定性的軟體 PRNG 回退方案,而非原本設計的硬體 RNG,原因是一個構建防護機制僅檢查某配置宏是否存在,而非其是否被啟用。對於受影響的裝置,這將種子恢復從一個密碼學上不可行的問題,變成了一次離線搜尋,其結果是超過 1,370 BTC [3] 在多波行動中被轉移一空(私下渠道統計的數字約為 1,596 至 2,055 BTC [4])。

其核心的工程失誤在於,已發布的固件從未證明其最為關鍵的安全 API 實際上真的接入了原本設計的硬體 RNG。以下三種做法本可以發現這一問題:針對密碼學熵的構建防護機制,必須同時檢查宏的存在性和其值;熵回退機制必須採取失效即封閉(fail closed)的策略,而不是悄悄替換為軟體 PRNG;並且對最終固件映像的驗證,應涵蓋符號來源和端到端的熵流動情況,而不僅僅是代碼能否編譯通過。受影響的種子無法就地修復;其資金應轉移到使用已修復固件創建的新錢包中,而一個強且獨特的密碼短語可以在不修復該種子本身的情況下,降低即時風險 [2]

其失效模式值得特別強調:此類隨機性漏洞對功能測試而言是不可見的,因為每一個生成的種子單獨來看都是有效的。缺陷不在於任何單個輸出,而在於產生這些輸出的來源:由於該來源是可預測且可重現的,這些種子作為一個整體,會落入一個較小且可枚舉的範圍內。鏈下的密鑰生成組件值得獲得一流的安全審查。

參考資料

Get Started with Phalcon Explorer

Dive into Transactions to Act Wisely

Try now for free

本週更多事件

LULA

LULA 是 BNB Chain 上的一種 BEP-20 代幣,於 2026 年 7 月 29 日因其代幣合約中的一個業務邏輯缺陷損失了約 57.8 萬美元。一個攻擊者可觸及的路徑能夠觸發其特權函數 recycle(),使得 Rental 合約可以直接將 LULA 從 PancakeSwap V2 交易對中轉出,然後調用 sync(),將該交易對的儲備更新為被操縱後的餘額。攻擊者反覆觸發 recycle(),將該交易對的 LULA 儲備量縮減至接近於零,然後用少量 LULA 換回了幾乎全部的 USDT [1]

背景

LULA 是 BNB Chain 上的一種 BEP-20 代幣,具有基於租賃的團隊獎勵機制。符合資格的地址會在一個 Rental 合約中累積待領取的團隊獎勵,並通過 claimTeamReward() 進行領取。在領取流程中,Rental 合約會調用代幣的 recycle() 函數以獲取用於獎勵分發的 LULA。recycle() 並非任意用戶皆可調用;只有 Rental 合約被授權執行它。

claimTeamReward() 這一入口函數包含一個「僅限外部帳戶(EOA)」的檢查。它支援來自外部擁有帳戶的直接調用(其中 msg.sender == tx.origin),同時通過檢查委託代碼的前綴,也支援 EIP-7702 委託調用。

在自動化市場製造商(AMM)上,交易對是根據其儲存的儲備量對兌換進行定價的,而這些儲備量則通過該交易對的 sync() 函數進行更新,該函數會將儲備量設置為交易對目前的代幣餘額。儲備量通常會隨著兌換和流動性事件而變動,因此能夠反映真實的交易情況,但一個交易對的代幣餘額也可以通過直接轉帳來改變,而 sync() 會將當時存在的任何餘額(無論是否被操縱)複製到儲存的儲備量中。

漏洞分析

根本原因在於 LULA.recycle() 允許 Rental 合約直接將 LULA 從 PancakeSwap V2 交易對中轉出,然後調用 sync(),將該交易對的儲備更新為被操縱後的餘額 [1]

由於 sync() 會將儲備量設置為交易對中殘留的任何 LULA 餘額,此特權路徑可以在保持 USDT 一側不變的情況下,將該交易對的 LULA 儲備量任意降低。一旦 LULA 儲備量接近於零,該交易對就會把少量的 LULA 定價為幾乎相當於其全部的 USDT。

攻擊分析

以下分析基於交易 0xa219ab9...411d7c

  • 步驟一:攻擊者通過累積約 1.9705 億 USDT 為此次操縱提供資金。這些資金來自多個閃電貸和借貸來源,包括 Moolah/Lista、Aave V3、Venus、PancakeSwap V3、PancakeSwap Vault、Uniswap V4 PoolManager 以及 Uniswap V3。
  • 步驟二:攻擊者利用這約 1.9705 億 USDT,通過 PancakeSwap V2 路由器執行了一筆大額的 USDT -> LULA 兌換交易。這使得該交易對的 LULA 儲備量從約 800 萬 LULA 急劇減少至 24,022 LULA,同時 USDT 一側增加至約 1.9764 億 USDT。
  • 步驟三:攻擊者通過多個 EIP-7702 錢包調用了獎勵領取路徑。每個錢包都在 Rental 合約上調用了 claimTeamReward(),該調用進而觸發了 LULA.recycle(),將該交易對的 LULA 儲備量從 24,022 LULA 縮減至 0.004 LULA,而此時該交易對的 USDT 一側仍持有一個非常大的數額。
  • 步驟四:攻擊者通過路由器發起了最後一筆 PancakeSwap V2 兌換交易,僅向該交易對中送入了約 4,749 LULA,並從中取出了約 1.9764 億 USDT。
  • 步驟五:攻擊者償還了所有閃電貸,獲利約 57.8 萬美元。

結論

BNB Chain 上的 LULA 代幣因其代幣合約中的一個業務邏輯缺陷而遭到利用,損失約為 57.8 萬美元:一個攻擊者可觸及的路徑能夠觸發其特權函數 recycle(),使得 Rental 合約可以直接將 LULA 從 PancakeSwap V2 交易對中轉出,然後調用 sync(),將該交易對的儲備重新同步為被操縱後的餘額。攻擊者反覆觸發此操作以扭曲該交易對的價格,並用少量 LULA 換回了幾乎全部的 USDT。

一個代幣合約絕不應暴露出這樣一個特權路徑——它能夠移動 AMM 交易對的餘額並強制進行儲備重新同步——因為這樣做等於將價格控制權交給了任何能夠觸及該路徑的人。與 AMM 交易對整合的代幣,必須確保交易對的儲備量僅與真實的、由市場驅動的餘額變化相綁定,且任何為定價目的而讀取資金池儲備量的邏輯,都應將其視為可被操縱的,而非權威可信的。

參考資料

Get Started with Phalcon Security

Detect every threat, alert what matters, and block attacks.

Try now for free

關於 BlockSec

BlockSec 是一家全端區塊鏈安全與加密貨幣合規服務提供商。我們構建的產品與服務,可協助客戶進行代碼審計(涵蓋智能合約、區塊鏈及錢包)、即時攔截攻擊、分析安全事件、追蹤非法資金,並在協議和平台的整個生命週期中,滿足反洗錢/反恐融資(AML/CFT)方面的合規要求。

BlockSec 已在多個知名學術會議上發表了多篇區塊鏈安全論文,揭露了多起 DeFi 應用的零日攻擊,成功阻止了多起黑客攻擊,挽回了超過 2,000 萬美元的損失,並為數十億美元的加密貨幣資產提供了安全保障。

訂閱最新動態
損失約940萬美元:Injective、Aquifer遭利用攻擊 | BlockSec Weekly
Security Insights

損失約940萬美元:Injective、Aquifer遭利用攻擊 | BlockSec Weekly

過去一週(2026/08/31 - 2026/09/06),四起安全事件導致Injective、Solana、Ethereum和Flow EVM共損失約940萬美元。最大損失來自Injective漏洞,保險基金識別碼與二元期權市場識別碼衝突,結算路徑未比對其計價單位,導致約480萬美元流失;Solana上的Aquifer因交換路徑呼叫未經驗證的呼叫者提供的Token Program,損失約247萬美元;Ethereum上的Notional Finance V1因未檢查的`uint128`轉型將債務估值為零,損失約173萬美元。Flow EVM上的Ankr FLOW以約41萬美元收尾,因質押入口跳過暫停保護並依過時比率鑄幣。

超越智能合約:Web3中的網域與DNS營運安全
Security Insights

超越智能合約:Web3中的網域與DNS營運安全

合約審計止步於合約本身。我們針對 DefiLlama TVL 前 100 名背後的 100 個網域,執行了八項基於 SEAL 的 DNS 與註冊商檢查——共 800 項檢查,僅有一個網域全數通過。以下是大多數專案缺失的四項關鍵控制,以及它們在用戶入口點的重要性。

Web3攻擊面:滲透測試概覽

Web3攻擊面:滲透測試概覽

加密機構保留所有傳統攻擊面,並疊加資金處理鏈。本文為測試人員提供系統的實用抽象:四組件模型——應用、授權與簽名、區塊鏈互動、基礎設施,說明各組件職責、代表性實現及繼承的攻擊面。並將web3特有範疇分為五大攻擊面:生產與自動化運維、簽名意圖、審批與提款鏈、資金邏輯、鏈上交易與已部署合約。

Web3 最佳安全審計方

在上線之前驗證設計、程式碼與業務邏輯,對標業內最高安全標準。

BlockSec 審計