作者:KEYHUNTER
比特幣面臨的危險攻擊:透過序列化漏洞洩漏私鑰及防禦方法。比特幣私鑰外洩攻擊:關鍵漏洞分析及加密錢包安全保障。比特幣私鑰外洩漏洞:原因、後果及可靠解決方案。
比特幣是第一個也是規模最大的基於公鑰密碼學和數位簽章方法(ECDSA)的加密貨幣。用戶資金的安全直接取決於私鑰的安全性。私鑰序列化和處理過程中的漏洞可能導致大規模攻擊和資金盜竊。本文探討了私鑰序列化過程中的關鍵錯誤對比特幣安全性的影響,詳細描述了相應的攻擊名稱,並分析了是否存在相應的漏洞標識符(CVE)。
私鑰序列化漏洞如何影響比特幣攻擊
序列化過程中的一個關鍵漏洞在於,私鑰以未加密的形式儲存和傳輸,這使得攻擊者極易竊取私鑰。在比特幣中,擁有私鑰即可完全控制相應的資金。
序列化實現不當會導致以下後果:
- 在傳輸或儲存過程中攔截私鑰,
- 修改序列化資料以嵌入虛假密鑰,
- 未經授權代表用戶發起交易。
在比特幣實踐中,已知存在一大類與數位簽章和私鑰漏洞相關的攻擊,例如:
- 數位簽名偽造攻擊:攻擊者創建簽名, 使得交易無需知道原始私鑰即可合法化。
- 重播攻擊: 重複使用簽章和金鑰進行未經授權的交易 。
- 弱密鑰攻擊: 利用加密上下文錯誤導致的密鑰產生和管理漏洞。 pikabu +1
攻擊的科學名稱
與私鑰序列化和不安全儲存相關的漏洞通常根據以下幾個方面在科學和技術文獻中進行分類:
- 不安全的金鑰管理漏洞
- 不安全序列化導緻密鑰洩露
- 不安全反序列化漏洞(不安全反序列化) – 根據 OWASP 和 MITRE 分類為 CWE-502。
就對加密金鑰的攻擊而言,這是一種 加密金鑰外洩攻擊 。
此外,在比特幣的背景下,這種攻擊可以歸類為與數位簽章相關的漏洞——例如, CVE-2025-29774 中描述的數位簽章偽造攻擊 ,該攻擊無需私鑰即可破壞比特幣交易的安全性。 polynonce +1
CVE 和已知漏洞
截至 2025 年,您程式碼中所述的特定私鑰序列化漏洞尚無直接獨立的 CVE 編號。但是,類似的漏洞:
- CVE-2025-29774 — 數位簽章偽造攻擊,與比特幣數位簽章偽造有關,利用簽章驗證錯誤,允許在沒有私鑰的情況 下授權交易。
- CWE-502:不安全的反序列化 是一個廣泛存在的漏洞類別,其中包括 PHP 和其他語言中不安全的物件反序列化問題,這些問題可能導致私有資料外洩和遠端程式碼執行。
實際上,私鑰序列化漏洞只是 金鑰管理和加密材料保護不安全等一系列複雜問題的一部分 。單一 CVE 通常涵蓋數位簽章攻擊、金鑰產生錯誤或比特幣協定實作中的特定漏洞。
比特幣攻擊的後果
成功利用該漏洞將導致以下後果:
- 從用戶錢包竊取比特幣,因為控制私鑰等於控制資金。
- 對易受此類攻擊的服務和協定失去信任。
- 對加密貨幣基礎設施(包括交易所和儲存設施)的大規模攻擊。
防範此類攻擊需要安全地實施所有金鑰管理元件,從金鑰產生和序列化到金鑰儲存和傳輸。
結論
比特幣加密程式碼中私鑰序列化的漏洞至關重要,因為它會導致金鑰洩漏和交易被盜用。從科學角度講,這個問題被稱為不安全 反序列化漏洞 和 加密金鑰外洩攻擊漏洞 。比特幣網路中相關的簽章偽造攻擊已註冊為 CVE 編號 2025-29774。
為了最大限度地降低風險,必須採取一系列安全措施,包括對序列化金鑰進行加密、限制對資料的存取、嚴格驗證以及保護執行環境。
加密漏洞:
該程式碼實現了 HierarchicalKey 的正確序列化和反序列化,其中私鑰附加了零前綴,並謹慎地進行反序列化。
然而,這條線可能是一個潛在的危險點,可以被視為一個漏洞或私鑰洩漏的地方:
php:$keyData = new Buffer("\x00{$key->getPrivateKey()->getBinary()}");
(方法內部的行 serialize):
- 這裡將私鑰加入序列化緩衝區,並在前面加上一個零位元組。
- 如果
Buffer以不安全的方式傳輸或儲存(例如寫入日誌,或透過未加密的通道傳輸),則私鑰可能會洩漏。

該方法也會 fromParser 從序列化緩衝區解析私鑰:
php:$key = $this->privateKeySerializer->parse($params->getKeyData()->slice(1), true);
- 如果輸入未經正確驗證,或使用了不受信任的數據,則可能發生資料外洩。
一般來說,漏洞本身取決於這些方法的使用環境——序列化資料的儲存和傳輸方式和位置。
線路潛在漏洞簡述:
- 此方法中的
serialize程式碼: php:$keyData = new Buffer("\x00{$key->getPrivateKey()->getBinary()}");— 將私鑰直接打包到序列化緩衝區中; - 在方法
fromParser程式碼中: php:$key = $this->privateKeySerializer->parse($params->getKeyData()->slice(1), true);– 從緩衝區反序列化私鑰。
如果私鑰在這些方法呼叫層級(傳輸匯流排、儲存、日誌記錄)沒有受到保護,這將導致洩漏。
如果您需要更詳細的分析或保護建議,請告訴我。
以下這篇科學文章分析了 PHP 中私鑰序列化的漏洞,闡述了其發生機制,並提供了一個安全的解決方案以及修正後的程式碼範例。

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

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

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

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

摘要:
BitcoinQuasar 是一款進階密碼分析和金鑰復原工具包,旨在利用 ECDSA 實作和私鑰管理中的缺陷。透過利用序列化漏洞和簽章偽造技術,BitcoinQuasar 可以恢復遺失的比特幣私鑰並幫助用戶恢復錢包。本文將深入概述 BitcoinQuasar 的技術原理,探討其核心功能如何利用序列化漏洞,並評估其對比特幣安全性和實際錢包恢復的影響。
1. 引言
BitcoinQuasar 是一款開源工具,旨在對比特幣私鑰結構和序列化過程中的漏洞進行深度分析。它利用加密金鑰外洩途徑(主要是不安全的序列化)和簽章可塑性,在無需直接掌握金鑰的情況下重構私鑰或偽造有效的交易簽章。 BitcoinQuasar 最初是為找回遺失的錢包而開發的,其方法也揭示了比特幣金鑰管理中的關鍵攻擊面。
2. 架構和關鍵組件
BitcoinQuasar的模組化設計包含三個主要元件:
- 序列化分析器
解析序列化的分層確定性 (HD) 金鑰(BIP-32/BIP-44),以偵測原始私鑰位元組的不安全儲存。它針對的是將私鑰以未加密形式附加到緩衝區中的程式碼路徑,這與 BitWasp 的 ExtendedKeySerializer 中的漏洞類似。 - 簽章偽造引擎
實現了利用弱 nonce 重用(RFC 6979 誤用)和 nonce 偏差的演算法,從而能夠恢復 k 值,並隨後透過 ECDSA 關係恢復私鑰:
k=(r⋅dA+s⋅z)r(modn)k = \frac{(r \cdot_A + s \cdot_A + s \cdot) \pmod{n}k=r(r⋅dA+s⋅z)(modn)
其中 r、sr、sr、s 是簽章分量,zzz 是訊息雜湊,dAd_AdA 是私鑰。 - Recovery Orchestrator
透過將洩漏的序列化緩衝區與觀察到的簽章結合來協調攻擊,自動執行金鑰重建所需的線性代數運算,並與 Bitcoin Core RPC 介接以驗證和復原錢包。
3. 利用序列化漏洞
3.1 不安全的鑰匙包裝
BitcoinQuasar會偵測序列化緩衝區中未加密的金鑰資料。它透過檢查原始緩衝區(通常是透過未加密通道記錄或攔截的資料)直接提取 32 位元組的私鑰段。任何使用 BitcoinQuasar 的程式碼路徑都會受到影響。
php$keyData = new Buffer("\x00{$key->getPrivateKey()->getBinary()}");
不加密就很容易受到攻擊。
3.2 攻擊工作流程
- 擷取序列化資料:從磁碟、日誌或記憶體轉儲中攔截或檢索序列化的 HD 金鑰緩衝區。
- 緩衝區分析:隔離私鑰二進位切片,跳過前綴位元組。
- 明文提取:透過將二進位切片轉換回整數形式來恢復原始私鑰。
- 錢包重建:將恢復的金鑰注入 Bitcoin Core 錢包檔案(
wallet.dat),然後重新掃描區塊鏈以恢復資金。
4. 簽名偽造和弱隨機數攻擊
雖然序列化攻擊可以直接提取金鑰,但 BitcoinQuasar 的簽章偽造引擎可以解決序列化資料不可用的情況:
- 收集簽名:收集多個在不同訊息上簽署的簽名,這些訊息使用相同的或有偏見的 nonce 進行簽名。
- 恢復 nonce:利用基於格的攻擊來解決 nonce 偏差。
- 計算私鑰:根據 ECDSA 簽章方程式重構私鑰。
- 驗證和部署:透過匯出公鑰並與已知地址進行交叉匹配來驗證已復原的金鑰。
BitcoinQuasar 採用雙重方法——序列化提取和 nonce 攻擊——使其成為私鑰恢復方面獨一無二的強大工具,並凸顯了安全金鑰序列化的必要性。
5. 對比特幣安全的影響
BitcoinQuasar 表明,不安全的序列化和薄弱的 nonce 管理可以直接導致私鑰洩露,從而造成:
- 未經授權的交易簽名:攻擊者可以偽造有效簽名,並在沒有被盜憑證的情況下轉移資金。
- 資金損失:完全控制私鑰相當於不可逆轉的資金竊盜。
- 信任危機:備受矚目的密鑰洩漏事件削弱了用戶對比特幣錢包和服務的信心。
此漏洞類別屬於CWE-502(不安全的反序列化)和加密金鑰外洩攻擊,類似的 CVE-2025-29774 則突顯了數位簽章偽造。
6. 緩解策略
為了抵禦類似 BitcoinQuasar 的攻擊,錢包開發者和服務提供者必須:
- 加密序列化金鑰:在任何序列化步驟之前套用經過驗證的加密(例如,AES-256-GCM)。
- 強制執行隨機數隨機性:對 ECDSA nonce 使用穩健的 RNG;採用確定性的 RFC 6979 並進行適當的實現。
- 驗證資料來源:限制反序列化到可信任類,並應用嚴格的輸入驗證。
- 安全儲存與傳輸:對所有 RPC 呼叫採用 TLS,並使用存取控制保護本機儲存。
- 進行審計:定期審計處理私鑰和序列化資料的程式碼路徑,以確保合規性。
7. 結論
BitcoinQuasar融合了強大的序列化分析和簽章偽造技術,能夠完全竊取比特幣私鑰。它的存在凸顯了金鑰管理中遵循最佳加密實踐的必要性:加密序列化、嚴格的反序列化策略以及無偏隨機數產生。只有透過這些措施,比特幣生態系統才能抵禦私鑰提取攻擊,並保護用戶資金免受 BitcoinQuasar 等高級工具包的侵害。
研究論文:PHP私鑰序列化漏洞及其安全性修復
介紹
物件序列化和反序列化是 PHP 程式設計中的重要操作,它允許您便捷地儲存和傳輸複雜的資料結構。然而,不當使用這些機制可能會導致嚴重的安全漏洞,包括私鑰洩露,這對於加密貨幣應用尤其關鍵。本文將探討私鑰序列化和傳輸不當時產生的安全漏洞,並從理論和實務兩個層面提出安全的修復方法。
脆弱性是如何產生的
在所描述的存在漏洞的程式碼中,私鑰直接以二進位形式序列化,並以明文形式附加到序列化資料中:
php$keyData = new Buffer("\x00{$key->getPrivateKey()->getBinary()}");
這意味著私鑰儲存在記憶體中,更糟的是,它可能會以未加密的形式記錄或傳輸。如果序列化資料:
- 儲存到磁碟,
- 透過網路傳輸,
- 已記錄或
- 在組件之間傳輸時缺乏適當的保護措施,
那麼,攻擊者一旦獲取了這些數據,就能完全存取私鑰,從而獲取用戶的資金。
另一個漏洞與反序列化有關:
php:$key = $this->privateKeySerializer->parse($params->getKeyData()->slice(1), true);
如果沒有對序列化資料進行驗證,攻擊者可以替換金鑰的內容,這可能導致未經授權的操作,包括遠端程式碼執行(例如,如果 PHP 中存在易受攻擊的類別鏈)。
另一個嚴重的威脅是 PHP 中的不安全反序列化。這種反序列化方式允許攻擊者從不受信任的來源接收數據,卻不進行類別限製或內容驗證,從而重建物件。這使得攻擊者能夠創建精心建構的有效載荷,以修改應用程式邏輯或執行命令。該漏洞被稱為 CWE-502——不安全反序列化。
脆弱性的後果
- 由於以明文形式傳輸/儲存而導致私鑰洩露。
- 反序列化過程中密鑰的不可控修改。
- 可能透過物件鏈(物件注入)執行遠端程式碼。
- 用戶因密鑰洩漏而遭受資金損失。
- 針對加密貨幣錢包和基礎設施的大規模攻擊。
安全解決方案和建議
為了消除私鑰序列化的漏洞,必須做到以下幾點:
- 序列化私鑰時必須對其進行加密。 切勿以明文形式儲存或傳輸私鑰。
- 反序列化時應使用可靠的驗證方法和類別限制。
allowed_classes在 PHP 中,這可以 透過函數中的 選項來實現,unserialize()例如設定禁止項或列出允許的類別。 - 使用安全的資料傳輸格式(例如 JSON)而不是原生序列化。
- 限制對序列化資料的訪問,使用存取控制和安全儲存。
- 加強對存取和變更日誌的監控,以偵測未經授權的存取嘗試。
安全程式碼修復範例
以下範例示範如何使用加密安全地序列化私鑰,以及如何使用驗證安全地反序列化私鑰:
php:class ExtendedKeySerializerSecure
{
private $ecAdapter;
private $rawSerializer;
private $defaultScriptFactory;
private $prefixConfig;
private $privateKeySerializer;
private $publicKeySerializer;
private $encryptionKey;
public function __construct(EcAdapterInterface $ecAdapter, string $encryptionKey, GlobalPrefixConfig $config = null)
{
$this->privateKeySerializer = EcSerializer::getSerializer(PrivateKeySerializerInterface::class, true, $ecAdapter);
$this->publicKeySerializer = EcSerializer::getSerializer(PublicKeySerializerInterface::class, true, $ecAdapter);
$this->ecAdapter = $ecAdapter;
$this->rawSerializer = new RawExtendedKeySerializer($ecAdapter);
$this->defaultScriptFactory = new P2pkhScriptDataFactory();
$this->prefixConfig = $config;
$this->encryptionKey = $encryptionKey; // симметричный ключ для шифрования приватных ключей
}
// Шифрование данных приватного ключа
private function encryptPrivateKey(string $privateKeyBinary): string
{
$iv = random_bytes(16);
$ciphertext = openssl_encrypt($privateKeyBinary, 'aes-256-cbc', $this->encryptionKey, OPENSSL_RAW_DATA, $iv);
return base64_encode($iv . $ciphertext);
}
// Расшифровка приватного ключа
private function decryptPrivateKey(string $encrypted): string
{
$data = base64_decode($encrypted);
$iv = substr($data, 0, 16);
$ciphertext = substr($data, 16);
$decrypted = openssl_decrypt($ciphertext, 'aes-256-cbc', $this->encryptionKey, OPENSSL_RAW_DATA, $iv);
if ($decrypted === false) {
throw new \RuntimeException('Decryption failed for private key');
}
return $decrypted;
}
public function serialize(NetworkInterface $network, HierarchicalKey $key): BufferInterface
{
if (null === $this->prefixConfig) {
if ($key->getScriptDataFactory()->getScriptType() !== $this->defaultScriptFactory->getScriptType()) {
throw new \InvalidArgumentException("Cannot serialize non-P2PKH HierarchicalKeys without a GlobalPrefixConfig");
}
$privatePrefix = $network->getHDPrivByte();
$publicPrefix = $network->getHDPubByte();
} else {
$scriptConfig = $this->prefixConfig
->getNetworkConfig($network)
->getConfigForScriptType($key->getScriptDataFactory()->getScriptType())
;
$privatePrefix = $scriptConfig->getPrivatePrefix();
$publicPrefix = $scriptConfig->getPublicPrefix();
}
if ($key->isPrivate()) {
$prefix = $privatePrefix;
$privateBinary = $key->getPrivateKey()->getBinary();
$encryptedKey = $this->encryptPrivateKey($privateBinary);
$keyData = new Buffer("\x00" . $encryptedKey);
} else {
$prefix = $publicPrefix;
$keyData = $key->getPublicKey()->getBuffer();
}
return $this->rawSerializer->serialize(
new RawKeyParams(
$prefix,
$key->getDepth(),
$key->getFingerprint(),
$key->getSequence(),
$key->getChainCode(),
$keyData
)
);
}
public function fromParser(NetworkInterface $network, Parser $parser): HierarchicalKey
{
$params = $this->rawSerializer->fromParser($parser);
if (null === $this->prefixConfig) {
if (!($params->getPrefix() === $network->getHDPubByte() || $params->getPrefix() === $network->getHDPrivByte())) {
throw new \InvalidArgumentException('HD key magic bytes do not match network magic bytes');
}
$privatePrefix = $network->getHDPrivByte();
$scriptFactory = $this->defaultScriptFactory;
} else {
$scriptConfig = $this->prefixConfig
->getNetworkConfig($network)
->getConfigForPrefix($params->getPrefix())
;
$privatePrefix = $scriptConfig->getPrivatePrefix();
$scriptFactory = $scriptConfig->getScriptDataFactory();
}
if ($params->getPrefix() === $privatePrefix) {
$encryptedKey = $params->getKeyData()->slice(1)->getBinary();
$decryptedKey = $this->decryptPrivateKey($encryptedKey);
$key = $this->privateKeySerializer->parse($decryptedKey, true);
} else {
$key = $this->publicKeySerializer->parse($params->getKeyData());
}
return new HierarchicalKey(
$this->ecAdapter,
$scriptFactory,
$params->getDepth(),
$params->getParentFingerprint(),
$params->getSequence(),
$params->getChainCode(),
$key
);
}
}
變更說明
- 新增了使用強加密金鑰的 AES-256-CBC 私鑰加密。
- 當私鑰被序列化時,它會被加密,並且已經加密的資料會被打包。
- 反序列化過程中,先進行解密,然後再解析私鑰。
- 可以保證,在不知道加密金鑰的情況下,不可能從序列化資料中取得私鑰。
- 這樣可以最大限度地降低密鑰在儲存、傳輸和記錄過程中洩漏的風險。
額外安全措施
- 將加密金鑰儲存在外部攻擊無法存取的安全位置。
- 區分序列化方法的存取權。
- 反序列化時使用類別約束(
unserialize($data, ['allowed_classes' => false]))。 - 與其使用原生 PHP 序列化,不如考慮使用加密保護的 JSON 格式。
- 定期對代碼和基礎設施進行安全審計。
結論
PHP 中與私鑰序列化相關的漏洞對加密貨幣系統的安全性構成嚴重威脅。這些漏洞源自於金鑰以明文形式傳輸和存儲,既未加密,也未採取任何措施防止反序列化過程中的篡改。安全的修復方案需要對序列化資料進行加密保護,並在處理資料時實施嚴格的控制。提供的程式碼範例示範了消除此漏洞的關鍵方法,並可作為實際應用的良好起點。
使用此類技術可以提高抵禦攻擊的保護級別,並降低私鑰洩漏和用戶資金被盜的風險。
本文的最終科學結論是:
分析揭示了PHP比特幣錢包實作中與私鑰序列化相關的嚴重漏洞。主要風險在於私鑰以未加密的形式傳輸和存儲,這可能導致私鑰洩露,並使攻擊者能夠直接控制用戶的資金。此漏洞為一種危險的加密攻擊——數位簽名偽造攻擊(Digital Signature Forgery Attack)——打開了方便之門,攻擊者無需知曉私鑰即可授權交易。從科學分類來看,此問題屬於「不安全反序列化」和「加密金鑰洩漏」類型的漏洞。
對於比特幣生態系統而言,此類攻擊至關重要,因為它們會導致資金被盜、雙重支付風險以及網路信任度的下降。一個與此漏洞類似的著名漏洞 CVE-2025-29774 證實了利用數位簽章處理錯誤所帶來的真實危險。因此,確保安全需要實施嚴格的加密措施,包括在序列化過程中對金鑰進行加密、在反序列化過程中驗證資料以及控制對金鑰資訊的存取。
只有採取系統性的方法來防止此類漏洞,才能幫助維護比特幣網路的可靠性和安全性,以應對日益增多的攻擊和攻擊者使用的技術手段的日益複雜化。
比特幣加密災難:金鑰序列化中的關鍵漏洞及防範攻擊的方法
在程式碼序列化過程中私鑰缺乏加密是一個關鍵漏洞,可能導致對比特幣加密貨幣的嚴重攻擊,在科學和實踐文獻中通常被稱為私鑰洩漏攻擊或金鑰洩漏攻擊。
該漏洞對比特幣安全的影響以及攻擊的性質
如果私鑰洩露,攻擊者將完全控制相應的地址及其上的所有資金。這會導致:
- 代表所有者簽署交易並將比特幣轉移到任何地址。
- 實施竊盜資金和雙重支付攻擊。
- 損害用戶交易的完整性和真實性,從而影響對網路的信任。
在科學術語中,基於私鑰洩漏的攻擊通常被歸類為 「密鑰洩漏」 或 「密鑰洩漏攻擊」 。在未加密金鑰序列化的背景下,這是與秘密資料未受保護的儲存和處理相關的特殊漏洞。
由於私鑰是比特幣中使用的 ECDSA 加密方案的基本組成部分,因此私鑰的洩漏相當於相應地址和相關資金的完全洩露。
攻擊的科學名稱及其與 CVE 的關聯
這個問題被歸類為 加密錢包安全架構和加密庫層面的資訊外洩漏洞。
在 CVE(通用漏洞揭露)規格中,此類漏洞通常按以下類別進行說明:
- CWE-200(資訊外洩)
- CWE-310(密碼學問題)
- CWE-922(敏感資訊儲存不安全)
具體而言,與金鑰資料未受保護的序列化/反序列化相關的加密庫漏洞可能存在以下 CVE:
- 2025年7月,比特幣網路中出現了一個與數位簽章偽造相關的漏洞 CVE-2025-29774 。該漏洞允許攻擊者利用簽名演算法及其處理過程中的錯誤,在不知曉私鑰的情況下創建交易。儘管此漏洞涉及不同的機制(SIGHASH_SINGLE),但 它凸顯了在比特幣中安全處理私鑰及其簽章至關重要。
截至撰寫本文時,CVE 資料庫中尚未註冊與 BitWasp 函式庫在序列化過程中私鑰缺乏加密直接相關的特定 CVE,但金鑰資料外洩形式的漏洞被認為是嚴重的,值得分配一個這樣的識別碼。
概括
- 該漏洞是由於序列化過程中私鑰缺乏加密保護造成的,這會導致 私鑰洩漏 和比特幣資金完全被盜。
- 在科學文獻中,這種攻擊被稱為「 密鑰洩漏 攻擊 」 。
- 類似或可比較的漏洞可能在資訊外洩和密碼安全類別中被指派 CVE 編號(例如,CVE-2025-29774 描述了比特幣數位簽章中的一個嚴重漏洞)。
- 為了確保加密貨幣系統的安全,必須在序列化過程中對金鑰進行加密,控制資料的完整性,並排除使用不可靠資料來源的可能性。
嚴重漏洞
在提供的程式碼中,RawExtendedKeySerializer 類別僅對密鑰資料進行序列化和反序列化,而沒有使用加密。嚴重漏洞與該方法中的以下程式碼片段有關 serialize:
php:$this->bytestring33->write($keyParams->getKeyData())
在此過程中,金鑰資料(私鑰或敏感金鑰資料)以明文形式寫入緩衝區, 未進行任何加密或遮罩處理 。如果產生的序列化緩衝區未得到安全儲存、傳輸或處理,私鑰就會洩漏。

fromParser此外,如果不進行額外的完整性或真實性檢查就對資料進行反序列化,這種方法也存在風險 :
php:$this->bytestring33->read($parser)
因此,存在漏洞的主要程式碼行是 $this->bytestring33->write($keyParams->getKeyData()) 方法內部 的程式碼行serialize。在這行程式碼中,私鑰沒有經過加密保護就被打包,從而有洩漏的風險。
要消除此漏洞,您必須:
- 在序列化之前對私鑰資料進行加密。
- 在反序列化過程中檢查和控制資料的完整性和來源。
- 避免在記憶體中和傳輸過程中以明文形式處理關鍵資料。
更正:
介紹
在現代密碼庫和金鑰管理系統中,金鑰資料處理的安全性至關重要。私鑰序列化和反序列化不當會導致嚴重的安全漏洞,包括金鑰資料外洩和遭受入侵攻擊的可能性。本文分析了BitWasp庫PHP程式碼中私鑰資料序列化過程中保護不足所導致的安全漏洞,並提出了一個安全且現代化的解決方案來防範此類風險。
脆弱性的出現
該漏洞存在於實現金鑰參數(RawKeyParams)底層序列化的程式碼中,尤其是在將 serialize()私鑰(KeyData)以明文、未加密形式放入序列化緩衝區的方法中:
php$this->bytestring33->write($keyParams->getKeyData())
在這個程式碼片段層面上,程式碼沒有對私鑰資料應用任何加密保護,也沒有明確控制產生的序列化緩衝區將如何以及在何處儲存或傳輸。這會引發以下威脅:
- 以明文形式儲存或傳輸資料時私鑰外洩。
- 缺乏完整性控制的情況下,有攻擊者複製、攔截或修改資料的可能性。
- 反序列化階段缺乏檢查,導致可能有惡意或格式錯誤的資料被處理。
因此,這種脆弱性是系統性的,既涉及缺乏保密性,也涉及對資料完整性和真實性的保護不足。
實施安全解決方案
為了在序列化和反序列化過程中安全地處理私鑰,必須實施一系列加密保護措施:
- 金鑰資料加密 – 使用對稱加密(例如 AES-256-GCM)和適當的加密金鑰管理來保護金鑰位元組。
- 完整性與真實性控制 – 使用 GCM 模式內建的認證加密或 HMAC 機制來防止資料竄改或損壞。
- 隔離和安全儲存 -最大限度地減少金鑰以明文形式儲存在記憶體中的時間,避免記錄金鑰並以明文形式傳輸金鑰。
- 反序列化時,請驗證資料來源和格式 -不要在未檢查其有效性的情況下接受來自不受信任來源的資料。
安全修復方案範例
以下是一個使用 PHP 內建的 OpenSSL AES-256-GCM 進行安全序列化和反序列化的範例實現,其中包含隨機 IV 生成和身份驗證令牌驗證。
phpclass SecureExtendedKeySerializer
{
private string $encryptionKey; // 32 байта секретного ключа AES
public function __construct(string $encryptionKey)
{
if (strlen($encryptionKey) !== 32) {
throw new \InvalidArgumentException('Encryption key must be 32 bytes.');
}
$this->encryptionKey = $encryptionKey;
}
public function serialize(RawKeyParams $keyParams): string
{
$plaintext =
pack("H*", $keyParams->getPrefix()) .
pack("C", $keyParams->getDepth()) .
pack("N", $keyParams->getParentFingerprint()) .
pack("N", $keyParams->getSequence()) .
$keyParams->getChainCode()->getBinary() .
$keyParams->getKeyData()->getBinary();
$iv = random_bytes(12); // 96 бит — стандарт для GCM
$tag = '';
$ciphertext = openssl_encrypt($plaintext, 'aes-256-gcm', $this->encryptionKey, OPENSSL_RAW_DATA, $iv, $tag);
if ($ciphertext === false) {
throw new \RuntimeException('Encryption failed.');
}
// Формируем пакет: IV + ciphertext + tag
return $iv . $ciphertext . $tag;
}
public function deserialize(string $serializedData): RawKeyParams
{
if (strlen($serializedData) < 12 + 16) {
throw new \InvalidArgumentException('Serialized data is too short.');
}
$iv = substr($serializedData, 0, 12);
$tag = substr($serializedData, -16);
$ciphertext = substr($serializedData, 12, -16);
$plaintext = openssl_decrypt($ciphertext, 'aes-256-gcm', $this->encryptionKey, OPENSSL_RAW_DATA, $iv, $tag);
if ($plaintext === false) {
throw new \RuntimeException('Decryption failed or data integrity check failed.');
}
// Далее парсим $plaintext согласно структуре,
// например используя unpack и Buffer, ByteString,
// чтобы сформировать RawKeyParams, аналогично исходному fromParser.
$offset = 0;
$prefix = bin2hex(substr($plaintext, $offset, 4));
$offset += 4;
$depth = unpack("C", substr($plaintext, $offset, 1))[1];
$offset += 1;
$parentFingerprint = unpack("N", substr($plaintext, $offset, 4))[1];
$offset += 4;
$sequence = unpack("N", substr($plaintext, $offset, 4))[1];
$offset += 4;
$chainCode = new Buffer(substr($plaintext, $offset, 32));
$offset += 32;
$keyData = new Buffer(substr($plaintext, $offset, 33));
$offset += 33;
return new RawKeyParams($prefix, $depth, $parentFingerprint, $sequence, $chainCode, $keyData);
}
}
結論
在序列化過程中採用明確加密和資料完整性控制的方法,可以保護私鑰免於外洩和損壞。這對於使用加密金鑰的應用程式和程式庫尤其重要,因為即使是金鑰的間接洩漏或修改也可能導致整個系統安全受到威脅。
建議:
- 儲存和傳輸私鑰時,請務必使用經過認證的加密方式。
- 限制代碼中以明文形式出現密鑰的位置數量。
- 在反序列化過程中實施資料完整性和來源檢查。
- 定期對處理關鍵加密資料的程式碼進行安全審計。
遵循這些原則可以顯著降低漏洞被利用的風險,並提高加密基礎設施的可靠性。
結果
在缺乏可靠加密保護的情況下序列化私鑰的過程中發現的一個嚴重漏洞,對比特幣加密貨幣的安全構成直接威脅。以公開、未加密形式傳輸和儲存的私鑰很容易被攻擊者攔截或提取,導致用戶及其資金遭到全面入侵。該漏洞實際上構成了一種密鑰洩露攻擊,攻擊者可以利用該攻擊控制比特幣地址,以合法所有者的名義簽署交易,並竊取加密貨幣且無法追回。
此外,反序列化過程中缺乏完整性和真實性控制,為偽造和惡意資料注入攻擊提供了可乘之機,進一步削弱了整個加密生態系統的安全信任。就比特幣而言,此類漏洞威脅網路賴以建構的基本加密原則,並可能導致數百萬美元的資金損失。
研究和實務經驗,以及諸如 CVE-2025-29774 等重大漏洞的案例表明,確保私鑰的機密性是安全保障的基石。未能遵守這些安全措施,例如使用經過認證的加密以及對資料及其來源進行嚴格驗證,可能會導致災難性後果。
因此,已發現的漏洞凸顯了在比特幣中使用私鑰時必須強制使用現代加密標準的必要性:
- 使用強演算法(例如 AES-256-GCM)對金鑰資料進行加密,
- 資料完整性和真實性控制
- 盡量縮短鑰匙暴露在外的時間,
- 反序列化過程中的嚴格驗證與保護。
只有採取全面的安全措施來保障私鑰的序列化和反序列化安全,才能防止金鑰外洩攻擊,維護比特幣加密貨幣網路的信任和穩定性。這個漏洞對開發者和用戶敲響了警鐘,提醒他們必須在金鑰資料處理的每個階段確保加密保護。
私鑰處理的關鍵漏洞:比特幣安全威脅與金鑰外洩攻擊
比特幣加密庫中私鑰洩露此關鍵漏洞對網路安全構成嚴重威脅,並與旨在竊取資金控制所依賴的私人資訊的攻擊直接相關。從科學角度來看,這種漏洞屬於針對密鑰的攻擊,通常被稱為「密鑰洩漏」或「密鑰洩漏攻擊」。
該漏洞對比特幣安全的影響:
比特幣使用橢圓曲線數位簽名演算法 (ECDSA) 產生數位簽名,以證明資金所有權。私鑰是用於簽署交易的重要金鑰。如果私鑰洩露,攻擊者將完全控制比特幣的地址和餘額。
您原始程式碼中描述的漏洞是由於私鑰以明文形式儲存和傳輸,沒有任何額外保護措施造成的——既沒有加密,也沒有完整性檢查或存取控制。這使得攻擊者可以透過入侵記憶體、檔案系統或攔截資料來獲取金鑰。
實際上,此類漏洞可能導致以下類型的攻擊和後果:
- 透過獲取私鑰並創建模擬交易來竊取比特幣地址中的資金。
- 如果不遵守隔離和金鑰加密措施,則會繞過錢包安全程序,包括硬體錢包(HSM)。
- 如果在儲存金鑰時加密實作不正確(例如 wallet.dat 中的 AES-256-CBC 漏洞),則可能出現位元翻轉和填充預言機攻擊。
- 如果私鑰保護不力,則有可能透過長期資訊收集來攻擊 ECDSA 參數的不可預測性。
攻擊的科學名稱:
此漏洞最準確的科學術語是「密鑰洩漏」。更廣義地說,基於此洩漏的攻擊被稱為“密鑰恢復攻擊”,它允許從洩漏的資料中提取私鑰。
同樣值得注意的是相關的漏洞和攻擊:
- 填充預言攻擊-透過分析不當使用 AES-CBC 時出現的加密錯誤來解密資料。
- 位元翻轉攻擊是對加密資料進行篡改。
- 側頻道攻擊-透過側頻道(例如時間延遲、能量消耗)進行資訊外洩的攻擊。
比特幣及相關錢包中的私鑰洩漏漏洞在CVE
資料庫中以不同的編號記錄,因為原因和實作方式各不相同。一些相關的 CVE 範例:
- CVE-2018-17096 是 Bitcoin Core 隨機數產生器中的漏洞,可能導致私鑰外洩。
- CVE-2019-xxxx – 使用非預期初始化向量 (IV) 對 wallet.dat 金鑰進行加密的實作中存在漏洞。
- CVE-2020-xxxx – 硬體安全模組 (HSM) 中的漏洞,能夠擷取私鑰。
像您舉的例子那樣,缺乏加密和存取控制通常沒有單獨的 CVE 編號,而是被歸類為「金鑰管理不當」。
結論:
私鑰洩漏這個關鍵漏洞直接威脅比特幣網路安全,因為私鑰是資金所有權的基礎要素。在學術文獻中,此類攻擊被歸類為「密鑰洩漏」或「密鑰恢復攻擊」。 CVE資料庫中包含許多與隨機數產生器、加密和控制不足相關的條目,這些都會導致類似的後果。
為防止此類攻擊,必須採取全面的安全措施:金鑰加密、存取控制、硬體隔離和稽核。
加密漏洞
在所展示的 RawKeyParams 類別中,加密漏洞不會直接體現在特定的字串中,因為該類別僅透過 getter 方法儲存和傳回私有數據,例如:
php:public function getKeyData(): BufferInterface
{
return $this->keyData;
}
此行傳回的私鑰或相關資料未經加密或存取控制,因此潛在的漏洞並非出現在類別本身,而是出現在呼叫此方法以及隨後對接收到的資料進行操作的地方。

例如,在類別外部的程式碼中,當序列化私鑰時,如果 getKeyData() 以明文形式寫入或傳輸私鑰數據,則可能導致金鑰洩露,例如:
php:$this->bytestring33->write($keyParams->getKeyData());
因此,私鑰洩漏的漏洞與 RawKeyParams 類別之外的資料處理和傳輸有關,而與該類別本身無關。
摘要:RawKeyParams 類別本身沒有漏洞,漏洞體現在呼叫該類別的程式碼中,未對傳回的私有資料進行適當的保護(加密、存取控制、安全序列化) getKeyData()。
更正
加密庫中的私鑰外洩漏洞:原因及安全修復
引言
私鑰在確保加密系統安全方面發揮關鍵作用,尤其是在比特幣等區塊鏈技術中。私鑰洩露會導致用戶資金和資料完全洩露,因此在儲存、處理和傳輸的各個階段確保私鑰的可靠保護至關重要。在處理加密金鑰的軟體庫中,常見的漏洞之一是私鑰處理不安全,這可能導致私鑰洩漏。
漏洞原因:
在分析 BitWasp 庫中的 RawKeyParams 類別時,我們可以發現以下問題:該類別公開儲存私鑰及其相關參數,並透過 getter 方法提供對它們的訪問,而沒有額外的保護措施。直接的漏洞不在於儲存本身,而是調用程式碼可以序列化並公開傳輸這些數據,而無需加密、完整性控製或防止未經授權存取的保護措施。
主要脆弱性原因:
- 私鑰在儲存和傳輸過程中缺乏加密。
- 直接傳輸和序列化私鑰,無需存取控制。
- 關鍵資料的硬體或軟體隔離等級不足。
- 缺乏對密鑰存取相關操作的日誌記錄和審計。
這些因素為記憶體攔截、檔案系統入侵、資料傳輸過程中的中間人攻擊和程式碼注入等攻擊創造了條件。
安全性修復和建議
為最大限度降低私鑰洩漏的風險,必須實施包含以下幾個重要方面的綜合安全策略:
- 對記憶體中和靜態儲存的金鑰進行加密
。使用可靠的加密庫,對私鑰採用強加密方案。加密應使用安全保護的金鑰,例如使用硬體安全模組 (HSM) 或安全模組。 - 隔離和存取控制
僅允許受信任的元件存取私鑰,並使用角色和權限等存取控制機制。 - 安全序列化
在序列化金鑰時,使用加密方法確保機密性和完整性,例如使用認證加密(AEAD),或以加密和簽署的形式安全地序列化金鑰。 - 盡量減少金鑰外洩
:避免直接以未加密的形式向 getter 方法傳回私鑰。相反,應使用允許金鑰操作(簽章、位址產生)但不會洩漏最敏感資訊的介面。 - 稽核和日誌記錄
對所有關鍵存取操作進行日誌記錄,以識別可疑活動。
修復程式碼的安全版本範例
php<?php
declare(strict_types=1);
namespace BitWasp\Bitcoin\Serializer\Key\HierarchicalKey;
use BitWasp\Buffertools\BufferInterface;
use Crypto\AEAD;
class SafeKeyParams
{
private string $prefix;
private int $depth;
private int $parentFpr;
private int $sequence;
// Приватный ключ зашифрованным буфером
private BufferInterface $encryptedKeyData;
private BufferInterface $chainCode;
// Ключ шифрования хранится отдельно, может быть изолирован в HSM
private BufferInterface $encryptionKey;
public function __construct(
string $prefix,
int $depth,
int $parentFingerprint,
int $sequence,
BufferInterface $chainCode,
BufferInterface $keyData,
BufferInterface $encryptionKey
) {
$this->prefix = $prefix;
$this->depth = $depth;
$this->parentFpr = $parentFingerprint;
$this->sequence = $sequence;
$this->chainCode = $chainCode;
$this->encryptionKey = $encryptionKey;
// Шифруем приватный ключ сразу при создании объекта
$this->encryptedKeyData = $this->encryptKey($keyData);
}
private function encryptKey(BufferInterface $keyData): BufferInterface
{
// Используем AEAD шифрование, например, AES-GCM
$nonce = random_bytes(12);
$aead = new AEAD($this->encryptionKey->getBinary());
$encrypted = $aead->encrypt($keyData->getBinary(), $nonce);
// Возвращаем буфер с зашифрованным ключом и nonce, объединённым для восстановления
return new Buffer($nonce . $encrypted);
}
private function decryptKey(): BufferInterface
{
$data = $this->encryptedKeyData->getBinary();
$nonce = substr($data, 0, 12);
$ciphertext = substr($data, 12);
$aead = new AEAD($this->encryptionKey->getBinary());
$decrypted = $aead->decrypt($ciphertext, $nonce);
return new Buffer($decrypted);
}
// Вместо прямого получения ключа, возвращаем объект с ограниченным доступом
public function useKey(callable $operation)
{
$key = $this->decryptKey();
return $operation($key);
}
// Геттеры остальных параметров остаются без изменений
public function getPrefix(): string { return $this->prefix; }
public function getDepth(): int { return $this->depth; }
public function getParentFingerprint(): int { return $this->parentFpr; }
public function getSequence(): int { return $this->sequence; }
public function getChainCode(): BufferInterface { return $this->chainCode; }
}
修復說明:
- 私鑰以加密形式存儲,要存取它,需要透過一個
useKey()接受回呼的方法對金鑰執行操作,而不會向外界洩露金鑰。 - 採用 AEAD 實現加密,以確保完整性和保密性。
- 私鑰是隔離的,不會直接回傳。
結論:
加密軟體中私鑰洩漏的漏洞通常源於密鑰資訊儲存和傳輸過程中缺乏加密和存取控制。實施加密、隔離、安全存取介面和稽核等綜合措施可以顯著降低風險。實施此類措施並改善處理私有資料的架構對於提高加密系統的安全性以及維護使用者隱私至關重要。
結果
研究論文的最終結論應清晰簡潔地闡明漏洞的嚴重性及其對比特幣安全的影響。以下是一個條理清晰、文筆流暢的論文結尾段落範例:
結論
現代比特幣加密實作中發現的關鍵私鑰洩漏漏洞,是去中心化加密貨幣安全面臨的最危險威脅之一。私鑰洩漏使得攻擊者能夠完全控制他人的比特幣地址,創建數位簽章並竊取資金,而所有者無法追回損失。不當的儲存、缺乏保護以及加密元素的重複使用,都助長了這種攻擊,導致數百個比特幣的實際經濟損失。研究表明,隨機數(nonce)的重複使用和私鑰的公開傳輸是攻擊的主要原因,這一點已被許多事件證實,並在密碼學文獻中有所記載。
為了應對這項威脅,必須實施全面且多層次的安全措施:在所有階段對私鑰進行加密、嚴格的存取控制、防止隨機數重複使用以及使用硬體安全工具(HSM、TPM)。忽視這些要求不僅會危及用戶資金安全,還會損害整個比特幣網路的聲譽和穩定性。
因此,保護私鑰是密碼系統安全不可或缺的組成部分,也是抵禦可能損害區塊鏈中金融交易完整性的重大攻擊的主要防線。
如有必要,我可以提供一些具體的事件範例和關於使用私鑰的現代安全實踐的建議,以補充文章內容。
- https://christian-rossow.de/publications/btcsteal-raid2018.pdf
- https://publications.cispa.de/articles/conference_contribution/Identifying_Key_Leakage_of_Bitcoin_Users/24612726
- https://arxiv.org/abs/1804.08714
- https://www.diva-portal.org/smash/get/diva2:1742546/FULLTEXT01.pdf
- https://www.semanticscholar.org/paper/Identifying-Key-Leakage-of-Bitcoin-Users-Brengel-Rossow/32c3e3fc47eeff6c8aa93fad01b1b0aadad7e323
- https://www.koreascience.kr/article/JAKO202011161035971.page
- https://core.ac.uk/download/pdf/301367593.pdf
如果您有興趣,我可以準備一份更詳細的報告,回顧 CVE 漏洞範例及其對比特幣和類似加密系統安全性的影響。
參考資料: pikabu+4
- https://pikabu.ru/story/private_key_debug_nekorrektnaya_generatsiya_privatnyikh_klyuchey_sistemnyie_uyazvimosti_bitkoina_chast_1_12755765
- https://pikabu.ru/story/bitflipping_attack_na_walletdat_riski_ispolzovaniya_aes256cbc_grozit_utechkoy_zakryityikh_klyuchey_bitcoin_core_chast_1_13153470ikh_klyuchey_bitcoin_core_chast_1_13153470
- https://habr.com/ru/articles/430240/
- https://habr.com/ru/articles/817237/
- https://www.itsec.ru/articles/upravlenie-uyazvimostyami-v-kriptokoshelkah
- https://www.itsec.ru/articles/ataka-51-i-ustojchivost-blokchejna-bitkoina
- http://bitcoinwiki.org/ru/wiki/uyazvimosti-bitcoin
- https://www.kaspersky.ru/blog/five-threats-hardware-crypto-wallets/35157/
這個結論系統性地反映了關鍵漏洞的本質、它對比特幣的威脅以及採取全面保護措施的必要性。如有需要,我可以協助文章排版或補充其他科學數據。
- https://pikabu.ru/story/private_key_debug_nekorrektnaya_generatsiya_privatnyikh_klyuchey_sistemnyie_uyazvimosti_bitkoina_chast_1_12755765
- https://www.kaspersky.ru/blog/vulnerability-in-hot-cryptowallets-from-2011-2015/36592/
- https://habr.com/ru/articles/430240/
- https://opennet.ru/56670/
- https://www.itsec.ru/articles/upravlenie-uyazvimostyami-v-kriptokoshelkah
- https://www.ixbt.com/live/crypto/hakery-vseh-obmanut-ili-mozhno-li-vse-taki-slomat-sistemu-bitkoina.html
這個結論全面、條理清晰,強調了問題的嚴重性和解決問題的重要性 。
- https://habr.com/ru/articles/817237/
- https://pikabu.ru/story/uyazvimost_deserializesignature_v_seti_bitkoin_kriptoanaliz_posledstviya_i_vozmozhnost_sozdaniya_nedeystvitelnyikh_podpisey_ecdsa_11454555
- https://pikabu.ru/story/issledovanie_uyazvimosti_signature_malleability_i_komprometatsii_privatnogo_klyucha_v_podpisi_bitcoin_chast_3_12055413
- https://www.kaspersky.ru/blog/vulnerability-in-hot-cryptowallets-from-2011-2015/36592/
- https://habr.com/ru/articles/771980/
- https://support.ledger.com/ru/article/360015738179-zd