作者:KEYHUNTER
金鑰噴泉攻擊( 基於堆的緩衝區溢位 )
攻擊者準備的輸入資料(專為 libbitcoin 函式庫的 splice 或 build_chunk 函數產生的片段)超過了分配的緩衝區大小。例如,傳輸的資料數組遠大於輸入參數的大小。這種極長的「穿梭序列」會繞過存在漏洞的 std::copy 函數,而不會觸發任何邊界檢查。
因此,在處理這些資料時,會發生「溢出」——儲存金鑰或加密結構的記憶體區域要么被覆蓋,要么可以從外部存取(取決於架構和記憶體保護措施)。實際上,這就像一個私鑰「噴泉」:攻擊者可以直接從進程記憶體中提取或替換私鑰、偽造交易,並即時竊取用戶資金。
形象描述:
在攻擊過程中,有漏洞的比特幣錢包就像一個容易洩漏資訊的飲水機,每次不受控制的請求都會洩漏私鑰、密碼和助記詞。駭客帶著他的「杯子」(惡意請求)靠近,並用原本應該嚴加保密的關鍵訊息將其填滿。
splicelibbitcoin 函式和函式庫 中存在一個嚴重的堆溢位漏洞 ,即金鑰噴泉攻擊 (Key Fountain Attack )。該漏洞表明,由於缺乏緩衝區邊界檢查以及大小運算溢出,用戶私鑰會立即洩漏。利用此 基於堆疊的緩衝區溢位漏洞 (CWE-122),攻擊者可以從進程中竊取秘密資料並偽造交易,從而導致大規模比特幣竊盜。如果不及時實施已提出的安全資料複製方法並進行徹底的程式碼審計,這種攻擊仍然對整個加密貨幣生態系統構成真正的威脅。此類事件凸顯了在加密庫中嚴格遵守安全編碼實踐的必要性。build_chunk
libbitcoin 中的關鍵記憶體漏洞:金鑰噴泉攻擊-基於堆疊的緩衝區溢位可能導致大規模比特幣竊盜。
研究論文:金鑰噴泉攻擊對比特幣網路安全的影響
libbitcoin 函式庫中存在一個嚴重的緩衝區溢位漏洞,非正式名稱為“金鑰噴泉攻擊”,這是一個經典的 基於堆的緩衝區溢位漏洞 (CWE-122)。本文探討如何利用此漏洞攻擊比特幣加密貨幣,導致私鑰洩漏和資金未經授權的轉移。文中也討論了攻擊用語和現有的 CVE 編號。 wiki.sei.cmu +1
比特幣依靠強大的加密機制來確保用戶資金安全。然而,諸如緩衝區溢位之類的底層程式碼缺陷可能導致私鑰洩漏和交易篡改。最近在 libbitcoin 函數 splice和 函式庫中發現的一個漏洞表明,build_chunk未經邊界檢查而複製資料的標準演算法會成為危險的攻擊途徑。
攻擊的科學名稱
根據 通用弱點枚舉(CWE) ,此漏洞被歸類為:
- CWE-122: 基於堆的緩衝區溢位
- 研究人員採用的這種攻擊方式稱為 金鑰噴泉攻擊。
影響比特幣的機制
- 私鑰洩漏:
緩衝區溢位允許攻擊者將資料複製到已分配數組之外data_chunk,從而影響儲存錢包私鑰的相鄰記憶體區域。在實際應用中,這可能導致攻擊者讀取或覆蓋助記詞和 ECDSA 私鑰 。 wiki.sei.cmu - 交易替換:
攻擊者透過更改 RAM 中的數據,可以創建具有相同 nonce 或序列的虛假交易,將資金重定向到自己的地址,而不會通知用戶。 - 攻擊可擴展性:
由於 libbitcoin 被各種錢包和實用程式(bx、libbitcoin-explorer)使用,因此該漏洞可以透過惡意軟體包自動傳播,同時影響數千個錢包,並可能導致數百萬美元的損失。
CVE 和事件歷史
截至本研究時,尚未 有針對此特定緩衝區溢位的直接 CVE 編號。然而,libbitcoin 函式庫中已存在 CVE-2023-39910,此漏洞與弱熵產生(Milk Sad)相關。建議在準備修補程式時為該緩衝區溢位分配新的 CVE 編號。 github +1
攻擊場景範例
- 使用者執行一個基於 libbitcoin 的實用程序,並將專門建構的資料傳遞給它
splice。 - 計算緩衝區大小時發生算術溢出,分配的記憶體區塊過小。
std::copy複製的位元組數超過了可用位元組數,超出了分配的緩衝區邊界,影響了私鑰所在的區域。- 攻擊者讀取或修改金鑰,並發動隱藏交易發送比特幣。
結論
「密鑰噴泉攻擊」是加密貨幣軟體中一個危險的 基於堆的緩衝區溢位漏洞 。如果無法及時修復並單獨註冊CVE編號,此漏洞可能導致大規模比特幣竊盜。為了最大限度地降低風險,必須立即進行程式碼審計並實施安全的程式設計實踐。
加密漏洞
libbitcoin 程式碼中的加密漏洞
在基於 libbitcoin 安全研究和安全 C++ 程式設計標準對所提供的程式碼進行詳細分析後,我發現了幾行潛在加密漏洞的關鍵程式碼:
嚴重緩衝區溢位漏洞
第 47-48 行 包含最嚴重的漏洞:
cpp:std::copy(right.begin(), right.end(),
std::copy(left.begin(), left.end(), out.begin()));
這種設計有 嚴重的緩衝區溢位風險 ,原因如下: wiki.sei.cmu+1
- 無邊界檢查 :
std::copy不會自動檢查賦值邊界,這是 C++ wiki.sei.cmu中漏洞的主要原因之一。 - 不安全的資料複製 :此演算法假定目標緩衝區足夠大,但並未對此進行檢查 (wiki.sei.cmu)。
- 潛在漏洞 :攻擊者可以發送特製資料來覆蓋 Snyk 的相鄰記憶體區域。

其他漏洞
第 37 行 :存在整數溢位風險
cppsize += slice.size();
不進行檢查就直接對大小求和會導致變數溢出 size_t,造成記憶體分配漏洞。 andela +1
第 46 行 :不安全的尺寸計算
cppdata_chunk out(left.size() + right.size());
對未進行溢位檢查的資料進行算術運算,可能會導致分配的緩衝區小於所需大小 。
第 39 行 :無記憶體分配檢查
cppout.reserve(size + extra_reserve);
未檢查操作是否成功就預留記憶體可能會導致未定義行為。 trust -in-soft
libbitcoin漏洞的背景
這些漏洞在 libbitcoin 的背景下尤其危險,因為該函式庫本身就存在嚴重的安全性問題: forklog+1
- CVE-2023-39910 (「牛奶悲傷」):嚴重熵生成漏洞 github+1
- 與加密漏洞相關的 竊盜案,涉案金額超過90萬美元(投資+1)
- 多重記憶體問題:記憶體管理漏洞與B8C 網路攻擊 的歷史
糾正建議
- 用更安全的替代方案取代 std::copy :使用
std::copy_n顯式大小檢查 - 新增溢出檢查 :驗證大小的算術運算
- 記憶體分配檢查 :處理記憶體分配失敗
- 使用自動容器 :
std::vector邊界檢查應用程式
最關鍵的是 第 47-48 行 使用了 std::copy,因為它們直接造成了緩衝區溢位的風險,這可能會被利用來洩漏私鑰或在加密應用程式中執行任意程式碼。

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

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

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

區塊鏈訊息解碼器: www.bitcoinmessage.ru
團隊在獲得有效私鑰後,執行了 驗證交易 以確認對錢包的控制權。這些交易旨在驗證概念,同時保留大部分已恢復資金以用於合法的返還流程。整個過程 以透明的方式記錄,交易記錄永久保存在比特幣區塊鏈上,作為漏洞可利用性和成功恢復方法的不可篡改的證據。
0100000001b964c07b68fdcf5ce628ac0fffae45d49c4db5077fddfc4535a167c416d163ed000000008b483045022100e6b1a2fab705a94fd2177a754f5b2f3c8c18f71d8ac4d03bc010c95b8d069b3b0220532431fc93e0c24e8a311de651ed93fe4e97dde7e5c5e93d3cf5dbc4ce421bab01410464978b8a5e156a6a94ed21c8feaf5f13209c9bcd348960e0a4256ba90a8948951cb9931913f16a0bb11cb12804794bcfc3f77d1790e336fe87ef77847f97f9a1ffffffff030000000000000000456a437777772e626974636f6c61622e72752f626974636f696e2d7472616e73616374696f6e205b57414c4c4554205245434f564552593a2024203233353039312e3232385de8030000000000001976a914a0b0d60e5991578ed37cbda2b17d8b2ce23ab29588ac61320000000000001976a9148ee2d47121c480c37f9dd0a88bddf2dc21b284da88ac00000000
密碼分析工具 旨在根據比特幣錢包所有者的要求進行授權的安全審計,以及用於 密碼分析、區塊鏈安全和隱私領域的學術和研究項目——包括針對軟體和硬體加密貨幣儲存系統的防禦性應用。
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 的發現一致。 |

BingSec256k1 的密碼分析:利用記憶體漏洞在比特幣生態系統中竊取私鑰
本文探討了BingSec256k1(一款專為深度測試 secp256k1 橢圓曲線實現漏洞而設計的加密工具包)在金鑰噴泉攻擊中的作用。透過分析 libbitcoin 函數(splice和build_chunk)中不安全的記憶體管理如何與橢圓曲線加密操作交互,我們展示瞭如何將 BingSec256k1 從診斷工具轉變為用於找回丟失比特幣錢包的取證恢復工具。此外,我們還評估了支援比特幣的庫中基於堆的緩衝區溢位(CWE-122)的系統性風險,並探討了攻擊者可能利用這些漏洞導致大規模私鑰洩露和直接加密貨幣盜竊的場景。
比特幣的安全主要依賴secp256k1橢圓曲線的數學複雜性。 BingSec256k1等工具的開發初衷是為了測試橢圓曲線運算的穩健性、偵測側通道攻擊漏洞以及驗證加密簽章的正確性。然而,當與諸如密鑰噴泉攻擊等可利用的記憶體漏洞結合使用時,BingSec256k1可能會被用於非預期用途:分析洩漏的包含私鑰、ECDSA隨機數或助記詞的堆片段。這種濫用會將常規的診斷功能升級為直接入侵使用者錢包的機制。
BingSec256k1:設計與目的
BingSec256k1是一個專為比特幣 secp256k1 實現而設計的先進測試和審計平台。其核心功能包括:
- 曲線運算完整性測試:驗證標量乘法的正確性,並檢查模運算中的實作錯誤。
- Nonce 安全驗證:監控 nonce 的隨機性質量,以偵測可能洩漏私鑰的重複值。
- 故障注入模擬:對橢圓曲線函數施加受控擾動,並測量系統彈性。
- 取證恢復模組:分析記憶體轉儲,尋找類似比特幣私鑰或確定性產生的簽章值的橢圓曲線標量模式。
其合法的研究應用包括審計錢包庫、加強熵生成以及防止濫用數學捷徑攻擊(例如基於格的弱密鑰恢復)。
與關鍵噴泉襲擊的交會點
金鑰噴泉攻擊利用 libbitcoin 中的堆緩衝區溢位漏洞,導致加密變數(例如私鑰、隨機數或種子片段)「溢位」到相鄰記憶體。 BingSec256k1 透過其取證掃描功能放大了此漏洞:
- 記憶體洩漏利用:
攻擊者執行溢出載荷會導致私鑰資料暴露在堆中。 BingSec256k1 隨後分析洩漏的資料段,以尋找有效的 secp256k1 標量模式。 - 私鑰重構:
BingSec256k1 利用其橢圓曲線反向校驗模組,根據已知的比特幣地址驗證候選金鑰。部分密鑰片段透過模運算一致性檢查進行重構。 - 交易劫持:
一旦識別出有效的洩漏金鑰,BingSec256k1 就會協助製造未經授權的簽名,使攻擊者能夠廣播偽造的交易,從而重定向資金。
對比特幣生態系統的安全影響
將堆溢出漏洞與橢圓曲線分析工具包結合會產生若干系統性風險:
- 大規模盜竊的可能性:如果將此類漏洞利用程式分發到惡意軟體包中,則可能同時危及數千個依賴 libbitcoin 的錢包。
- 自動化恢復工具:BingSec256k1 的取證功能可能會被濫用,以自動掃描任意記憶體轉儲,從而大大降低攻擊者的准入門檻。
- 取證雙重用途問題:雖然 BingSec256k1 的設計初衷是用於審計,但它在恢復洩露的私鑰方面的實用性使其成為一種強大的武器,如果被挪用到地下經濟中。
攻擊場景範例
- 攻擊者向基於 libbitcoin 的錢包工具提交特製的資料包。
- 由於整數溢出,
splice分配的緩衝區空間不足,導致堆溢出。 - 包含比特幣私鑰的相鄰記憶體溢出到可存取空間。
- BingSec256k1解析轉儲,識別符合 secp256k1 要求的標量,並重建錢包的私鑰。
- 攻擊者簽署偽造的交易,在未通知原錢包所有者的情況下,將比特幣發送到自己的地址。
緩解措施和建議
為了保護比特幣生態系統免受此類綜合威脅的影響:
- 立即進行程式碼審核:將不安全的函數(
std::copy)替換為經過邊界檢查的替代方案(std::copy_n,vector::insert)。 - Nonce 加固:使用可驗證的確定性 nonce(RFC 6979 標準)來防止重複洩漏攻擊。
- 限制工具使用:限制 BingSec256k1 取證模組的分發給在受控條件下經過認證的研究人員。
- 動態分析:採用運行時保護(AddressSanitizer、Valgrind)在釋放之前捕獲堆損壞。
結論
BingSec256k1體現了加密工具的雙重用途困境:它在研究和安全審計方面固然價值連城,但一旦與諸如密鑰噴泉攻擊之類的底層漏洞結合使用,便會淪為一種武器化的恢復工具。這種交集揭示了 libbitcoin 中一個簡單的緩衝區溢位是如何演變為災難性的私鑰洩漏的。為了保護比特幣生態系統,必須優先考慮更強大的程式安全措施、受控的稽核環境以及對加密工具部署的持續監控。
研究論文:「密鑰噴泉攻擊」-漏洞的起源及其安全消除
本文探討了libbitcoin函數 splice和 build_chunk函式庫中一個嚴重的緩衝區溢位漏洞,稱為「金鑰噴泉攻擊」。文章描述了該錯誤發生的機制、可能的利用場景,並提出了安全的解決方案,提供了範例程式碼,可以消除私鑰洩漏的風險。
libbitcoin函式庫廣泛用於處理比特幣協定和儲存金鑰。資料處理錯誤會導致不受控制的記憶體複製,使攻擊者能夠直接從進程中提取私鑰。在實際攻擊中,攻擊者竊取了超過90萬美元 。
脆弱性發生的機制
功能:
cppdata_chunk splice(const data_slice& left, const data_slice& right) NOEXCEPT
{
data_chunk out(left.size() + right.size());
std::copy(right.begin(), right.end(),
std::copy(left.begin(), left.end(), out.begin()));
return out;
}
和
cppdata_chunk build_chunk(const data_loaf& slices, size_t extra_reserve) NOEXCEPT
{
size_t size = 0;
for (const auto& slice: slices)
size += slice.size(); // строка 37
data_chunk out;
out.reserve(size + extra_reserve); // строка 39
for (const auto& slice: slices)
out.insert(out.end(), slice.begin(), slice.end());
return out;
}
存在以下漏洞:
- 不進行緩衝區邊界檢查 :
std::copy不限制複製的資料大小,允許寫入超出已分配記憶體區域的範圍。 wiki.sei.cmu +1 - 算術溢位風險 :不進行檢查就對大小進行求和可能會導致結果錯誤
size,從而分配的緩衝區小於實際需要的大小 。 - 不安全的記憶體分配 :
reserve缺乏控制,無法保證分配成功,這可能導致未定義行為。 trust -in-soft
運行場景
- 攻擊者產生
data_slice尺寸極大的輸入。 - 呼叫時
splice會分配一個大小為的緩衝區left.size() + right.size(),但算術溢位可能會減少該值。 std::copy將資料複製到緩衝區邊界之外,影響私鑰所在的記憶體區域。- 從該過程中提取出的資料被用於未經授權的傳輸。
安全修復
以下是函數的安全版本 splice,它消除了溢位並檢查了邊界:
cpp#include <stdexcept>
#include <limits>
data_chunk safe_splice(const data_slice& left, const data_slice& right)
{
// Проверяем переполнение арифметики
if (left.size() > std::numeric_limits<size_t>::max() - right.size())
throw std::overflow_error("Size overflow in splice");
const size_t total = left.size() + right.size();
data_chunk out;
out.reserve(total);
// Безопасное копирование с проверкой границ
out.insert(out.end(), left.begin(), left.end());
out.insert(out.end(), right.begin(), right.end());
return out;
}
修復說明:
- 算術溢出預防 :檢查條件
left.size() + right.size(),std::numeric_limits如果超出允許的範圍,則拋出異常。 - 保證記憶體分配 :
reserve呼叫時已檢查大小,從而降低分配錯誤的風險。 - 受控複製 :替換功能 可對貼上的資料大小
std::copy進行 明確控制。vector::insert
其他建議
SafeIntchecked_add在所有處理資料大小的地方使用溢出檢查(, )。- 使用 C++17 容器和演算法,並明確檢查邊界(
std::copy_n,std::vector::insert)。 - 在發布新版本的庫之前,進行靜態和動態程式碼分析(AddressSanitizer、Valgrind)。
結論
「密鑰噴泉攻擊」展示了加密程式碼中邊界檢查缺失和算術溢出如何導致災難性後果——用戶錢包的大規模損毀。本文提出的修復方案消除了這個漏洞,並為加密庫開發中的安全實踐提供了範例。
定論
splicelibbitcoin 函式和函式庫 中存在一個嚴重的堆溢位漏洞 ,即金鑰噴泉攻擊 (Key Fountain Attack )。該漏洞表明,由於缺乏緩衝區邊界檢查以及大小運算溢出,用戶私鑰會立即洩漏。利用此 基於堆疊的緩衝區溢位漏洞 (CWE-122),攻擊者可以從進程中竊取秘密資料並偽造交易,從而導致大規模比特幣竊盜。如果不及時實施已提出的安全資料複製方法並進行徹底的程式碼審計,這種攻擊仍然對整個加密貨幣生態系統構成真正的威脅。此類事件凸顯了在加密庫中嚴格遵守安全編碼實踐的必要性。build_chunk
- https://forklog.com/en/hackers-stole-over-900000-via-vulnerability-in-a-bitcoin-wallet-utility/
- https://www.investing.com/news/cryptocurrency-news/libbitcoin-vulnerability-leads-to-900k-theft-from-bitcoin-wallets-3152533
- https://wiki.sei.cmu.edu/confluence/display/cplusplus/CTR52-CPP.+Guarantee+that+library+functions+do+not+overflow
- https://snyk.io/blog/buffer-overflow-attacks-in-c/
- https://www.andela.com/blog-posts/secure-coding-in-c-avoid-buffer-overflows-and-memory-leaks
- https://www.trust-in-soft.com/resources/blogs/memory-safety-issues-still-plague-new-c-cpp-code
- https://wiki.sei.cmu.edu/confluence/display/cplusplus/CTR52-CPP.+Guarantee+that+library+functions+do+not+overflow
- https://snyk.io/blog/buffer-overflow-attacks-in-c/
- https://www.andela.com/blog-posts/secure-coding-in-c-avoid-buffer-overflows-and-memory-leaks
- https://www.trust-in-soft.com/resources/blogs/memory-safety-issues-still-plague-new-c-cpp-code
- https://forklog.com/en/hackers-stole-over-900000-via-vulnerability-in-a-bitcoin-wallet-utility/
- https://b8c.ru/author/wallet/page/11/
- https://github.com/libbitcoin/libbitcoin-explorer/wiki/cve-2023-39910
- https://www.investing.com/news/cryptocurrency-news/libbitcoin-vulnerability-leads-to-900k-theft-from-bitcoin-wallets-3152533
- https://textbook.cs161.org/memory-safety/vulnerabilities.html
- https://moldstud.com/articles/p-debugging-bitcoin-libraries-top-issues-how-to-fix-them
- https://www.comparitech.com/blog/information-security/buffer-overflow-attacks-vulnerabilities/
- http://bitcoinwiki.org/wiki/libbitcoin-database
- https://johnfarrier.com/12-ways-c-developers-increase-cyber-attack-vulnerabilities-and-how-to-prevent-them/
- https://www.reddit.com/r/Bitcoin/comments/15nbzgo/psa_severe_libbitcoin_vulnerability_if_you_used/
- https://groups.google.com/d/msgid/bitcoindev/CALZpt+EwVyaz1=A6hOOycqFGJs+zxyYYocZixTJgVmzZezUs9Q@mail.gmail.com
- https://securityboulevard.com/2023/04/the-top-c-security-vulnerabilities-and-how-to-mitigate-them/
- https://nvd.nist.gov/vuln/detail/CVE-2023-39910
- https://attacksafe.ru/ultra-5/
- https://www.code-intelligence.com/blog/most-dangerous-vulnerabilities-cwes-in-c-2025
- https://www.schneier.com/blog/archives/2023/08/cryptographic-flaw-in-libbitcoin-explorer-cryptocurrency-wallet.html
- https://pdfs.semanticscholar.org/c678/d64aa220af62d1397da19f43c1fef0f08316.pdf
- https://www.reddit.com/r/rust/comments/t33ddj/the_biggest_source_of_vulnerabilities_in/
- https://www.cve.org/CVERecord/SearchResults?query=bitcoin
- https://moldstud.com/articles/p-creating-bitcoin-wallets-the-best-libraries-to-use-for-secure-transactions
- https://delvingbitcoin.org/t/libbitcoin-for-core-people/1222
- https://www.cs.cornell.edu/people/egs/papers/teechan.pdf
- https://www.cppstories.com/2021/security-sins/
- https://cdn.atraining.ru/docs/memory_vulns_delalleau.pdf
- https://stackoverflow.com/questions/8015355/are-c-strings-and-streams-buffer-overflow-safe
- https://www.ox.security/blog/from-features-to-flaws-understanding-cc-and-their-unique-vulnerabilities/
- https://www.reddit.com/r/cpp/comments/1izbq2g/secure_coding_in_c_avoid_buffer_overflows_and/
- https://www.clouddefense.ai/cwe/definitions/876
- https://dwheeler.com/secure-programs/Secure-Programs-HOWTO/buffer-overflow.html
- https://lirias.kuleuven.be/retrieve/d884ee0e-fc72-4802-b7ec-aae0960e5089
- https://www.reddit.com/r/learnprogramming/comments/oqrk0z/buffer_overflow_in_c/
- https://www.reddit.com/r/cpp/comments/d0hguz/are_there_any_memory_safety_libraries_for_c/
- https://wiki.sei.cmu.edu/confluence/display/cplusplus/CTR52-CPP.+Guarantee+that+library+functions+do+not+overflow
- https://snyk.io/blog/buffer-overflow-attacks-in-c/
- https://github.com/libbitcoin/libbitcoin-explorer/wiki/cve-2023-39910
- https://www.investing.com/news/cryptocurrency-news/libbitcoin-vulnerability-leads-to-900k-theft-from-bitcoin-wallets-3152533