作者:KEYHUNTER
注入攻擊-透過易受攻擊的依賴項引入並執行惡意程式碼。遠端程式碼執行 (RCE)-利用客戶端 RPC 介面中的漏洞遠端執行任意程式碼。私鑰洩漏。如果匯出的簽章中至少出現一個位元組的私鑰或 nonce,攻擊者可以透過收集洩漏的資訊並分析偏移量,逐步透過多個簽章來恢復完整的私鑰。
比特幣生態系統中未初始化記憶體的致命漏洞:針對私鑰的致命記憶體外洩攻擊
該研究揭示了比特幣生態系統中一個極其危險的記憶體洩漏漏洞,該漏洞與在生成加密簽名時使用未初始化的記憶體有關。這一嚴重錯誤允許未經授權地將部分秘密資料(例如私鑰和不可復現的隨機數)直接嵌入到導出的交易簽名中,從而使成千上萬的用戶面臨資金被盜的風險。科學研究已證實,此類漏洞將成為區塊鏈攻擊的理想目標——攻擊者有機會恢復私鑰,並完全控制和管理他人的資產,而無需考慮備份程序和硬體保護措施。
私鑰和數位簽章交易的安全性對於加密貨幣協議,尤其是比特幣協議,至關重要。本文探討了Node.js庫中未初始化記憶體漏洞的機制 ,詳細描述了攻擊途徑及其對比特幣網路的Buffer.allocUnsafe潛在影響,並對這類漏洞進行了科學分類和官方註冊。
脆弱性的性質和機制
Buffer.allocUnsafe 一些 JavaScript/Node.js 加密庫使用了一種不安全的記憶體分配方式(或建構)來序列化 ECDSA 簽章 。new Buffer(size)這種方法不會初始化緩衝區字節,這可能導致先前加密操作的資料片段(金鑰、隨機數、密碼和其他秘密資訊)儲存在已分配的記憶體中。
如果此類緩衝區未正確初始化,隨後又被輸出(例如,在交易簽章中),則一些舊資料可能會透過區塊鏈公開,這可能會引發針對私鑰洩漏的攻擊。
對比特幣加密貨幣的影響
1. 私鑰洩漏:
即使導出的簽名中只包含一個位元組的私鑰或隨機數,攻擊者也可以透過多次簽名,利用洩漏收集和偏移分析( attacksafe+2key extraction via memory disclosure)逐步恢復完整的私鑰。
2. 大規模錢包洩漏
線上錢包、多重簽章服務、金鑰管理器以及所有在 Node.js 上使用外部函式庫或底層加密函數封裝器的系統都特別容易受到攻擊。如果攻擊者獲取了用戶的私鑰,則可能導致所有比特幣和代幣資產被盜 。
3. 違反確定性和共識協議:
由於「垃圾」位元組導致的非恆定簽名填充會改變簽名,但不會改變訊息的本質(交易延展性),這曾威脅到比特幣共識。 attacksafe +2
攻擊的分類和科學名稱
正式術語
這種攻擊被稱為 未初始化記憶體暴露攻擊 或 記憶體洩漏 攻擊。 cqr +2
CVE標識符
- CVE-2018-7166: “Node.js 緩衝區分配可能導致未初始化記憶體暴露。” hackerone
- CVE-2025-6545: 「Node.js 加密函數中不正確的輸入驗證允許記憶體洩露,洩露內容最高可達私鑰」(與 to-buffer.js 和簽章欺騙有關,適用於加密卡和錢包) 。 wiz
- 據報道,npm 模組和其他數位簽章庫中也存在相關漏洞。 snyk +1
科學分類
這類漏洞屬於 資訊外洩 類別 side-channel attack via uninitialized memory漏洞,類似於臭名昭著的 OpenSSL Heartbleed 漏洞(也稱為 緩衝區洩漏漏洞) 。
比特幣生態系中的剝削
真實攻擊場景
- 攻擊者從區塊鏈可追蹤的 DER 區塊或 API 結果中收集數位簽章輸出。
- 對多個簽章進行差異分析,並計算受控 r、s 之外的哪些位元組發生了更改,從而指示髒記憶體。
- 它利用已知的密鑰提取技術和記憶體洩漏分析,重構用戶的私鑰或隨機數 nonce。 attacksafe +1
- 透過偽造交易或完全清空餘額來竊取資金。
威脅的規模
這種漏洞可能導致類似 Heartbleed 漏洞的全球性安全威脅,影響由 Node.js 及類似執行時間支援的加密貨幣錢包和服務。攻擊既可以是定向的(透過專有服務),也可以是大規模的(透過公共區塊鏈分析器)。
反制與防禦
正確且安全的方法
- 獨佔使用
Buffer.alloc()(將記憶體初始化為零) - 定期進行程式碼審計,自動測試緩衝區是否有洩漏。 deepsource +1
實踐的科學依據
使用零初始化已分配的記憶體是組織安全計算(密碼學零化策略)中普遍接受的原則,並由現代密碼工程標準(NIST SP 800-57、ISO/IEC 19790)的要求所實現。 dev +1
結論
這個關鍵漏洞 Uninitialized Memory Exposure 凸顯了使用者執行時期環境中密碼學實作中一個鮮為人知但極度危險的問題。該漏洞的影響不僅關乎單一錢包的安全,還會影響整個比特幣生態系統的完整性,並可能導致大規模攻擊,洩露私鑰並直接從區塊鏈竊取資金。唯一可靠的預防方法是徹底禁止使用未初始化的記憶體——這是處理緩衝區和密碼結構時預設安全的實踐。 arxiv +3
關鍵字:
未初始化記憶體暴露、記憶體外洩攻擊、CVE-2018-7166、CVE-2025-6545、記憶體中斷、資訊側頻道、緩衝區Heartbleed漏洞、加密貨幣簽章、私鑰竊取
程式碼中的加密漏洞
在分析的 DER 簽章編碼器/解碼器程式碼 中,第92 行發現了 一個潛在的資料外洩漏洞 :
漏洞:未初始化記憶體
第 92 行:
javascript:const signature = Buffer.allocUnsafe(6 + lenR + lenS);
問題: 使用此方法 Buffer.allocUnsafe() 會建立一個未初始化記憶體的緩衝區,這可能會導致 Node.js 堆中的敏感資料外洩。 github +1

洩漏機制
- 未初始化的記憶體 可能包含先前操作的殘留資料。
- 如果緩衝區沒有被簽署資料完全覆蓋,則 剩餘的記憶體將包含在最終簽章中。
- 可能洩漏的片段:
- 先前操作的私鑰
- 其他 ECDSA 操作的 nonce 值 (k)
- 堆中的任何機密數據
修復漏洞
而不是:
JavaScriptconst signature = Buffer.allocUnsafe(6 + lenR + lenS);
應該使用:
JavaScriptconst signature = Buffer.alloc(6 + lenR + lenS); // Инициализирует нулями
其他線路是安全的。
其餘程式碼行不包含任何加密金鑰外洩漏洞:
- 第 13-30 行: 根據 BIP-66 bips進行正確的 DER 格式檢查
- 第 35-59 行: 正確解碼並檢查邊界
- 第 61-62 行: 透過以下方式安全地提取 R 和 S
slice() - 第 81-90 行: 輸入驗證檢查
- 第 93-100 行: 修正 DER 結構條目
漏洞背景
此漏洞屬於 資訊外洩 類漏洞,雖然不允許直接計算私鑰,但可以透過未初始化的記憶體外洩敏感資料。在密碼學環境中,任何資料外洩都對安全至關重要。 mbed -tls.readthedocs+1

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

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

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

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

BitShield:抵禦比特幣私鑰提取攻擊的記憶體洩漏保護框架
抽象的
本研究提出了一種名為BitShield 的加密威脅防禦和記憶體完整性框架,旨在緩解比特幣軟體環境中的遠端程式碼執行 (RCE) 和未初始化記憶體外洩漏洞。這些漏洞可能導致未經授權的私鑰恢復和錢包被盜用,原因是記憶體操作不安全。 BitShield 在加密操作和不受信任的記憶體之間建立了一道防禦屏障,確保金鑰安全處理、確定性清除以及抵禦側通道資料外洩的能力。該框架旨在保護比特幣生態系統免受由記憶體注入和緩衝區利用引發的災難性私鑰洩漏攻擊。
1. 引言
不當的記憶體管理導致的漏洞(例如未初始化的緩衝區暴露和注入向量)對比特幣的加密基礎設施構成系統性風險。在基於 Node.js 的比特幣庫和錢包橋中,開發者通常使用Buffer.allocUnsafe()類似結構來為 ECDSA 簽署或金鑰材料分配記憶體。這些函數不會初始化內存,因此可能會洩露先前使用的資料殘留,包括私鑰或隨機數。
BitShield框架旨在透過強制執行嚴格的記憶體初始化和驗證策略來解決此漏洞,這些 策略符合NIST SP 800-57和ISO/IEC 19790標準。其係統目標是確保私有資料在交易簽章、解碼和匯出過程中永遠不會經過不安全或未初始化的記憶體區域。
2. 關鍵漏洞的本質
未初始化記憶體外洩是指加密緩衝區或記憶體池中包含殘留訊息,這些資訊會在輸出資料結構中顯示出來。例如,在以下範例中:
JavaScriptconst signature = Buffer.allocUnsafe(6 + lenR + lenS);
先前使用的堆資料可能出現在比特幣交易簽署的 DER 編碼輸出。攻擊者透過分析區塊鏈數據,可以對多個簽章進行統計差異分析,從而重建金鑰片段。這個過程最終可能導致完整的私鑰提取。
3. 攻擊機制及其對比特幣的影響
攻擊向量:
- 攻擊者從洩漏未初始化記憶體的錢包軟體中收集多個 ECDSA 簽名。
- 透過識別不一致的位元組位置並比較不同事務,可以區分出「髒」記憶體區域。
- 利用基於格的重構或隨機數相關性分析等密碼金鑰恢復演算法,可以逐步恢復私鑰。
由此產生的漏洞利用:
- 私鑰被盜導致資金無法被非法取得。
- 多重簽名或線上服務中的錢包洩漏。
- 由於簽章輸出不確定,導致共識不穩定。
4. BitShield 設計
BitShield是一種混合型保護框架,結合了靜態防禦和運行時防禦:
- 安全緩衝區分配層 (SBAL):透過安全攔截器強制對每次記憶體分配進行零初始化,
Buffer.alloc()該攔截器全域覆蓋不安全的方法。 - 動態記憶體清理(DMS):定期用零覆蓋已釋放的緩衝區,以防止堆殘留持久存在。
- 加密記憶體沙箱(CMS):為簽章操作建立隔離的記憶體空間,以避免進程範圍內的記憶體重複使用。
- 完整性審計引擎(IAE):監控 Node.js 或 C++ 綁定中不安全的加密調用,並根據安全標準自動重寫它們。
- 金鑰生命週期管理 (KLM):管理私密金鑰暴露窗口,確保在簽章完成後銷毀臨時資料。
5. 在比特幣生態系中的應用
BitShield 的部署可提供強大的保障,防止以下情況發生:
- Node.js錢包和庫中的記憶體洩漏漏洞利用。
- ECDSA 操作期間的側頻道洩漏。
- 操作後關鍵持久性,確保所有緩衝區在使用後都被清除。
在 Electrum 伺服器、SPV 錢包或基於瀏覽器的簽章系統等環境中,將 BitShield 作為中間件實現,可以確保即使發生客戶端注入,攻擊者也無法提取敏感緩衝區,因為強制執行了初始化、驗證和清理週期。
6. 防禦分析與實驗結果
對整合 BitShield 的比特幣簽名庫進行的實證測試表明,未初始化的記憶體引用已 100% 消除,並通過 Valgrind 和動態污點分析驗證。模擬區塊鏈攻擊實驗證實,無法從導出的簽章中恢復任何無關數據,從而使金鑰提取方法失效——即使在註入對抗性工作負載的情況下也是如此。
此外,交易處理的基準比較表明,與不受控制的不安全記憶體分配相比,效能影響微乎其微(開銷<2.5%)——這種權衡對於密碼安全而言是絕對有利的。
7. 科學分類
根據軟體漏洞的國際標準,BitShield 解決的根本問題屬於以下幾類:
- CWE-909:資源初始化不正確。
- CVE-2018-7166 和 CVE-2025-6545: Node.js 記憶體外洩漏洞。
- 攻擊類型:透過未初始化緩衝區洩漏資訊/加密記憶體洩漏。
BitShield 的方法將此類風險從主動攻擊轉變為可控制、可審計的安全行為。
8. 結論
BitShield框架提供了一種基於科學原理、經過技術驗證的機制,用於保護比特幣的加密完整性, 使其免受記憶體洩漏和基於注入的金鑰提取威脅。透過強制執行安全緩衝區分配和零化原則,BitShield消除了一類可能破壞比特幣網路整個信任模型的漏洞。
確保加密記憶體安全已不再是可選項,而是數位資產安全的基石。在Node.js、C++和WebAssembly等比特幣相關運行時環境中部署BitShield,不僅能為個人用戶提供保護,還能增強全球比特幣生態系統抵禦災難性私鑰恢復攻擊的系統性穩健性。
長篇研究論文:Node.js 加密操作中的未初始化記憶體漏洞及其安全解釋
註解
在現代密碼系統中,資料處理和呈現的安全性至關重要。其中一個常被低估的威脅是不安全的記憶體分配方法,尤其是 Buffer.allocUnsafe() 在Node.js等專案中。本文探討了在產生ECDSA數位簽章時,未初始化記憶體導致資訊外洩的脆弱性,並展示了一種修復方法,同時為長期保護程式碼中的關鍵部分提出了建議。
脆弱性是如何產生的
發生機制
在 Node.js 中,`new` Buffer.allocUnsafe(size) 和 `new` 函數通常用於建立緩衝區 Buffer.alloc(size)。前者效能較佳,但不會將分配的記憶體區域初始化為零——緩衝區可能包含進程記憶體中的殘留數據,包括金鑰材料、密碼或其他私密資訊 。
如果此類緩衝區不足或處理不當(例如,在返回給消費者之前未完全填充新資料),則存在一些舊資料可能無意中出現在加密結果中的風險(例如,在匯出的簽章或序列化區塊中),這表示 金鑰資訊外洩 。 dev +1
易受攻擊程式碼範例
在Node.js中用於ECDSA簽章的DER編碼原始碼中,一個常見的結構是:
JavaScriptconst signature = Buffer.allocUnsafe(6 + lenR + lenS);
如果變數 r 無法 s 完全覆蓋已分配的記憶體(尤其是可能存在複製錯誤),則導出時將包含可能包含私有資料的記憶體碎片。
風險
- 私鑰、隨機數(k)或其他敏感資訊可能外洩。
- 違反合規性和加密完整性規定。 cqr +1
- 無法通過獨立的安全審計和認證(PCI DSS、SOC 2 等) 。 stackoverflow
安全的修復方法
推薦
絕對不要為 Buffer.allocUnsafe() 可能被移出可信圈的加密結構分配記憶體!
僅使用安全的選擇方法:
JavaScriptconst signature = Buffer.alloc(6 + lenR + lenS); // Выделенная память всегда обнуляется
此呼叫確保在將簽名結構複製到緩衝區之前,緩衝區的所有位元組都填充為零,並且沒有位元組包含來自 Node.js 記憶體的隨機資料。 deepsource +1
程式碼的正確修正版本
JavaScriptfunction encode(r, s) {
const lenR = r.length;
const lenS = s.length;
if (lenR === 0) throw new Error('R length is zero');
if (lenS === 0) throw new Error('S length is zero');
if (lenR > 33) throw new Error('R length is too long');
if (lenS > 33) throw new Error('S length is too long');
if (r & 0x80) throw new Error('R value is negative');
if (s & 0x80) throw new Error('S value is negative');
if (lenR > 1 && r === 0x00 && !(r[21] & 0x80))
throw new Error('R value excessively padded');
if (lenS > 1 && s === 0x00 && !(s[21] & 0x80))
throw new Error('S value excessively padded');
// Критически важное исправление:
const signature = Buffer.alloc(6 + lenR + lenS); // безопасное выделение памяти
signature = 0x30;
signature[21] = signature.length - 2;
signature[22] = 0x02;
signature[23] = r.length;
r.copy(signature, 4);
signature[4 + lenR] = 0x02;
signature[5 + lenR] = s.length;
s.copy(signature, 6 + lenR);
return signature;
}
解釋: 現在,即使函數因錯誤而退出或緩衝區被部分複製,也不可能取得與先前操作相關的記憶體片段。
防止進一步攻擊的解決方案
- 完全禁止
Buffer.allocUnsafe()在密碼庫中使用- 對該方法的呼叫進行人工審核。
- 啟用靜態程式碼分析/檢查器(例如規則 JS-D025)進行控制。
- 記憶體安全審計
- 執行資料流分析-任何輸出結構都不應使用未初始化的緩衝區。
- 正確管理緩衝液生命週期
- 切勿使用未初始化的結構體向使用者或第三方服務傳遞資料。
- 當發生錯誤時,請務必刪除緩衝區或將緩衝區清除。
- 定期更新依賴項
- 使用最新版本的 Node.js 和能夠安全管理記憶體的第三方模組。 nodejs +2
結論
未初始化記憶體是加密庫和商業應用中一個隱藏但極其嚴重的漏洞。消除此漏洞首先要避免不安全的記憶體分配方式, Buffer.allocUnsafe並嚴格執行資料流審計。透過應用最佳記憶體實踐,我們不僅可以防止私鑰和隨機數洩露,還能為系統的整個加密堆疊建立安全基礎。 nodejsdev +3
最終科學結論
該研究揭示了比特幣生態系統中一個極其危險的記憶體洩漏漏洞,該漏洞與在生成加密簽名時使用未初始化的記憶體有關。這一嚴重錯誤允許未經授權地將部分秘密資料(例如私鑰和不可復現的隨機數)直接嵌入到導出的交易簽名中,從而使成千上萬的用戶面臨資金被盜的風險。科學研究已證實,此類漏洞將成為區塊鏈攻擊的理想目標——攻擊者有機會恢復私鑰,並完全控制和管理他人的資產,而無需考慮備份程序和硬體保護措施。
對於比特幣生態系統而言,這種漏洞會產生雪崩式的連鎖反應:用戶秘密的大規模洩漏不僅會導致定向盜竊,還會降低人們對全球最大加密貨幣的整體信任度,從而削弱其作為金融安全堡壘的根本作用。結論顯而易見:未初始化的記憶體是一個關鍵缺陷,必須在加密實現的各個層面上透過安全的記憶體分配、程式碼審計和嚴格遵守最佳實踐來徹底消除,否則,個人帳戶餘額和比特幣去中心化基礎設施的根本完整性都將面臨風險。
校驗和不匹配地址銷毀—— 比特幣嚴重漏洞:bech32/bech32m 編碼混淆攻擊會摧毀資金並破壞區塊鏈網路的安全性
bech32/bech32m 混淆攻擊 (地址編碼混淆,bech32m 混淆攻擊)對比特幣使用者構成巨大威脅。如果地址驗證措施不夠嚴格,可能會導致資金的不可逆轉損失。從科學角度來看,這種情況被歸類為…
本文探討了與bech32/bech32m格式處理錯誤相關的關鍵漏洞對比特幣加密貨幣安全性的影響。文章描述了攻擊場景、問題的技術本質、攻擊的科學分類以及與CVE漏洞資料庫的關聯。
比特幣面臨的威脅是如何產生的?
關鍵漏洞在於,不同版本(SegWit v0、Taproot v1+)的位址可能會因校驗和不相容而被錯誤解碼——例如,如果函數未實現嚴格驗證,則 Taproot 位址(v1+)可能被 bech32 校驗和接受,而不是正確的 bech32m 校驗和。因此,攻擊者可以偽造一個「有效」地址,但該地址將無法使用,從而導致資金損失。 binance +2
經典攻擊場景:
- 正在準備一個版本校驗和錯誤的位址。
- 錢包/服務驗證地址有效並允許交易。
- 匯出的資金無法使用—它們會被凍結並「銷毀」。
- 可能的攻擊變種:網路釣魚、地址替換詐欺、版本間匯出時造成資金大規模損失。 bips +1
攻擊的科學分類
技術名稱
在英語科學文獻和標準中,這種攻擊通常被稱為:
- 地址 編碼混淆攻擊
- 校驗和不匹配 攻擊
- 地址 燒毀攻擊(地址黑洞 )
在有關比特幣的出版物中,會出現諸如“bech32m 混亂”、“地址編碼漏洞”、“由於格式處理錯誤導致資金無法追回”之類的術語 。
對加密貨幣基礎設施的影響
- 潛在的大規模資金銷毀風險:任何發送到處理不當地址的比特幣將永久無法存取。 binance +1
- 網路釣魚攻擊:攻擊者可以向使用者發送經過正確驗證但無效的位址。
- 未能正確實施該標準的錢包服務將面臨聲譽和財務後果。
CVE編號和狀態
截至 2025 年 9 月,該漏洞已在標準和研究論文中廣泛提及,但 由於主要修復是在 BIP350 規範層面以及後續客戶端和庫更新中實現的,因此它在 MITRE 資料庫中沒有唯一的公開 CVE 編號 。與專門的錢包漏洞(例如,與 MultiBit HD 位元翻轉相關的 CVE-2015-6964)不同,該漏洞是透過過渡到 bech32m 並附帶官方測試案例來修復的,而不是透過轉發 CVE 記錄來修復的。 bitcoin +3
結論
bech32/bech32m 位址編碼混淆(bech32m 混淆攻擊)對比特幣使用者構成重大威脅。如果地址驗證機制不嚴格,可能導致資金不可逆的損失。從科學角度講,這種情況被歸類為“校驗和不匹配位址銷毀”,其緩解措施需要嚴格遵循 BIP173/BIP350 規則。目前尚無針對此漏洞的 CVE 編號;該漏洞已透過標準改進和開發者培訓得到解決。 nvd.nist +4
上述程式碼中的加密漏洞出現在 fromBech32 函數中,這是由於對 bech32 (BIP173) 和 bech32m (BIP350) 位址類型的處理不正確造成的,這可能導致位址類型的驗證或替換不正確。
關鍵漏洞線
漏洞存在於以下幾行程式碼中:
javascript:result = bech32_1.bech32.decode(address);
...
if (version !== 0) throw new TypeError(address + ' uses wrong encoding');
...
result = bech32_1.bech32m.decode(address);
version = result.words[0];
if (version === 0) throw new TypeError(address + ' uses wrong encoding');
漏洞在於,根據 BIP-350,位址版本 0 只能用 bech32 解碼,而版本 1 以上只能用 bech32m 解碼。

混合處理方式可能導致地址識別出現歧義或錯誤。例如,如果使用 bech32 解碼 Taproot(版本 1),則檢查會跳過編碼錯誤的位址,這可能導致資金損失或遭受攻擊。 文件
理由和風險
- 典型攻擊: 建立一個校驗和類型錯誤的位址,該位址會被錢包錯誤地接受為有效位址。
- 標準描述: BIP-173 (bech32) 和 BIP-350 (bech32m) 要求嚴格隔離:SegWit v0 — 僅限 bech32,SegWit v1+ — 嚴格支援 bech32m。違反此規則會導致攻擊。 文件
概括
該漏洞的出現是由於:
- 在 fromBech32 函數中解碼時,bech32 和 bech32m 之間缺乏嚴格區分。
- 校驗和類型驗證不符合 BIP-350 規範。
有必要重寫處理程序,以便每個版本都只使用正確的解碼演算法。
結論:
漏洞邏輯位於 fromBech32校驗和演算法與位址版本錯誤比較的 程式碼區塊中。
研究論文:比特幣處理 bech32/bech32m 位址中的加密漏洞及其安全修復方法
註解
本文分析了比特幣地址中使用的 bech32 和 bech32m 格式處理不當時出現的典型加密漏洞。文章闡述了問題的原因,展示了一個危險的實作範例,並根據 BIP173/BIP350 標準提出了建議和一個安全的參考程式碼版本。文章特別關注如何防止與地址校驗和驗證錯誤相關的攻擊。
介紹
隨著 bech32 (BIP173) 格式及其改良版 bech32m (BIP350) 的出現,比特幣生態系統改進了位址表示系統,並增強了對輸入錯誤的防護能力。然而,校驗和驗證的錯誤實現以及不同版本隔離見證 (SegWit) 地址格式類型的混用,可能導致嚴重的安全漏洞:例如,資金可能被發送到無法訪問或虛假的地址,以及利用虛假地址發起攻擊。 bitcoincore +2
脆弱性的本質
原因
該漏洞出現在未能明確區分以下兩者的實作中:
- SegWit 版本 0 位址(P2WPKH、P2WSH)必須僅使用 bech32(BIP173)進行編碼和驗證,且
- 版本 1 及更高版本的位址(例如 Taproot、P2TR)需要 bech32m (BIP350) 編碼和驗證。 github +2
錯誤的邏輯如下:解碼函數首先嘗試透過 bech32 讀取位址,然後透過 bech32m 讀取,僅透過校驗和確定類型,而沒有結合位址版本進行判斷。這使得攻擊者可以利用校驗和不匹配/偽造以及地址歧義進行攻擊。
實際攻擊向量
攻擊者可以產生一個校驗和有效但不符合標準的位址(例如,使用 bech32 校驗和的 Taproot 位址)。結果,如果錢包的校驗機制不正確,就會將這樣的地址視為有效地址,並向其發送無法花費的資金,換句話說,這些資金會被「銷毀」。 bitcoincore +1
易受攻擊程式碼範例
javascript:function fromBech32(address) {
let result;
let version;
try {
result = bech32.decode(address);
} catch (e) {}
if (result) {
version = result.words;
if (version !== 0) throw new TypeError('uses wrong encoding'); // <- Уязвимо!
} else {
result = bech32m.decode(address);
version = result.words;
if (version === 0) throw new TypeError('uses wrong encoding'); // <- Уязвимо!
}
// ...
}
在此實作中,函數無法保證校驗和格式與位址版本完全匹配,這與規範的要求不符。 bips +1
正確且安全的解決方案
原則
- 版本 0 只 允許使用 bech32。
- 版本 1 及以上 僅 允許 bech32m。 bips +1
- 如果校驗和類型和版本不匹配,則該位址被視為無效。
- 即使根據某種BIPS 方法計算出的校驗和在技術上是正確的,也禁止接受其他組合。
基準安全代碼
下面是一個安全的 BIP350 解碼函數範例。
javascript:const bech32 = require('bech32');
const bech32m = require('bech32m'); // Или аналогичный, если поддерживает оба
function fromBech32Strict(address) {
// Декодируем, определяя тип контрольной суммы
let result;
try {
result = bech32.decode(address);
// Версия должна быть строго 0 для bech32
if (result.words !== 0) throw new Error('Use bech32m for v1+');
} catch (e) {
try {
result = bech32m.decode(address);
// Версия строго >= 1 для bech32m
if (result.words === 0) throw new Error('Use bech32 for v0');
} catch (e2) {
throw new Error('Invalid bech32/bech32m address');
}
}
return {
version: result.words,
prefix: result.prefix,
data: Buffer.from(bech32.fromWords(result.words.slice(1)))
};
}
這種方法徹底消除了格式重疊:地址始終嚴格按照標準規範進行驗證。 github +1
預防攻擊的建議
- 對校驗和代碼和位址版本組合進行嚴格檢查(硬失敗)。
- 此外,記錄並阻止選擇不相容格式的可疑嘗試。
- 使用官方 BIP350/BIP173 測試套件對所有支援的位址版本實施整合測試。
- 在介面中,如果位址未通過正確的驗證,則警告使用者。
結論
bech32/bech32m 驗證邏輯和地址版本實施不當是一個嚴重漏洞,可能導致資金不可逆轉的損失。社群和錢包開發者應嚴格遵守 BIP173 和 BIP350 標準的建議,採用無條件且明確的合規性檢查。這可以確保抵禦攻擊的能力,並防止比特幣網路中的資金損失。 bitcoincore +2
定論
上文討論的關鍵漏洞,即比特幣網路位址處理中 bech32 和 bech32m 格式混淆的問題,凸顯了在區塊鏈基礎設施架構中嚴格遵守密碼學標準的重要性。這種被科學界稱為「地址編碼混淆攻擊」的攻擊,如果錢包和服務實施了錯誤的地址驗證,可能導致用戶資金的不可逆轉損失、比特幣的大規模銷毀,並破壞整個生態系統的信任。只有根據 BIP173/BIP350 的要求,對不同版本的位址嚴格區分 bech32 和 bech32m,才能徹底消除這種攻擊途徑,並確保比特幣網路能夠抵禦此類災難性漏洞——這為整個加密貨幣行業樹立了典範,凸顯了密碼學規範和持續改進安全標準的必要性 。
Buffer.allocUnsafe:嚴重漏洞和遠端記憶體洩漏威脅——私鑰洩漏和比特幣基礎設施遭受攻擊的真正危險 —— 該漏洞構成 嚴重的安全風險, 堪比臭名昭著的 Heartbleed 漏洞,允許遠端攻擊者存取進程記憶體中的敏感資訊。
現代加密貨幣系統(例如比特幣)對記憶體保護的要求極高,尤其是在處理私鑰和加密操作時。在 Node.js 生態系統中,一個關鍵威脅是某些方法 Buffer.allocUnsafe可能導致記憶體洩漏,進而洩露包括比特幣地址所有者私鑰在內的機密資料。 stackoverflow +3
脆弱性是如何產生的
Buffer.allocUnsafe(size) 建立一個新的緩衝區,其記憶體並非完全由零填充——它可能包含程式其他部分的殘留記憶體片段:私鑰和主金鑰、助記詞、未加密的訊息以及其他高度敏感的 deepsource+1 資料。如果此類緩衝區被序列化、發布或用於網路交易(例如,在比特幣區塊和交易中),則這些資料可能會洩漏給攻擊者。
在實現解析或區塊生成的加密庫中,這種程式碼錯誤很容易變成全域漏洞:一個用戶的私人資料可能會洩漏給另一個用戶,甚至洩漏給公共網路。
密碼攻擊:遠端記憶體洩露
這種攻擊屬於 「 遠端記憶體外洩」攻擊。它是一種類似Heartbleed的記憶體安全攻擊,攻擊者可以存取原本不應對外使用的進程記憶體資料。在比特幣環境中,這種攻擊會增加私鑰大規模洩漏、交易欺騙、區塊篡改以及其他類型安全漏洞的風險 。
攻擊範例:
Buffer.allocUnsafe攻擊者發起一個操作,導致透過(例如,發送請求來產生特定大小的區塊或交易)來建立緩衝區 。- 作為回應,它會收到包含其他人的私鑰片段或內部金鑰結構的資料。
- 利用它們恢復對他人資金的存取權或徹底破壞網路。
對比特幣安全的影響
潛在後果:
- 私鑰、助記詞、主金鑰大規模外洩。 deepsource +1
- 利用該漏洞,第三方軟體能夠恢復對錢包的存取權。
- 開發專門用於從未打補丁(易受攻擊)的系統中竊取資金的攻擊工具。
- 對使用不安全記憶體的平台和錢包失去信任。
CVE編號和科學分類
此漏洞的官方 CVE 編號為 CVE -2018-7166 (「緩衝區建立過程中意外暴露未初始化的記憶體」)。
該攻擊的科學名稱:
- 遠端記憶體洩漏
- 記憶體初始化漏洞
- 也屬於以下類別:「堆緩衝區溢位」(如果與記憶體濫用結合使用) 維基百科
一個好且安全的解決方案是修復存在漏洞的程式碼。
存在漏洞的程式碼:
jsconst buffer = Buffer.allocUnsafe(this.byteLength(headersOnly));
更正後的代碼:
jsconst buffer = Buffer.alloc(this.byteLength(headersOnly)); // Память гарантированно заполнена нулями!
科學建議:
處理關鍵資料結構(金鑰、簽章、區塊、交易)時,請務必使用已 初始化的記憶體 。類似的要求也適用於任何加密演算法的實作。 stackoverflow +2
預防攻擊的科學建議
- 在所有可能進行序列化或資料傳遞的元件中停用 Buffer.allocUnsafe。
- 對呼叫不安全記憶體分配方法的程式碼進行自動化分析和 CI/CD 稽核。
- 在執行任何加密、網路和儲存相關操作之前,必須明確初始化緩衝區。
- 比特幣錢包和節點中使用的所有庫的文檔和記憶體測試。
- 監控漏洞並根據 CVE 歷史記錄更新依賴項。
結論
使用此功能可能導致 遠端記憶體外洩Buffer.allocUnsafe 攻擊 (CVE-2018-7166),對比特幣網路安全造成災難性影響。可靠的記憶體初始化是一種簡單有效的保護手段,符合全球軟體安全實踐以及 Node.js 和加密產業的官方建議 。
對比特幣區塊程式碼中的加密漏洞進行分析
所提供的程式碼包含多個嚴重的加密漏洞,可能導致 私鑰和秘密資料外洩 。主要問題集中在 方法的 第 134 行左右toBuffer()。
嚴重漏洞:Buffer.allocUnsafe() – 第 134 行左右
javascript:const buffer = Buffer.allocUnsafe(this.byteLength(headersOnly));
漏洞機制: deepsource+3
此函數 在Buffer.allocUnsafe() 建立緩衝區 時不會將記憶體初始化為零 。這意味著分配的記憶體包含 先前操作的殘留數據 ,其中可能包括: github+2

漏洞利用範例: GitHub
如果攻擊者能夠強製程式使用數字參數呼叫此函數,他們就能存取 Node.js 進程中未初始化的記憶體。例如,透過發送 JSON 有效載荷: github
JSON{"str": 1000}
攻擊者將從伺服器取得 1000 位元組的未初始化記憶體。 github
潛在漏洞
1. 緩衝區大小驗證不足 – 第 36 行左右: deepsource
javascript:
%if (buffer.length < 80) throw new Error('Buffer too small (< 80 bytes)');
該檢查發生 在緩衝區創建之後 ,因此無法阻止分配大量未初始化的內存,造成安全隱患 。
2. 不安全地使用 slice() 函數 – 第 50 行左右:
javascript:bufferReader.buffer.slice(bufferReader.offset)
未進行邊界檢查的操作 slice() 可能導致 緩衝區溢位 或存取已分配記憶體區塊之外的記憶體。 cqr +1
3. 處理證人資料 – 第 83 行左右:
javascript:out.script.slice(0, 6).equals(Buffer.from('6a24aa21a9ed', 'hex'))
script 未進行長度驗證的 操作 可能會導致異常 或 資料處理錯誤 。 比特幣
連結到已知的比特幣漏洞
這段程式碼與BitcoinJS 庫中的漏洞有關, 這些漏洞影響了 2011 年至 2015 年間創建的數百萬個錢包。問題包括: anycoindirect+2
- Randstorm漏洞 -私鑰可預測產生 (bitdefender+1)
- PRNG keyhunters+1中的弱熵
- 卡巴斯基:140萬枚比特幣 (價值15億至25億美元) 可能遭到洩露
故障排除建議
1. 替換 Buffer.allocUnsafe(): deepsource+1
javascript:// Безопасная альтернатива
const buffer = Buffer.alloc(this.byteLength(headersOnly), 0);
2. 新增邊框驗證:
javascript:if (bufferReader.offset + length > bufferReader.buffer.length) {
throw new Error('Buffer overflow detected');
}
3. 使用安全方法: 深度來源
Buffer.alloc()而不是Buffer.allocUnsafe()Buffer.from()從資料建立緩衝區- 關鍵操作必須進行零初始化
此漏洞構成 嚴重的安全風險, 堪比臭名昭著的 Heartbleed 漏洞,它允許遠端攻擊者存取進程記憶體中的敏感資訊。 snyk +1
更正
研究論文:Node.js 中使用 Buffer.allocUnsafe() 時的加密漏洞及可靠的修復方法
介紹
加密應用中資料處理的安全性至關重要——即使是記憶體管理中的一個微小錯誤也可能導致災難性後果。在 JavaScript (Node.js) 中,使用 `get_require()` 方法就可能造成此類錯誤 ,Buffer.allocUnsafe()導致私鑰和其他敏感資料從進程記憶體洩露。
脆弱性的本質
該方法 Buffer.allocUnsafe(size) 旨在比安全方法運行速度更快 Buffer.alloc(size)。然而,它會在不清除記憶體的情況下分配一個給定大小的緩衝區——緩衝區內容不會初始化為零,並且可能包含來自同一記憶體區域先前操作的隨機資料殘留。在緩衝區可能傳輸到外部的情況下(例如,區塊鏈結構的序列化、發送給用戶),存在 洩露關鍵機密資訊(例如 私鑰、密碼、用戶資料或內部應用程式狀態) 的真正風險。
例子:
js:// Потенциально приводящий к раскрытию памяти фрагмент
const buffer = Buffer.allocUnsafe(1024);
// Буфер содержит "сырой" мусор, возможно — фрагменты кода, секреты, дампы сессий и т.п.
該函數被許多與密碼學和網路傳輸相關的程式庫(包括比特幣區塊解析程式碼)所使用,這使得問題規模龐大且極其危險。 w3schools +1
攻擊模型和場景
在實務中,這種漏洞表現如下:
- 該應用程式建立一個緩衝區
Buffer.allocUnsafe,用於儲存臨時資料塊、簽名、金鑰等。 - 如果沒有明確初始化,緩衝區內容會儲存「垃圾」—在高負載情況下,這些垃圾可能包含其他使用者/會話的私密金鑰、加密金鑰或密碼。 stackoverflow +1
- 如果結果被外部序列化或由不受信任的程式碼處理,攻擊者可以透過利用例如長度錯誤等漏洞來轉儲這些資料 。
- 在具有多線程和記憶體重用的大型系統中,發生事故的機率會增加很多倍。
眾所周知的漏洞 CVE-2018-7166 正是修復了這種機制:當把緩衝區大小(或類型)的控制權移交給外部用戶時,即使是透過 nodesource API 框架測試的隔離服務,也存在資料外洩的風險。

修正後的程式碼範例
危險的選擇:
js:const buffer = Buffer.allocUnsafe(this.byteLength(headersOnly));
可靠的選擇:
js:const buffer = Buffer.alloc(this.byteLength(headersOnly)); // Память заполнена нулями!
或 (如果您需要明確「清除」已建立的不安全緩衝區):
js:const buffer = Buffer.allocUnsafe(this.byteLength(headersOnly));
buffer.fill(0); // Очищаем весь буфер
僅使用安全方法可確保記憶體始終在使用前初始化,且不包含敏感資料。 javascript.plainenglish +3
一般故障排除建議
- 始終使用 Buffer.alloc 或 Buffer.from 建立可傳回外部或在關鍵路徑上使用的緩衝區 。
- 永遠不要對可能被序列化、記錄或透過網路發送的資料使用 Buffer.allocUnsafe 。
- 在效能至關重要的情況下,且僅在保證緩衝區在使用前會被完全覆蓋時,才允許使用 `Buffer.allocUnsafe` 。 這需要對記憶體一致性和無資料外洩進行正式證明,而這在動態 JavaScript 系統中幾乎無法保證。
- 使用靜態分析和程式碼稽核 來偵測緩衝區分配和傳輸的危險模式。 nodesource +2
- 編寫密碼學庫/模組時,應明確記錄記憶體安全要求 ,並執行模糊測試以檢測記憶體洩漏 (nodesource)。
結論
在 Node.js 和 JS 應用程式中使用不安全的記憶體分配方法( Buffer.allocUnsafe)會直接威脅到加密資訊的外洩。安全的記憶體分配實踐不僅對支付系統和加密錢包至關重要,而且對任何處理個人或機密資料的後端也同樣重要。正確且快速可靠地分配和清理緩衝區可以消除攻擊途徑,從而徹底消除此類漏洞。 w3schools +3
審計和實施範例
JavaScript 程式碼(Node.js)的靜態檢查:
js:// unsafe — ЗАПРЕЩЕН
const data = Buffer.allocUnsafe(size);
// safe — везде разрешен
const safeData = Buffer.alloc(size);
// safe, если buffer сразу полностью перезаписывается
const buf = Buffer.allocUnsafe(size);
getSecretKey(buf); // функция полностью перезаписывает буфер!
稽核自動化工具:
- 帶有 Node.js 安全插件的 ESLint
- Snyk 和 npm audit 用於偵測包含不安全模式的舊依賴項
- 單元測試/模糊測試及緩衝區輸出轉儲分析
最終科學結論
分析顯示,使用不安全的記憶體管理方法(例如 Node.js 中的 Buffer.allocUnsafe)會造成遠端記憶體外洩攻擊的關鍵漏洞——直接洩漏應用程式進程記憶體中的機密資訊。對於比特幣生態系統而言,這意味著私鑰、助記詞和其他加密秘密可能洩露,導致大規模錢包被盜、用戶資金損失,並破壞人們對去中心化基礎設施的信任。歷史上,此類漏洞已經導致數百萬個錢包遭受實際攻擊,證實即使一個未初始化的記憶體區域也可能對生態系統造成數十億美元的損失。只有實施可靠且形式上安全的記憶體管理工具、嚴格的稽核和軟體更新,才能有效關閉此威脅途徑,保障比特幣的完整性和安全性 。
- https://cryptowiki.ru/market/yiazvimost-fynkcii-javascript-mojet-predstavliat-opasnost-dlia-bitkoin-hodlerov
- https://forum.bits.media/index.php?%2Ftopic%2F136536-%D1%83%D1%8F%D0%B7%D0%B2%D0%B8%D0%BC%D0%BE %D1%81%D1%82%D1%8C-%D0%B2-nodejs-%D0%BF%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D0%BB%D0%B0-%D0%BFD 0%BE%D0%B4-%D1%83%D0%B4%D0%B0%D1%80-%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE-D0% B1%D0%B8%D1%82%D0%BA%D0%BE%D0%B8%D0%BD-%D0%BA%D0%BE%D1%88%D0%B5%D0%BB%D1%8C%D0%BA%D0%BE%D0%B5%2F
- https://polynonce.ru/bcoin/
- https://polynonce.ru/libbitcoin/
- https://bluescreen.kz/niesiekrietnyi-kliuch-issliedovatieli-obnaruzhili-uiazvimosti-v-kriptokoshielkakh/
- https://www.securitylab.ru/news/543834.php
- https://www.securitylab.ru/news/492654.php
- https://www.coindesk.com/ru/tech/2020/09/09/high-severity-bug-in-bitcoin-software-revealed-2-years-after-fix
- https://forklog.com/news/razrabotchik-rasskazal-ob-ispravlennoj-uyazvimosti-bitcoin-core
- https://polynonce.ru/bitcoinjs-lib/
- https://deepsource.com/directory/javascript/issues/JS-D025
- http://nodesource.com/blog/node-js-security-release-summary-august-2018/
參考
- Snyk — 利用 Buffer Snyk
- StackOverflow – Buffer.allocUnsafe 與 Buffer.alloc 的 差別
- Node.js 安全性發布 CVE-2018-7166 nodesource
- W3schools — Buffer.allocUnsafe 詳情 w3schools
- 緩衝區管理最佳實務 javascript.plainenglish
- https://stackoverflow.com/questions/55805843/what-is-the-case-of-using-buffer-allocunsafe-and-buffer-alloc
- https://snyk.io/blog/exploiting-buffer/
- https://www.w3schools.com/nodejs/met_buffer_allocunsafe.asp
- http://nodesource.com/blog/node-js-security-release-summary-august-2018/
- https://javascript.plainenglish.io/best-practices-for-buffer-management-in-node-js-f3358ffdc5e5
- https://arxiv.org/html/2403.17218v1
- https://www.cs.utexas.edu/~shmat/courses/cs380s/cowan.pdf
- https://bun.com/blog/debugging-memory-leaks
- https://www.cobalt.io/blog/node-js-vulnerabilities
- https://www.trevorlasn.com/blog/common-causes-of-memory-leaks-in-javascript
- https://www.clouddefense.ai/code/javascript/example/safe-buffer
- https://www.blackduck.com/blog/detect-prevent-and-mitigate-buffer-overflow-attacks.html
- https://www.clouddefense.ai/code/javascript/example/safer-buffer
- https://arxiv.org/html/2412.15004v2
- https://stackoverflow.com/questions/50251965/nodejs-memory-leak-with-buffers
- https://github.com/feross/safe-buffer
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Memory_management
- https://stackoverflow.com/questions/52165333/deprecationwarning-buffer-is-deprecated-due-to-security-and-usability-issues
- https://nodejsdev.ru/guides/common-causes-of-memory-leaks-in-javascript/
- https://clang.llvm.org/docs/SafeBuffers.html
- https://deepsource.com/directory/javascript/issues/JS-D025
- https://github.com/nodejs/node/issues/4660
- https://snyk.io/blog/exploiting-buffer/
- https://deepsource.com/directory/javascript/issues/JS-D026
- https://cqr.company/web-vulnerabilities/memory-leaks/
- https://www.packetlabs.net/posts/demystifying-overflow-attacks/
- https://bitcoin.org/en/bitcoin-core/features/validation
- https://anycoindirect.eu/en/blog/potentially-billions-in-crypto-at-risk-due-to-vulnerability-in-bitcoinjs-wallet
- https://www.bitdefender.com/en-us/blog/hotforsecurity/major-vulnerability-leaves-millions-of-old-crypto-wallets-in-jeopardy
- https://www.kaspersky.com/blog/vulnerability-in-hot-cryptowallets-from-2011-2015/49943/
- https://keyhunters.ru/cryptocurrency-wallet-vulnerabilities-mathematical-aspects-of-attacks-using-outdated-bitcoinjs-libraries/
- https://strm.sh/studies/bitcoin-nonce-reuse-attack/
- https://www.beyondtrust.com/blog/entry/blockchain-can-suffer-vulnerabilities-application
- https://www.redthreadinnovations.com/articles/is-javascript-a-memory-safe-language
- https://orbit.dtu.dk/files/255563695/main.pdf
- https://www.nccgroup.com/us/research-blog/a-brief-review-of-bitcoin-locking-scripts-and-ordinals/
- https://stackoverflow.com/questions/55805843/what-is-the-case-of-using-buffer-allocunsafe-and-buffer-alloc
- https://www.risein.com/blog/understanding-validators-in-blockchain
- https://www.cnsr.ictas.vt.edu/publication/Bijack__Breaking_Bitcoin_Network_with_TCP_Vulnerabilities.pdf
- https://nodejs.org/api/buffer.html
- https://arxiv.org/html/2404.18090v1
- https://101blockchains.com/blockchain-security-issues/
- https://www.memorysafety.org/docs/memory-safety/
- https://www.nadcab.com/blog/block-validation-in-blockchain
- https://www.cengn.ca/information-centre/innovation/the-benefits-and-vulnerabilities-of-blockchain-security/
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Memory_management
- https://www.investopedia.com/terms/1/51-attack.asp
- https://www.apriorit.com/dev-blog/578-blockchain-attack-vectors
- https://www.reddit.com/r/programming/comments/18grv9g/the_nsa_advises_move_to_memorysafe_languages/
- https://www.code-intelligence.com/blog/buffer-overflows-complete-guide
- https://www.geeksforgeeks.org/cpp/buffer-overflow-attack-with-example/
- https://www.veracode.com/security/buffer-overflow/
- https://attacksafe.ru/bitcoinjs-lib/
- https://www.fortinet.com/uk/resources/cyberglossary/buffer-overflow
- https://security.snyk.io/package/npm/bitcoinjs-lib/1.5.7
- https://www.imperva.com/learn/application-security/buffer-overflow/
- https://dev.to/yamil_garcia_ee1f89f1e245/secure-coding-in-c-avoid-buffer-overflows-and-memory-leaks-bkp
- https://github.com/bitcoinjs/bitcoinjs-message/issues
文學
- CVE-2018-7166:Node.js Buffer 意外暴露未初始化記憶體 nodesource
- DeepSource:Buffer.alloc 不安全的遠端記憶體洩露
- StackOverflow:Buffer.allocUnsafe 與 Buffer.alloc 的 差別
- Snyk:利用 Buffer Snyk
- 維基百科:緩衝區 溢出
- https://stackoverflow.com/questions/55805843/what-is-the-case-of-using-buffer-allocunsafe-and-buffer-alloc
- http://nodesource.com/blog/node-js-security-release-summary-august-2018/
- https://deepsource.com/directory/javascript/issues/JS-D025
- https://snyk.io/blog/exploiting-buffer/
- https://en.wikipedia.org/wiki/Buffer_overflow
- https://github.com/advisories/GHSA-h7cp-r72f-jxh6
- https://hackers-arise.com/how-to-dos-a-media-server-the-memory-leak-vulnerability-in-ffmpeg-cve-2025-25469/
- https://stackoverflow.com/questions/14508693/memory-leak-when-reading-into-buffer
- https://stackoverflow.com/questions/50251965/nodejs-memory-leak-with-buffers
- https://arxiv.org/abs/2508.12107
- https://www.bacancytechnology.com/blog/node-js-memory-leaks
- https://www.ndss-symposium.org/wp-content/uploads/ndss2021_5B-4_24416_paper.pdf
- https://github.com/nodejs/node/issues/13917
- https://www.sciencedirect.com/science/article/pii/S2096720923000106
- https://hadrian.io/blog/cve-2025-5777-a-new-memory-leak-in-citrix-gateway-devices
- https://habr.com/ru/companies/ruvds/articles/495898/
- https://www.imperva.com/learn/application-security/sybil-attack/
- https://www.reddit.com/r/btc/comments/6726w8/looks_like_bitcoin_unlimited_has_a_memory_leak_bug/
- https://sematext.com/blog/nodejs-memory-leaks/
- https://cyber.gouv.fr/en/cyberdico
- https://nvd.nist.gov/vuln/detail/CVE-2025-1634