在過去一週(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 漏洞從未觸及的部分,因此設有此類密碼短語的錢包不在單純的種子枚舉範圍之內,而此次資金轉出的規模表明,大多數受影響的用戶都未設置此類密碼短語。由此,恢復過程可能按以下三個步驟進行:
- 攻擊者利用裝置元資料、啟動時序、RTC/SysTick 假設以及可能的 RNG 調用歷史,來限制或枚舉候選 RNG 狀態。
- 針對每一個候選狀態,攻擊者衍生出候選錢包種子,並根據公開的錢包資料(如地址、xpub 或生成的公鑰)進行離線核對。
- 一旦某個候選項與真實錢包匹配,攻擊者便恢復了該種子、重建了私鑰,並轉走了相關的比特幣。
在鏈上,這起盜竊表現為從 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]。
其失效模式值得特別強調:此類隨機性漏洞對功能測試而言是不可見的,因為每一個生成的種子單獨來看都是有效的。缺陷不在於任何單個輸出,而在於產生這些輸出的來源:由於該來源是可預測且可重現的,這些種子作為一個整體,會落入一個較小且可枚舉的範圍內。鏈下的密鑰生成組件值得獲得一流的安全審查。
參考資料
- [1] BlockSec Phalcon 就 COLDCARD 錢包資金轉出事件與種子生成隨機性薄弱之關聯發出的警報
- [2] Coinkite,熵問題技術深度剖析
- [3] coldcardwatch.com,Coldcard 資金轉出監測:鏈上被清空地址追蹤及其方法論
- [4] Galaxy Research,COLDCARD 攻擊損失估算(透過受害者報告確認約 1,596 BTC)
- [5] libngu,STM32 RNG 路徑引用了全域
rng_get(),且僅以#ifndef MICROPY_HW_ENABLE_RNG作為防護 - [6] Coldcard MicroPython,當硬體 RNG 被停用時,
rng_get()會回退至 Yasmarang - [7] Block Engineering,COLDCARD 固件中可預測的 RNG 回退方案與 32 位重新播種問題
本週更多事件
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 交易對整合的代幣,必須確保交易對的儲備量僅與真實的、由市場驅動的餘額變化相綁定,且任何為定價目的而讀取資金池儲備量的邏輯,都應將其視為可被操縱的,而非權威可信的。
參考資料
關於 BlockSec
BlockSec 是一家全端區塊鏈安全與加密貨幣合規服務提供商。我們構建的產品與服務,可協助客戶進行代碼審計(涵蓋智能合約、區塊鏈及錢包)、即時攔截攻擊、分析安全事件、追蹤非法資金,並在協議和平台的整個生命週期中,滿足反洗錢/反恐融資(AML/CFT)方面的合規要求。
BlockSec 已在多個知名學術會議上發表了多篇區塊鏈安全論文,揭露了多起 DeFi 應用的零日攻擊,成功阻止了多起黑客攻擊,挽回了超過 2,000 萬美元的損失,並為數十億美元的加密貨幣資產提供了安全保障。



