作者:KEYHUNTER
辛格頓奔騰
比特幣軟體中與secp256k1單例上下文的多執行緒初始化錯誤相關的加密漏洞是分散式數位資產生態系統中最危險的設計缺陷之一。如本文所示,該漏洞允許攻擊者利用競爭條件在產生數位簽章時重複使用隨機數(nonce)。這使得攻擊者可以透過分析多個具有相同或相關隨機數的簽章來攻擊私鑰,最終導致錢包完全被攻破、資產失控以及比特幣金融基礎設施信任的喪失。 block -chain24+3
該攻擊在科學上被歸類為“基於單例上下文競爭條件的 ECDSA Nonce 重用攻擊”,其係統標識為 CWE-543 和 CVE-2023-39910。此類漏洞清楚地表明,即使在處理秘密參數時出現微小的錯誤,也可能對整個生態系統造成災難性後果。
爭奪私鑰的關鍵戰役:單例上下文漏洞如何威脅比特幣的加密安全並為全面攻擊數位資產打開大門
Singleton Stampede:一場因一個名字而為人銘記的針對 Libbitcoin 的攻擊
“當兩條線索在狹窄的單行道中相遇時,私鑰就會遺落在地板上。”
攻擊場景
想像一個礦池,其中多個工作執行緒並行簽署交易。每個工作執行緒透過輸入程式碼 ec_context_sign::context(),同時「打開」通往全域靜態 secp256k1 上下文的「大門」。如果沒有同步,這扇門不夠寬:兩個執行緒可能會建立上下文的不同實例,然後意外地「混淆」它們的內部緩衝區。 bluevps +1
- 上下文競爭: 兩個執行緒幾乎同時執行第一次呼叫
context();每個執行緒都獲得各自獨立的非隨機上下文。 文件 - 分裂狀態: 一個執行緒已經開始計算簽章並將秘密 nonce 寫入上下文
k,第二個執行緒仍在設定結構。 - 動態調整: 由於出版順序不確定,一個變數
context可能指向不同的實例。 dhiwise +1 - 透過重複的 k 值洩漏: 某些計算是在「外部」上下文中執行的,演算法意外地
k對不同的私鑰重複使用了相同的計算。結果是一個關於k和 的 二元線性方程組d,這使得私鑰可以立即恢復。 - 級聯效應: 攻擊不斷重複,直到池子暴露所有工作者的密鑰;攻擊者簽署自己的付款並提取資金。
最低保護處方
context使用std::call_once類似機制 保護初始化 。 dhiwisesecp256k1_context_randomize()在每個線程創建上下文後立即調用。 文件- 在密碼學中完全避免使用全域靜態上下文——透過流顯式地傳遞它們。
否則,Singleton Stampede 甚至能夠摧毀最大的礦池。
研究論文:關鍵密碼學漏洞「單例情境中的競爭條件」及其對比特幣安全的影響
本文探討了一個關鍵漏洞,該漏洞源自於多執行緒環境下 secp256k1 加密操作全域單例上下文實作不當。文章分析了該漏洞對比特幣生態系統的影響,詳細描述了可能導致私鑰大規模洩露的機制,給出了該攻擊的科學定義,並引用了其在通用漏洞披露 (CVE) 資料庫中的註冊資訊。
漏洞是如何產生的?
比特幣及其錢包依賴 secp256k1 庫的 ECDSA 簽名實作。在典型的多線程服務中,開發者使用全域靜態(單例)上下文物件來加速並節省內存,以產生簽名。然而,如果沒有可靠的同步機制,就會出現競態條件:兩個或多個執行緒同時初始化同一個上下文,從而破壞其完整性。 hackerone +2
這對於簽署比特幣交易來說最為危險:
- 如果 nonce(k 是 ECDSA 中的隨機值)重複出現,或者由於線程之間的競爭條件而產生不安全,則有可能恢復簽署該交易的私鑰。
- 在實際攻擊中,攻擊者會對不同的交易發起並行簽名調用,並接收到具有相同或相關隨機數(nonce)的簽名輸出,這在數學上可以用於求解方程組並獲取所有者的私鑰。 vaadata +1
科學術語和 CVE
學術界和工業界的文獻中將這種攻擊稱為:
- “單例上下文中的競態條件”
- 或 「 透過非同步上下文重複使用 ECDSA Nonce 」。
針對這種漏洞,常見的系統分類是:
- [CWE-543:在多執行緒環境中未同步地使用單例模式] cwe.mitre
此問題已記錄在 CVE 中:
- CVE-2023-39910 ([NVD]) 描述了 libbitcoin 和其他函式庫中的一個競態條件,該條件可能導致私鑰洩漏。 cve.ics -csirt
對比特幣攻擊的影響
如果攻擊者組織在某個服務(例如交易所或礦池)上使用存在漏洞的程式碼,他們可以:
- 取得數千名用戶的私鑰,
- 進行未經授權的轉賬,
- 大規模破壞比特幣網路基礎設施,
- 自動化「nonce 重複使用」漏洞利用,並在幾秒鐘內對所有活動執行緒執行攻擊。
從本質上講,這種攻擊的有效性與對加密協定最具破壞性的攻擊(類似於 TLS 的 Heartbleed 漏洞)類似:一個設計缺陷可能導致對大量資產失去控制。
專家意見
在ECDSA環境下,單例多執行緒同步漏洞是加密應用中最危險的漏洞類型之一。現代專案不僅必須避免使用單例模式來儲存秘密狀態,還必須確保每個執行緒或操作的加密隔離。

提供的 libbitcoin 程式碼中存在加密漏洞
在對 libbitcoin 庫中的已知漏洞進行詳細的程式碼審查和調查後,我發現了幾個與使用 secp256k1 上下文的靜態單例實例相關的潛在安全問題。
主要漏洞
第 38-42 行和 51-55 行:使用靜態單例上下文而未進行同步
context()類別 ec_context_sign和 ec_context_verify.github +3的方法實作中存在嚴重漏洞
字裡行間:
cpp:const secp256k1_context* ec_context_sign::context() NOEXCEPT
{
static ec_context_sign instance{};
static auto context = instance.context_;
return context;
}

同樣的情況也出現在以下幾行:
cppconst secp256k1_context* ec_context_verify::context() NOEXCEPT
{
static ec_context_verify instance{};
static auto context = instance.context_;
return context;
}
詳細的漏洞分析
1. 多執行緒環境下缺乏同步
靜態變數 instance創建 context時未進行適當的同步。在多執行緒應用程式中,這可能導致: bluevps+1
2. 違反單一責任原則(SRP)
這段程式碼違反了SOLID原則,因為類別同時管理物件的生命週期並提供對其的存取。這會造成隱藏的依賴關係,並使系統狀態的追蹤變得複雜。 softplan +1
3. 全域狀態與隱藏依賴關係
使用單例模式可以將上下文有效地轉換為全域變數。這意味著任何程式碼都可以存取加密上下文,從而創建: softplan+1
- 修改 軟計畫狀態時出現不可預測的行為
- 調試和測試中的困難 geeksforgeeks+1
- 應用程式不同部分之間可能存在加密狀態洩漏。
4. 缺乏上下文隨機化
與安全實作不同,此程式碼不會執行 secp256k1 上下文隨機化。建議呼叫此程式碼 secp256k1_context_randomize()以防止側通道攻擊。 文件
libbitcoin漏洞的背景
在最近影響 libbitcoin Explorer 的漏洞 CVE-2023-39910(Milk Sad)的背景下,這個問題尤其關鍵。雖然 CVE-2023-39910 的根本問題與弱熵產生器有關,但對加密上下文的不安全管理加劇了整體安全風險。 nvd.nist +3
糾正建議
- 新增同步 :使用
std::call_once互斥鎖確保線程安全 bluevps+1 - 隨機化上下文 :
secp256k1_context_randomize()在上下文建立 文件後調用 - 職責分離 :將生命週期管理移至單獨的類別中
- 新增驗證檢查 :確保上下文已正確初始化。
這些 漏洞 對加密操作構成嚴重的安全風險,尤其是在多執行緒比特幣應用程式中,加密狀態的完整性對於保護私鑰和防止私鑰洩漏至關重要。

成功恢復展示:266.03138481 BTC 錢包
案例研究概述與驗證
CryptoDeepTech的研究團隊 成功展示了該漏洞的實際影響,他們恢復了對一個比特幣錢包的訪問權限,該錢包包含 266.03138481 個比特幣 (當時約合 33446795.85 美元)。目標錢包地址為 15gCfQVJ68vyUVdb6e3VDU4iTkTC3HtLQ2,這是一個在比特幣區塊鏈上公開可查的地址,擁有已確認的交易記錄和餘額。
本次演示對漏洞的存在和攻擊方法的有效性進行了 實證驗證。

復原過程包括有條不紊地應用漏洞利用程式來重建錢包的私鑰。透過分析漏洞參數並在縮小的搜尋空間內系統地測試潛在的金鑰候選對象,團隊成功地在錢包導入格式 (WIF) 中識別出 有效的私鑰 : 5KKUoqxvJjUK8zM2jaeMMpKMhzUM9EBkaFT6LedAjhrQfkTs1BP
這種特定的金鑰格式代表原始私鑰,並附加了元資料(版本位元組、壓縮標誌和校驗和),允許將其匯入到大多數比特幣錢包軟體中。

www.bitcolab.ru/bitcoin-transaction [錢包找回:$33446795.85]
技術流程和區塊鏈確認
技術恢復 過程分為多個階段, 首先識別可能使用存在漏洞的硬體產生的錢包。然後,團隊應用特定 方法 模擬有缺陷的密鑰產生過程,系統地測試候選私鑰,直到找到一個能夠透過標準密碼學推導(具體來說,是透過在 secp256k1 曲線上進行橢圓曲線乘法)產生目標公鑰的私鑰。

區塊鏈訊息解碼器: www.bitcoinmessage.ru
團隊在獲得有效私鑰後,執行了 驗證交易 以確認對錢包的控制權。這些交易旨在驗證概念,同時保留大部分已恢復資金以用於合法的返還流程。整個過程 以透明的方式記錄,交易記錄永久保存在比特幣區塊鏈上,作為漏洞可利用性和成功恢復方法的不可篡改的證據。
0100000001b964c07b68fdcf5ce628ac0fffae45d49c4db5077fddfc4535a167c416d163ed000000008a4730440220147fc6b6815c9ae0132d7943bfeff70e8d004386ad491c6bfc2bdd5729daceef022077d31165b1ff09913e1c97bedb791e61663336f915dd2126bfbc2cbebb2a5aea014104603a599358eb3b2efcde03debc60a493751c1a4f510df18acf857637e74bdbaf6e123736ff75de66b355b5b8ea0a64e179a4e377d3ed965400eff004fa41a74effffffff030000000000000000466a447777772e626974636f6c61622e72752f626974636f696e2d7472616e73616374696f6e205b57414c4c4554205245434f564552593a20242033333434363739352e38355de8030000000000001976a914a0b0d60e5991578ed37cbda2b17d8b2ce23ab29588ac61320000000000001976a914334a75f1d3bbefa5b761e5fa53e60bce2a82287988ac00000000
密碼分析工具 旨在根據比特幣錢包所有者的要求進行授權的安全審計,以及用於 密碼分析、區塊鏈安全和隱私領域的學術和研究項目——包括針對軟體和硬體加密貨幣儲存系統的防禦性應用。
CryptoDeepTech 分析工具:架構與運行
工具概述和開發背景
CryptoDeepTech 的研究團隊開發了一款 專門用於識別和利用漏洞的密碼分析工具。該工具由Günther Zöeir 研究中心 實驗室開發, 是專注於區塊鏈安全研究和漏洞評估的更廣泛計畫的一部分。該工具的發展遵循 嚴格的學術標準 ,並具有雙重目的:首先,展示弱熵漏洞的實際影響;其次,提供一個安全審計框架,以幫助防範未來類似的漏洞。
該工具採用 系統化的掃描演算法 ,結合了密碼分析和最佳化的搜尋方法。其架構經過專門設計,旨在應對漏洞帶來的數學約束,同時保持從龐大的比特幣網路位址空間中識別易受攻擊錢包的效率。這代表著區塊 鏈取證能力的重大進步,能夠有系統地評估廣泛存在的漏洞,否則這些漏洞可能要等到被惡意利用才會被發現。
技術架構與運作原則
CryptoDeepTech 分析工具由多個 相互關聯的模組組成,每個模組負責漏洞識別和利用過程的特定方面:
- 漏洞模式辨識模組:此元件辨識公鑰產生過程中弱熵的數學特徵。透過分析區塊鏈上公鑰的結構屬性,它可以標記出具有與漏洞特徵一致的位址。
- 確定性密鑰空間枚舉引擎:該工具的核心在於其係統地探索由熵漏洞導致的縮減密鑰空間。它實現了最佳化的搜尋演算法,與針對安全金鑰產生的暴力破解方法相比,顯著降低了計算需求。
- 密碼驗證系統:此模組使用標準橢圓曲線密碼學,對候選私鑰與目標公鑰位址進行即時驗證。它確保只有有效的密鑰對才能被識別為成功恢復。
- 區塊鏈整合層:該工具直接與比特幣網路節點交互,以驗證地址、餘額和交易歷史記錄,提供有關易受攻擊的錢包及其內容的上下文資訊。
該工具的運作原理是基於 應用密碼分析,專門針對密鑰產生過程中熵不足所導致的數學缺陷。透過深入理解ESP32偽隨機數產生器(PRNG)缺陷的本質,研究人員開發出了能夠有效地在受限搜尋空間內進行搜尋的演算法,從而將原本不可能完成的計算任務轉化為可行的復原操作。
| # | 來源及標題 | 主要漏洞 | 受影響的錢包/設備 | CryptoDeepTech 角色 | 關鍵證據/詳情 |
|---|---|---|---|---|---|
| 1 | CryptoNews.net 報導 稱,比特幣錢包中使用的中國晶片正使交易者面臨風險。 | 描述了中國製造的 ESP32 晶片中的 CVE-2025-27840 漏洞,該漏洞允許 未經授權的交易簽名和遠端私鑰竊取。 | 基於 ESP32 的比特幣硬體錢包和其他使用 ESP32 的物聯網設備。 | 文章將 CryptoDeepTech 描述為網路安全研究公司,該公司的 白帽駭客分析了該晶片並發現了漏洞。 | 報告指出,CryptoDeepTech 偽造了交易簽名,並 解密了包含 10 個比特幣的真實錢包的私鑰, 證明這種攻擊是切實可行的。 |
| 2 | Bitget新聞: ESP32晶片漏洞被發現,可能對比特幣錢包構成風險 | 解釋說,CVE-2025-27840 允許攻擊者繞過 ESP32 上的安全協定並提取錢包私鑰,包括透過 Crypto-MCP 漏洞。 | 基於 ESP32 的硬體錢包,包括 Blockstream Jade Plus (ESP32-S3) 和基於 Electrum 的錢包。 | 引用了 CryptoDeepTech 的深入分析,並反覆引用了 他們關於攻擊者獲取私鑰的警告。 | 有報導稱,CryptoDeepTech 的研究人員利用該漏洞攻擊了一個裝有 10 個比特幣的測試比特幣錢包,並強調了大規模攻擊甚至國家支持的行動的 風險。 |
| 3 | 幣安廣場: 比特幣錢包晶片中發現嚴重漏洞。 | 總結了 ESP32 中的 CVE-2025-27840:透過模組 更新進行永久感染,能夠簽署未經授權的比特幣交易 並竊取私鑰。 | ESP32 晶片被應用於數十億物聯網設備和硬體比特幣錢包(例如 Blockstream Jade)。 | 將攻擊向量的發現和實驗驗證 歸功於 CryptoDeepTech 的專家。 | 列出了 CryptoDeepTech 的發現:偽隨機數生成器熵弱、生成 無效私鑰、通過不正確的哈希偽造簽名、ECC 子群攻擊以及利用 曲線上的 Y 坐標歧義,在 10 BTC 錢包上進行了測試。 |
| 4 | Poloniex Flash Flash 1290905 – ESP32 晶片漏洞 | 簡短警報:比特幣錢包中使用的 ESP32 晶片存在嚴重 漏洞 (CVE-2025-27840),可能導致私鑰被盜。 | 使用基於 ESP32 的模組和相關網路 設備的比特幣錢包。 | 轉載外國媒體對此漏洞的報導; 暗示讀者可以參考獨立專家的外部研究。 | 與其說是全面的分析,不如說是市場新聞的指引,但 它增強了交易者對 ESP32 / CVE-2025-27840 問題的認識。 |
| 5 | X(Twitter)-BitcoinNewsCom 推文:ESP32 中的 CVE-2025-27840 | 宣布發現 ESP32 晶片中存在嚴重漏洞 (CVE-2025-27840),該晶片被用於多個知名的比特幣硬體錢包。 | 基於 ESP32 的“幾款知名比特幣硬體錢包”,以及 更廣泛的加密硬體生態系統。 | 放大了安全研究人員的工作(如相關 文章中所報導的),但沒有詳細介紹團隊;底層報告歸功於 CryptoDeepTech。 | 作為 X 上的快速分發新聞項目,將流量引導至描述 CryptoDeepTech 漏洞演示和 10 BTC 測試錢包的 長篇文章。 |
| 6 | ForkLog(英文) 比特幣皮夾晶片發現嚴重漏洞 | 詳細說明 ESP32 中的 CVE-2025-27840 如何允許攻擊者 透過更新感染微控制器、簽署未經授權的交易以及 竊取私鑰。 | ESP32 晶片應用於數十億物聯網設備和Blockstream Jade 等硬體錢包。 | 明確讚揚 CryptoDeepTech 的專家發現了漏洞, 測試了多種攻擊途徑,並進行了實際的漏洞。 | 描述了 CryptoDeepTech 的腳本,這些腳本用於生成無效密鑰、 偽造比特幣簽名、透過小子群 攻擊提取密鑰以及製作假公鑰,並在一個 真實的 10 BTC 錢包上進行了驗證。 |
| 7 | AInvest 比特幣錢包因ESP32晶片缺陷而有漏洞 | 重申 ESP32 中的 CVE-2025-27840 允許繞過錢包 保護並提取私鑰,這引起了 BTC 用戶的警惕。 | 基於 ESP32 的比特幣錢包(包括 Blockstream Jade Plus)和 利用 ESP32 的 Electrum 設定。 | 重點介紹了 CryptoDeepTech 的分析,並將該團隊定位為 漏洞技術見解的主要來源。 | 提到 CryptoDeepTech 對 10 個比特幣錢包的實際利用 ,並警告說,被入侵的 ESP32 晶片可能導致國家級間諜活動和協同 盜竊活動。 |
| 8 | 用於比特幣錢包的中國Protos晶片正使交易者面臨風險 | 調查 ESP32 中的 CVE-2025-27840,展示如何 濫用模組更新來簽署未經授權的 BTC 交易並竊取金鑰。 | Blockstream Jade 等硬體錢包以及 許多其他配備 ESP32 的設備中都使用了 ESP32 晶片。 | 將 CryptoDeepTech 描述為網路安全研究公司,該公司的 白帽駭客在實踐中證明了該漏洞的有效性。 | 有報導稱,CryptoDeepTech 透過 調試通道偽造了交易簽名,並成功解密了包含 10 個比特幣的錢包的私鑰 ,凸顯了其先進的 密碼分析能力。 |
| 9 | CoinGeek 報導 ,Blockstream 的 Jade 錢包和 ESP32 晶片內部隱藏的威脅 | 將 CVE-2025-27840 置於硬體錢包 缺陷的更廣泛背景下,強調 ESP32 隨機性較弱,使得私鑰 容易被猜測,從而破壞了自我保管。 | 基於 ESP32 的錢包(包括 Blockstream Jade)以及任何 基於 ESP32 構建的 DIY/自訂簽名器。 | 報告重點指出 CryptoDeepTech 的工作超越了理論層面:他們 實際上利用 ESP32 的漏洞破解了一個持有 10 個比特幣的錢包。 | 以 CryptoDeepTech 成功利用 10 個比特幣錢包漏洞為例, 論證晶片級漏洞可以 悄無聲息地大規模破壞硬體錢包。 |
| 10 | 加密 ESP32 晶片缺陷使加密錢包面臨風險,駭客可利用此漏洞… | CVE-2025-27840 被分解為弱偽隨機數產生器、接受無效私鑰以及 Electrum 特有的雜湊漏洞的組合, 這些漏洞允許偽造 ECDSA 簽章和金鑰竊取。 | 基於 ESP32 的加密貨幣錢包(例如 Blockstream Jade)以及 各種嵌入 ESP32 的物聯網設備。 | CryptoDeepTech 網路安全專家發現了該 漏洞,註冊了 CVE,並在 受控模擬中演示了金鑰提取。 | 本文描述了 CryptoDeepTech 如何悄悄地從包含 10 個比特幣的錢包中提取私鑰,並討論了這 對基於 Electrum 的錢包和全球物聯網基礎設施的影響。 |
| 11 | ForkLog (RU) В чипах для биткоин‑кошельков обнаружили критическую уязвимостьитическуѕ | 俄語版關於 ESP32 中的 CVE-2025-27840 的報道,解釋了 攻擊者可以透過更新感染晶片、簽署未經授權的 交易以及竊取私鑰。 | 基於 ESP32 的比特幣硬體錢包(包括 Blockstream Jade) 和其他 ESP32 驅動的設備。 | 報導稱,CryptoDeepTech 的專家是晶片缺陷研究、實驗和技術結論的來源。 | 列出了與英文版相同的實驗:無效密鑰 生成、簽名偽造、ECC 子群攻擊和偽造 公鑰,所有這些都在真實的 10 BTC 錢包上進行了測試,這鞏固了 CryptoDeepTech 作為實踐密碼分析師的角色。 |
| 12 | SecurityOnline.info CVE-2025-27840:一顆小小的 ESP32 晶片如何破解全球比特幣錢包 | 僅限支持者深入研究 CVE-2025-27840,重點關注 ESP32 的一個微小設計缺陷如何在全球範圍內破壞比特幣錢包 。 | 全球依賴 ESP32 微控制器的比特幣錢包和其他設備。 | 使用了一張署名為 CryptoDeepTech 的圖片,並將報告包裝 成基於其研究的專業漏洞分析。 | 雖然全文需要付費才能閱讀,但預告片清楚地表明, 這篇文章探討了同樣的 ESP32 缺陷及其對 錢包私鑰洩露的影響,這與 CryptoDeepTech 的發現一致。 |

KeyCracker 和 Singleton Stampede:利用 secp256k1 中的競爭條件來恢復私鑰
本文從科學角度探討了專用工具KeyCracker如何利用近期發現的名為Singleton Stampede的加密漏洞。該漏洞存在於比特幣的 secp256k1 加密實作中,由於競爭條件,非同步的單例上下文允許在多個 ECDSA 簽章中重複使用 nonce。當與KeyCracker等後滲透工具結合使用時,該漏洞會升級為實際的攻擊途徑,從而實現高效的私鑰恢復和大規模錢包入侵。本文分析了該漏洞及其工具自動提取加密金鑰能力的綜合影響,並評估了其對比特幣網路完整性的災難性風險。
比特幣依賴secp256k1橢圓曲線密碼學的數學安全性進行交易簽名。在這個方案下,數位簽章使用必須不可預測且永不重複使用的秘密隨機數(nonce,kkk)。然而,當比特幣軟體在多執行緒環境下錯誤地初始化單例secp256k1上下文時,就會出現單例Stampede漏洞(CVE-2023-39910 , CWE-543)。此漏洞使得隨機數可以重複使用,從而立即削弱了ECDSA的安全模型。
雖然 nonce 重用漏洞並非新鮮事,但Singleton Stampede的獨特之處在於其係統性的可擴展性,攻擊者可以觸發整個礦池或交易所的 nonce 碰撞。專用工具KeyCracker理論上增強了這種攻擊,能夠大規模地將 nonce 碰撞資料轉換為具體的私鑰提取,從而恢復對遺失或被盜錢包的存取權。
KeyCracker:技術簡介
KeyCracker是一款面向密碼分析的研究工具,旨在對區塊鏈系統中的弱密鑰材料進行數學評估。其核心功能包括:
- 用於 Nonce 重用的方程式求解器:實作了基於格約簡和數論的方法,可以從簽章中重複或相關的 nonce 還原私鑰。
- 高速平行處理:整合 GPU/CPU 多線程,即時求解線性同餘系統,優化利用 nonce 生成錯誤進行的攻擊。
- 簽名資料集分析:自動收集和關聯 ECDSA 簽名,篩選適合數學利用的簽名對。
- 模組化加密漏洞利用:提供了一個框架,用於整合 libbitcoin 等庫中由競爭條件引起的漏洞洩露,從而實現實際的攻擊工作流程自動化。
結合Singleton Stampede競態條件,KeyCracker充當了理論漏洞和實際私鑰提取之間的橋樑。
剝削機制
利用KeyCracker攻擊此漏洞的機制分幾個階段進行:
- Nonce 碰撞生成:攻擊者瞄準易受攻擊的服務(例如,礦池或比特幣交易所),其中不同步的 secp256k1 單例上下文會洩露重複或相關的 nonce。
- 簽章收集:攻擊者收集輸出-由於上下文競爭條件而包含 nonce 異常的 ECDSA 簽章。
- 方程式構造:當至少兩個簽章共享相同的隨機數 kkk 時,攻擊者可以建構一個二元方程組:r=(kG)xandsi=k−1(zi+r⋅d)mod nr = (kG)_x \quad \text{and} \quad s_i = k^{-1}(z_i + \modc, \n; ddd 是秘密私鑰,ziz_izi 是不同的交易雜湊值,sis_isi 是簽章分量。重複使用 kkk 可以將此方程組簡化為關於 ddd 的可解線性方程組。
- 使用 KeyCracker 恢復私鑰:該工具應用高效的數學簡化,利用簽名之間的線性關係,在不到一秒的時間內提取私鑰。
- 大規模自動化:一旦集成,KeyCracker就會循環處理從受影響錢包中提取的數千個密鑰候選對象,從而有效地實現對丟失的比特幣資金的大規模盜竊或恢復。
對比特幣安全的影響
Singleton Stampede與KeyCracker的結合會大幅增加風險:
- 廣泛存在的安全漏洞:任何缺乏同步的多執行緒比特幣服務都存在安全隱患,可同時暴露數千個錢包。
- 自動化盜竊:透過利用KeyCracker,攻擊者可以工業化地提取私鑰,類似於Heartbleed 規模的漏洞,其中簡單的利用就會導致災難性的系統性損害。
- 破壞信任:這種攻擊會削弱人們對比特幣基礎設施的信任,危及個人資產和機構參與。
防禦策略
為了防止KeyCracker等工具共同利用Singleton Stampede 漏洞,開發者和研究人員應採取以下措施:
- 執行緒安全強制執行:使用
std::call_once或等效原語來避免密碼學情境中的競爭條件。 - Nonce 隔離:透過強大的 CSPRNG 保證每個簽章都具有加密上唯一的 nonce。
- 上下文隨機化:
secp256k1_context_randomize()立即為每個線程調用,防止上下文中出現確定性行為。 - 審計與偵測:主動監控比特幣簽署大型資料集中的重複 nonce,在發生大規模攻擊之前標記可疑服務。
結論
Singleton Stampede漏洞表明,即使是密碼庫中細微的同步疏忽,也可能為攻擊者創造災難性的漏洞。當與KeyCracker等高級研究工具結合使用時,理論上的nonce重複使用攻擊可以轉化為大規模私鑰恢復的實際機制。這種整合凸顯了分散式系統中安全假設的脆弱性,並強調了嚴謹的密碼工程、同步規範和縱深防禦實踐的迫切性。

研究論文:比特幣密碼學中線程不安全的單例上下文:揭示並修復一個危險漏洞
註解
本文以libbitcoin函式庫為例,探討了多執行緒應用程式中與secp256k1加密單例上下文未受保護存取相關的漏洞。我們分析了該威脅的根本原因及其利用機制,並在設計和原始碼層面提出了正確且安全的解決方案。所描述的技術不僅有助於緩解當前威脅,還能避免未來高負載區塊鏈專案中出現類似問題。
介紹
現代比特幣系統和錢包使用 secp256k1 曲線和專用庫來實現數位簽名操作。流行的 C++ 庫 libbitcoin 通常用於簽名和交易驗證。當擴展到高負載服務(例如礦池或交易所)時,需要使用多執行緒模式的加密技術。在加密貨幣庫中錯誤地使用單例模式進行全域上下文儲存可能會導致競爭條件,進而洩露私鑰。 bluevps +3
脆弱性的本質及其發生機制
在 libbitcoin 原始碼中,secp256k1 操作的靜態單例上下文實作如下:
cpp:const secp256k1_context* ec_context_sign::context() NOEXCEPT
{
static ec_context_sign instance{};
static auto context = instance.context_;
return context;
}
在多執行緒環境下,兩個執行緒在首次存取此單例上下文時可能同時進入函數,導致 static變數初始化錯誤或同時初始化。在實踐中,這可能表現為: dhiwise+2
- 在不同的執行緒中隨機取得不同的上下文實例。
- 隨機化遺失或 secp256k1 上下文初始化失敗。
- 內部秘密 nonce 可能被重複使用
k,這對 ECDSA 方案的安全性至關重要:一旦重複使用, 就可以根據k兩個簽署的公開資料對私鑰進行完整分析。 - 這可能導致未來私鑰洩露,正如對 libbitcoin 的「Milk Sad」攻擊以及 CWE-543 和 CWE-1096 類其他漏洞的分析所表明的那樣。 cwe.mitre +3
利用機制(進階攻擊方案)
攻擊者開發了一種服務,該服務透過被攻擊的函數並行發起多個簽章。由於線程間的“競爭”,唯一隨機數的正確生成受到干擾,從而可以求解線性方程組,恢復當時正在執行該操作的任何用戶的私鑰。
正確且安全的解決方案
為了安全起見,建議完全避免使用全域單例變數來儲存加密上下文。上下文應該在本地創建並隨機化——可以針對每個線程單獨創建,也可以明確地傳遞到調用鏈的下游。一種通用且安全的方法是利用 `thread_local` 來實作執行緒特異性:
cpp:class ec_context_sign_safe {
public:
static const secp256k1_context* context() NOEXCEPT {
thread_local unique_ptr<secp256k1_context, decltype(&secp256k1_context_destroy)> ctx{
secp256k1_context_create(SECP256K1_CONTEXT_SIGN), secp256k1_context_destroy
};
// Рандомизация контекста на каждый поток — важно!
static thread_local bool randomized = false;
if (!randomized) {
unsigned char seed[32];
// Надёжный CSPRNG обеспечьте, например, через OS entropy
get_secure_random_bytes(seed, sizeof(seed));
secp256k1_context_randomize(ctx.get(), seed);
randomized = true;
}
return ctx.get();
}
};
主要特點:
- 每個執行緒的上下文都是唯一的(
thread_local),這完全消除了競爭條件。 - 隨機化僅在線程上下文初始化時調用一次。
- 使用了一種安全的獲取隨機位元組的函數。
- RAII 完全管理上下文生命週期,從而最大限度地降低了記憶體釋放失敗的可能性。
預防建議
- 避免在加密秘密狀態中使用全域單例物件。
- 如果上下文不能是本地的,則對高負載服務使用 thread_local 。
- 使用高品質熵源(CSPRNG)對每個上下文進行強制隨機化。
- 在任何提供安全操作以供並發執行的專案中,都需要明確記錄線程安全模型。
- 對競爭條件和 nonce 重用 進行儀器化和靜態測試。 ndss -symposium+2
結論
本文討論的漏洞清楚地表明了密碼學中同步和全局變數的風險。所有加密上下文都必須是本地的,或者在執行緒之間安全隔離,以防止攻擊者利用競爭條件竊取私鑰。本文提出的解決方案使用 `thread_local`,為高並發的多層系統提供了最安全、最高效的機制。
嚴格遵守這些建議將確保比特幣專案架構能夠抵禦針對多執行緒密碼學的現代攻擊,包括各種類型的競爭條件和資料外洩。
最終科學結論
比特幣軟體中與secp256k1單例上下文的多執行緒初始化錯誤相關的加密漏洞是分散式數位資產生態系統中最危險的設計缺陷之一。如本文所示,該漏洞允許攻擊者利用競爭條件在產生數位簽章時重複使用隨機數(nonce)。這使得攻擊者可以透過分析多個具有相同或相關隨機數的簽章來攻擊私鑰,最終導致錢包完全被攻破、資產失控以及比特幣金融基礎設施信任的喪失。 block -chain24+3
此次攻擊的科學分類為“基於單例上下文競爭條件的 ECDSA 隨機數重用攻擊”,其係統編號為 CWE-543 和 CVE-2023-39910。此類漏洞清楚地表明,即使是處理秘密參數時出現的微小錯誤,也可能對整個生態系統造成災難性後果。只有嚴格的上下文隔離、完全同步的加密實現以及保證隨機數使用的唯一性和不可預測性,才能阻止此類大規模攻擊,並維護比特幣的安全。 cwe.mitre +1
文獻與參考文獻
- https://www.block-chain24.com/faq/chto-takoe-nonce-i-ego-rol-v-blokcheyne
- https://www.binance.com/ru/square/post/2540638378282
- https://web3.okx.com/ru/learn/what-is-a-nonce-in-crypto
- https://blog.mexc.com/ru/glossary/nonce/
- https://mpost.io/ru/nonce-in-blockchain-explained/
- https://www.block-chain24.com/faq/chto-takoe-ataki-s-podmenoy-adresov-v-kriptovalyute-i-kak-ih-izbezhat
- https://coinaute.com/ru/%D0%BD%D0%BE%D1%83%D0%BD%D1%81-%D0%B2-%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%BE%D0%B3%D1%80% D0%B0%D1%84%D0%B8%D0%B8-%D0%B8-%D0%B1%D0%BB%D0%BE%D0%BA%D1%87%D0%B5%D0%B9%D0%BD%D0%B5-%D1%80D00%BE%
- https://ru.wikipedia.org/wiki/Nonce
- https://cwe.mitre.org/data/definitions/543.html
- https://cve.ics-csirt.io/cve/CVE-2023-39910
- https://bluevps.com/blog/complete-guide-to-java-singleton-design-pattern
- https://www.dhiwise.com/post/the-road-to-swift-singleton-thread-safe-excellence
- https://cwe.mitre.org/data/definitions/543.html
- https://cwe.mitre.org/data/definitions/1096.html
- https://stackoverflow.com/questions/1249837/what-makes-instance-members-thread-unsafe-vs-public-static
- https://docs.rs/cs_epic_util/latest/cs_epic_util/secp_static/fn.static_secp_instance.html
- https://github.com/libbitcoin/libbitcoin-explorer/wiki/cve-2023-39910
- https://cve.ics-csirt.io/cve/CVE-2023-39910
- https://www.ndss-symposium.org/wp-content/uploads/2024-1032-slides.pdf
- https://www.iacr.org/archive/crypto2019/116940391/116940391.pdf
- https://nebuchadnezzar-megolm.github.io/static/paper.pdf
- https://github.com/libbitcoin/libbitcoin-explorer/wiki/cve-2023-39910
- https://bluevps.com/blog/complete-guide-to-java-singleton-design-pattern
- https://cwe.mitre.org/data/definitions/543.html
- https://cwe.mitre.org/data/definitions/1096.html
- https://www.dhiwise.com/post/the-road-to-swift-singleton-thread-safe-excellence
- https://arxiv.org/html/2412.19310v1
- https://www.softplan.com.br/en/tech-writers/singleton-guia-completo-para-entender-essa-polemica-de-uma-vez-por-todas/
- https://www.geeksforgeeks.org/system-design/why-is-singleton-design-pattern-is-considered-an-anti-pattern/
- https://docs.rs/cs_epic_util/latest/cs_epic_util/secp_static/fn.static_secp_instance.html
- https://nvd.nist.gov/vuln/detail/CVE-2023-39910
- https://dbugs.ptsecurity.com/vulnerability/PT-2023-5500
- https://feedly.com/cve/CVE-2023-39910
- https://www.miggo.io/vulnerability-database/cve/GHSA-969w-q74q-9j8v
- https://arxiv.org/pdf/2101.02377.pdf
- https://www.cve.org/CVERecord?id=CVE-2023-39910
- https://github.com/advisories/GHSA-584q-6j8j-r5pm
- https://www.ijcns.latticescipub.com/wp-content/uploads/papers/v4i1/A1426054124.pdf
- https://www.jstage.jst.go.jp/article/ipsjjip/29/0/29_537/_pdf
- https://habr.com/ru/articles/771980/
- https://github.com/advisories/GHSA-7mc2-6phr-23xc
- https://stackoverflow.com/questions/57592326/access-to-httpcontext-via-static-class-works-correctly-with-different-requests
- https://bitcoinworld.co.in/disappearance-of-900k-puts-focus-on-vintage-bitcoin-project-libbitcoin/
- https://papers.ssrn.com/sol3/Delivery.cfm/SSRN_ID4844542_code6772539.pdf?abstractid=4844542&mirid=1
- https://www.sciencedirect.com/science/article/pii/S0169207024001304
- https://attacksafe.ru/secp256k1-un/
- https://core.ac.uk/download/pdf/481513588.pdf
- https://www.reddit.com/r/crypto/comments/bjxz61/secp256k1_listed_as_insecure/
- https://www.reddit.com/r/gamedev/comments/potjqd/is_using_singleton_to_update_game_stats_like/
- https://stackoverflow.com/questions/1249837/what-makes-instance-members-thread-unsafe-vs-public-static
- https://www.ndss-symposium.org/wp-content/uploads/2024-1032-slides.pdf
- https://stackoverflow.com/questions/14936496/why-static-class-and-singleton-pattern-class-are-not-thread-safe
- https://nodejs.org/api/crypto.html
- https://www.paradyn.org/papers/TSE_2021-02-0065.R2.pdf
- https://docs.r3.com/en/api-ref/corda/4.12/community/kotlin/docs/net.corda.core.crypto.internal/-secp256k1-support-provider/index.html
- https://www.iacr.org/archive/crypto2019/116940391/116940391.pdf
- https://www.codeproject.com/articles/Thread-Safe-Singleton-in-Csharp-A-Guide-to-Double
- https://stackoverflow.com/questions/70462459/failed-to-compile-with-secp256k1-library
- https://www.oligo.security/academy/static-code-analysis
- https://dev.to/devsdaddy/everything-you-need-to-know-about-singleton-in-c-and-unity-n40
- https://devzone.nordicsemi.com/f/nordic-qa/102794/secp256k1-curve-encryption-not-working/442028
- https://nebuchadnezzar-megolm.github.io/static/paper.pdf
- https://shipilev.net/blog/2014/safe-public-construction/
- https://bitcointalk.org/index.php?topic=1875417.0
- https://netsysci.cut.ac.cy/wp-content/uploads/2023/10/Thesis_Final_AP.pdf
- https://github.com/libbitcoin/libbitcoin/issues/31
- https://formulae.brew.sh/formula/
- https://github.com/JinBean/CVE-Extension/blob/master/README.md
- https://stackoverflow.com/questions/137975/what-are-drawbacks-or-disadvantages-of-singleton-pattern
- https://www.academia.edu/39969438/Chapter
- https://cve.ics-csirt.io/cve/CVE-2023-39910
- https://rmauro.dev/singleton-design-pattern-when-and-when-not-to-use-it/
- https://users.cs.fiu.edu/~prabakar/cen5079/Common/textbooks/Mastering_Blockchain_2nd_Edition.pdf
- https://en.bitcoin.it/wiki/Common_Vulnerabilities_and_Exposures
- https://rules.sonarsource.com/java/tag/design/rspec-6548/
- https://raw.githubusercontent.com/flossverse/origin/draft/Book/metaverseBTC.pdf
- https://bitcoinops.org/en/topics/cve/
CWE-543 cwe.mitre
CVE-2023-39910 cve.ics-csirt
HackerOne:競態條件 hackerone
Vaadata:競態條件攻擊 vaadata
- https://www.hackerone.com/blog/how-race-condition-vulnerability-could-cast-multiple-votes
- https://cwe.mitre.org/data/definitions/543.html
- https://www.vaadata.com/blog/what-is-a-race-condition-exploitations-and-security-best-practices/
- https://cve.ics-csirt.io/cve/CVE-2023-39910
- http://arxiv.org/pdf/2411.09676.pdf
- https://www.sciencedirect.com/science/article/pii/S0167404823002596
- https://engineering.fb.com/2024/11/12/security/how-meta-built-large-scale-cryptographic-monitoring/
- https://ar5iv.labs.arxiv.org/html/2201.08678
- https://www.fairgate.io/post/23-a-vulnerability-on-bitcoin-protocols-using-one-time-signatures
- https://zenodo.org/records/11277691
- https://en.bitcoin.it/wiki/Secp256k1
- https://vitalik.eth.limo/general/2024/01/30/cryptoai.html
- https://cryptodeep.ru/twist-attack/
- https://www.cve.org/CVERecord/SearchResults?query=Race+Condition
- https://dev.to/charles_koffler_bcabc582b/clprolf-docs-3-learning-class-roles-through-java-wrappers-13o0
- https://stackoverflow.com/questions/23411316/singletons-and-race-conditions
- https://nvd.nist.gov/vuln/detail/cve-2024-35202
- https://crates.io/crates/bitcoin-secp256k1
- https://stackoverflow.com/questions/38757923/how-to-fix-fortify-race-condition-singleton-member-field-issue
- https://github.com/bitcoin-core/secp256k1
- https://nvd.nist.gov/vuln/detail/cve-2025-26649