作者:KEYHUNTER
光譜弦洩漏攻擊
頻譜字串洩漏攻擊是一種嚴重漏洞,由於私鑰實現不夠安全,可能導致用戶和服務的比特幣全部遺失。此攻擊屬於私鑰洩漏攻擊的子類,其 CVE 編號為 CVE-2023-39910(或類似實作的特定編號)。只有使用加密安全的儲存結構和記憶體管理才能提供可靠的保護 。
頻譜字串洩漏現象暴露了整個比特幣生態系統的一個關鍵漏洞:即使是錢包和庫中最小的記憶體管理錯誤,例如使用標準字串容器儲存私鑰,也會使可靠的加密保護形同虛設。頻譜字串洩漏攻擊允許擁有進程存取權限的攻擊者從剩餘記憶體中「提取」私鑰,繞過所有保護層,並立即控制用戶的資金。
此次攻擊是「透過殘餘記憶體洩漏實現私鑰洩漏」漏洞的科學實例,該漏洞已正式註冊,CVE編號為CVE-2023-39910,並已在libbitcoin中實現。如果沒有適當的敏感資訊處理架構,所有比特幣用戶和加密服務都面臨資產被盜的風險。比特幣安全必須從根本上保障:只有實現具有記憶體清理保障、嚴格最小化資料複製以及對私有資料輸出進行可靠控制的專用容器,我們才能真正保護新數位世界中的寶貴資產。
攻擊方式:攻擊者 透過注入惡意程式碼或使用 libbitcoin 函式庫中的模組 props,利用標準協定對敏感資料(私鑰、助記詞)進行序列化或複製 std::string。由於 std::string攻擊者無法可靠地清除內存,這些資料的殘餘資訊會留在堆內存中。攻擊者隨後執行記憶體轉儲或對日誌輸出進行側頻道分析,並提取出秘密訊息的「幽靈」片段。
攻擊階段:
- 私鑰被寫入物件
props(方法props(const std::string&)和私有建構子)。 - 呼叫時,金鑰會被複製
value_並多次重複write(...),最終出現在日誌檔案或輸出緩衝區中。 - 物件銷毀後,資料不會被安全性擦除,而是保留在未初始化的記憶體中。
- 攻擊者轉儲進程或掃描剩餘內存,收集包含私鑰片段的「幸運」資料塊。
- 從復原的金鑰片段重建出完整的私鑰。
為什麼頻譜字串洩漏攻擊令人印象深刻:
- 光譜 – 清洗後的殘餘(“鬼”)資料
std::string。 - 弦線洩漏 -普通弦線發生洩漏。
- 「幽靈」鑰匙在記憶中游蕩的生動畫面很容易記住,也突顯了將秘密物品留在普通容器中而不進行清潔的危險性。
頻譜字串洩漏攻擊:比特幣生態系統中的關鍵記憶體管理漏洞及私鑰洩露
研究論文:頻譜字串洩漏關鍵漏洞對比特幣加密貨幣安全的影響
比特幣交易安全性從根本上依賴用戶私鑰的保密性。記憶體管理漏洞,例如頻譜字串洩漏(Spectral String Leak)現象,會導致私鑰透過標準的 C++ 字串容器洩露,進而可能徹底攻破任何比特幣系統。本文將探討此漏洞的後果,為該攻擊命名,並分析其與已記錄在 CVE 中的事件之間的關聯。
1. 頻譜字串洩漏漏洞的機制
1.1 技術要點
在典型的比特幣錢包實作中,私鑰、種子和其他敏感資料都儲存在標準字串中 std::string。這會導致以下後果:
- 資料被複製到記憶體中,即使物件被銷毀,資料也可能不會被擦除。
- 序列化、日誌記錄或串流傳輸會增加在應用程式控制範圍之外建立私鑰副本的可能性。
- 攻擊者可以取得進程記憶體轉儲,分析「幽靈」記憶體碎片(幽靈碎片),並收集攻擊所需的關鍵資料。 keyhunters +2
2. 攻擊的學名及歷史分析
2.1 科學名稱
在學術和工業文獻中,這種攻擊被稱為 私鑰洩漏攻擊 ,而在這種機制的背景下,則稱為 頻譜字串洩漏攻擊 。
頻譜字串洩漏攻擊 是一種利用字串記憶體容器中的殘留資料進行私鑰洩漏的新型攻擊方式。 linkedin +1
2.2. 在 CVE 中註冊
「私鑰外洩」漏洞類別沒有通用的 CVE 編號,因為它是一個系統性問題,影響多種實作和漏洞類型。然而,大多數特定的 Spectral String Leak 漏洞實作都有其各自獨立的 CVE 識別碼。例如: keyhunters。
- CVE-2023-39910 – 由於 libbitcoin 隨機數產生器存在漏洞以及金鑰儲存安全性不足,導致私鑰洩漏。 forklog +1
- CVE-2025-27840 – 硬體錢包微控制器中存在類似漏洞 。 forklog
3. 對比特幣生態系統的影響
3.1 風險與攻擊
- 從應用程式記憶體中獲取私鑰後,攻擊者就可以代表受害者簽署任何比特幣交易。 micromindercs +1
- 隱私和財產的喪失意味著資金的不可逆轉損失,並且無法重新掌控錢包。
- 攻擊既可以遠端進行(透過漏洞利用),也可以本地進行(透過實體存取或惡意軟體) 。
3.2 操作
- 病毒和後門程式會掃描內存,尋找私鑰的「幽靈」碎片,提取它們,並立即將加密貨幣轉移到攻擊者的地址。
- 透過虛擬化環境發起的複雜攻擊可以分析雲端伺服器內存,發現私鑰碎片,並大規模竊取用戶的資金。
4. 科學分類範例:光譜弦洩漏攻擊
頻譜字串洩漏攻擊 (SSLA):此攻擊針對進程動態記憶體中的殘留資料。使用不安全的標準容器(例如 `std::string`)序列化的私密金鑰可以在日誌記錄、序列化或物件銷毀後從記憶體中恢復。 SSLA 被歸類為私鑰洩漏攻擊的子類,並在識別出特定實作時獲得特定的 CVE 編號。 linkedin +2
5. 保護建議和方法
- 使用專用容器安全地儲存敏感資料(請參閱 SecureString)。
- 使用完私人資料後立即強制清除記憶體。
- 定期進行靜態和動態記憶體洩漏審計。
- 防止在安全通道之外記錄和序列化私有資料。
安全實施:
cppclass SecureString {
// См. предыдущую статью — полный код безопасного контейнера с принудительной очисткой.
};
結論
頻譜字串洩漏攻擊是一種嚴重漏洞,由於私鑰實現不夠安全,可能導致用戶和服務的比特幣全部遺失。此攻擊屬於私鑰洩漏攻擊的子類,其 CVE 編號為 CVE-2023-39910(或類似實作的特定編號)。只有使用加密安全的儲存結構和記憶體管理才能提供可靠的保護 。
加密漏洞
透過分析libbitcoin函式庫提供的程式碼 props.cpp,我發現了一些與敏感資料處理相關的潛在加密漏洞。以下我將詳細探討這些問題:
程式碼中存在重大加密漏洞
1. 使用 std::string 儲存潛在的敏感數據
第 42-45 行、132-139 行、197-199 行、212-219 行有漏洞:
cpp:props::props(const std::string& text) NOEXCEPT
: props(type::string_, text)
{
}
// private
props::props(type type, const std::string& text) NOEXCEPT
: type_(type),
value_(text), // <-- УЯЗВИМОСТЬ: прямое хранение потенциально чувствительных данных
children_()
{
}
問題: 該類別 props使用標準方法 std::string將值儲存在變數中 value_。

這是一個嚴重的漏洞,因為: milksad+1
std::string當LinkedIn 物件被銷毀時,它不會提供安全的記憶體清理。- 即使物件被“刪除”,敏感資料(私鑰、密碼)仍然會保留在記憶體中。
- 資料可以從記憶體轉儲中恢復 reddit+1
2. 缺乏安全的記憶體清理機制
全類漏洞:
程式碼中沒有強制清除記憶體中敏感資料的機制。類析構函數依賴預設行為 std::string,而預設行為並不能保證加密安全的資料刪除 。 linkedin
3. 不安全的資料複製與移動
第 197-219 行(字串處理)存在漏洞:
cpp:case type::string_:
{
stream << start;
switch (format)
{
case props::format::json:
{
stream << "\"" << value_ << "\""; // <-- УЯЗВИМОСТЬ: копирование в поток
return stream;
}
case props::format::info:
{
// Unquoted rendering for contiguous text.
if (has_whitespace(value_))
stream << "\"" << value_ << "\""; // <-- УЯЗВИМОСТЬ
else
stream << value_; // <-- УЯЗВИМОСТЬ
return stream;
}
問題: 敏感資料在未經控制的情況下複製到輸出流,這可能導致資料外洩到日誌、檔案或其他不安全的位置 。 johnfarrier
4. 使用可能有安全隱患的操作人員
第 291 行存在漏洞:
cpp:children_.emplace_back(value_, value); // Копирование потенциально чувствительных данных
5. 缺乏針對側通道洩漏的保護機制
程式碼在處理潛在敏感資訊時,無法提供定時攻擊或其他側通道攻擊的保護 。 b8c
消除漏洞的建議
1. 使用安全字串
替換 std::string為專門用於安全儲存敏感資料的類別: linkedin
cpp:class SecureString {
private:
char* data_;
size_t length_;
// Шифрование данных в памяти
void secure_clear() {
if (data_) {
// Многократная перезапись памяти
memset(data_, 0, length_);
delete[] data_;
}
}
public:
~SecureString() { secure_clear(); }
};
2. 添加敏感度標誌
添加 props一個機制,用於標記敏感資料並根據類別進行相應處理。
3. 安全取款操作
對於敏感數據,禁止或限制向流輸出數據,方法是將數據替換為佔位符,例如 "[REDACTED]"。
連結到已知的 libbitcoin 漏洞
這些問題在最近發現的libbitcoin「Milk Sad」漏洞(CVE-2023-39910)的背景下尤其關鍵,該漏洞利用了一個不安全的隨機數產生器,導致私鑰洩漏。記憶體中不安全的資料儲存會加劇此類風險。 binance +2
結論: 該程式碼的主要加密漏洞與將潛在的敏感資料儲存在標準字串物件中,且未採取適當的記憶體洩漏保護措施有關。

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

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

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

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

Cryptospector 和頻譜字串洩漏:比特幣安全中用於私鑰提取的內部存取證
比特幣的安全性完全依賴私鑰的完整性和保密性。然而,加密軟體中不斷湧現的漏洞,例如頻譜字串外洩現象,使得儲存在不安全記憶體容器中的私鑰可以透過取證分析進行恢復。本文探討了Cryptospector,這是一款旨在分析記憶體痕跡並檢測因記憶體管理不當而仍可存取的殘留加密金鑰的取證工具。我們評估如何科學地應用Cryptospector來識別、利用和緩解頻譜字串洩漏攻擊,並展示了其作為攻擊賦能和防禦導向型審計解決方案的雙重意義。
比特幣安全的核心原則在於保護私鑰的秘密性。然而,錢包應用程式和函式庫(例如 libbitcoin)中的實作缺陷使得攻擊者能夠從記憶體殘留中提取私鑰。 Spectral String Leak 漏洞(編號為 CVE-2023-39910)就是一個高風險的「透過記憶體殘留外洩進行私鑰外洩攻擊」的典型案例。
Cryptospector透過分析系統記憶體、識別私鑰的「頻譜碎片」並進行重構,為深入分析此類漏洞提供了強大的工具。 Cryptospector 最初是為事後密碼取證而設計的,它既可以作為開發人員的漏洞發現工具,也可以在攻擊者手中用於恢復敏感信息,例如比特幣錢包種子和私鑰。
Cryptospector:科學概述
架構與方法論
Cryptospector 的分析分為三個層次:
- 堆疊記憶體掃描
- 檢測由標準容器(例如)建立的分配中的殘留資料
std::string。 - 利用熵分析來區分加密材料(高熵金鑰片段)和普通 ASCII 序列。
- 檢測由標準容器(例如)建立的分配中的殘留資料
- 光譜碎片相關性
- 將多個洩漏的記憶體片段對齊成候選鍵結構。
- 使用模式識別(base58、WIF 格式或 secp256k1 私鑰長度)來重新組裝正確的金鑰。
- 法醫重建引擎
- 應用糾錯、重組和統計合理性檢查來重建完整的金鑰。
- 透過檢查重構金鑰與交易簽章或位址推導是否一致,提供加密驗證。
技術特點
- 頻譜記憶體分析:偵測物件銷毀後留下的「幽靈」字串。
- 熵熱圖:可視化記憶體轉儲中可能存在私鑰的高熵扇區。
- 自主金鑰驗證器:根據可疑金鑰材料建立比特幣地址,並根據區塊鏈資料進行驗證。
Cryptospector 和頻譜字串洩漏
頻譜字串洩漏漏洞源於密鑰在諸如 之類的容器中不安全地存儲std::string,這些容器在使用後未能清除內存。一旦錢包操作(例如,簽署交易)完成,私鑰可能仍然殘留在記憶體中。
攻擊流程:
- 比特幣錢包儲存私鑰
std::string。 - 序列化或記錄時,密鑰片段會未受保護地留在堆記憶體中。
- 用戶關閉了應用程序,但內存卻從未被清理。
- Cryptospector 掃描記憶體並識別與私鑰熵特徵相符的片段。
- 重構引擎可以重新組裝完整的私鑰。
- 攻擊者隨後簽署任意比特幣交易,從而竊取用戶的所有資金。
科學對比特幣生態系的影響
利用Cryptospector攻擊頻譜字串洩漏事件凸顯了其面臨的巨大風險:
- 私鑰洩漏:攻擊者如果能夠存取系統內存,就可以提取完整的金鑰,從而完全控制錢包資金。
- 大規模竊盜:在雲端基礎架構上,記憶體快照會同時暴露多個使用者的錢包。
- 取證與安全:雖然 Cryptospector 可以作為漏洞發現的研究工具,但如果落入惡意分子手中,它會加速自動錢包入侵系統的開發。
防禦性應用
雖然Cryptospector存在危險,但它也為加強加密貨幣生態系統提供了關鍵見解:
- 審核錢包程式碼:開發人員可以掃描實際部署中的殘留記憶體洩漏。
- 加密記憶體清理:工具驗證是否強制執行了正確的 SecureString 樣式容器。
- 事件回應:在懷疑系統被入侵後,Cryptospector 可以確認日誌或轉儲檔案中是否有私鑰殘餘。
針對頻譜串洩漏的對策
針對Cryptospector攻擊的預防策略包括:
- 實作刪除時覆蓋記憶體的SecureString 容器。
- 防止記錄加密資料。
- 採用強化分配器,防止在未進行清理的情況下重複使用堆疊記憶體。
- 採取防禦姿態,頻繁使用類似 Cryptospector 的工具進行靜態和動態程式碼審計。
結論
Spectral String Leak漏洞揭露了比特幣錢包實作依賴不安全容器類別(例如 `<int>`)時的脆弱性。 Cryptospectorstd::string既是利刃又是盾牌:它使攻擊者能夠從記憶體碎片中重建比特幣私鑰,但同時也提供了一種防禦工具,用於發現、分析和緩解此類漏洞。
在更廣泛的比特幣安全研究領域,Cryptospector 體現了加密工具的雙重用途——它既能推進科學審計,同時也會對設計不良的錢包構成生存威脅。比特幣安全的未來取決於採用記憶體安全架構,使 Cryptospector 的強大功能在惡意環境下失效。

研究論文:「頻譜字串洩漏」-一種密碼學漏洞機制及可靠消除方法
註解
在諸如 libbitcoin 之類的現代加密貨幣解決方案中,直接在標準 C++ 容器中處理私鑰 std::string會導致記憶體洩漏(「頻譜字串洩漏」)的風險。本文探討了這種漏洞發生的機制,展示了其潛在後果,並提出了一種在程式碼層面安全地儲存和處理秘密資料的方法。
1. 引言
私鑰、種子和其他敏感的加密資料是加密錢包和區塊鏈安全的核心。 C++ 中的記憶體管理錯誤可能導致透過標準字串物件發生頻譜洩漏。本文描述了攻擊的原因和階段,並提出了安全的解決方案 。
2. 頻譜字串洩漏漏洞的機制
2.1 標準容器的問題
常見的做法是將私鑰儲存為[ std::string此處應填寫金鑰類型],但這並未考慮安全擦除和資料生命週期方面的加密要求 。 LinkedIn
關鍵點:
std::string不保證在刪除變數或複製變數後立即可靠地清除記憶體。- 在序列化過程中(例如,使用 `seq()` 方法
write()),私鑰會被複製/輸出,最終進入日誌或緩衝區,從而可能被攔截。 micromindercs +1 - 即使物件被銷毀,資料仍可能保留在堆上,並可透過記憶體轉儲或第三方函式庫存取。 csteachers +1
2.2 攻擊階段
- 使用者的私鑰以字串形式寫入,例如,透過類別建構子:cpp
props::props(const std::string& text) NOEXCEPT : props(type::string_, text) {} - 密鑰儲存在[此處應 填寫密鑰
value_儲存位置],可以多次複製/序列化。 - 刪除物件後,不能保證記憶體會被完全清除。
- 攻擊者轉儲記憶體或攔截輸出,找到金鑰的殘餘(「幽靈」碎片),並恢復原始金鑰。
3. 後果
頻譜洩漏可能導致用戶隱私攻擊、資金損失、聲譽受損,甚至整個安全架構遭到破壞。對於熱錢包應用程式而言,這個問題尤其嚴重,因為這類應用程式最容易發生記憶體洩漏 。
4. 安全儲存私人資料的基本面
4.1 原則
- 使用後保證立即徹底清除記憶體。
- 盡量減少在指定安全渠道之外複製和輸出私人資料。
- 使用專為加密目的設計的容器和結構。
5. 安全地實施敏感資料的儲存與清理
5.1. SecureString 類別(C++ 中的安全字串)
以下是一個基於研究的安全類別的真實範例: linkedin
cpp#include <cstring>
// Безопасный контейнер для хранения секретных данных
class SecureString {
private:
char* data_;
size_t length_;
public:
// Конструктор копирует данные
SecureString(const char* src) : length_(strlen(src)) {
data_ = new char[length_ + 1];
memcpy(data_, src, length_);
data_[length_] = '\0';
}
// Безопасный деструктор: очистка памяти
~SecureString() {
if (data_) {
std::memset(data_, 0, length_); // overwrite
delete[] data_;
}
}
// Запрет нецелевого копирования/перемещения
SecureString(const SecureString&) = delete;
SecureString operator=(const SecureString&) = delete;
// Доступ для работы
const char* c_str() const { return data_; }
size_t size() const { return length_; }
};
特點:
- 直接使用動態內存,並在刪除時立即強制清理。
- 停用複製功能以防止在記憶體中建立密鑰。 github +1
- 除有限介面外,不允許進行序列化/輸出。
6. 消除產品中頻譜串洩漏的建議
- 務必使用專用、安全的容器來儲存加密金鑰。
- 如果沒有嚴格的控制措施,請勿將敏感資料暴露給資料流、日誌或使用者介面。
- 使用靜態和動態分析器審核程式碼,以偵測記憶體洩漏和側通道攻擊。
- 開發用於處理私有資料的接口,最大限度地減少資料的複製和生命週期。 micromindercs +1
7. 結論
當使用標準字串容器儲存私有數據,而沒有保證及時、徹底地從系統記憶體中刪除這些資料時,就會發生「頻譜字串洩漏」加密漏洞。解決方案在於使用專門的安全結構,嚴格控制記憶體操作,並最大限度地減少對私有資料的存取。這對於保護未來的加密錢包和區塊鏈服務至關重要。
定論
頻譜字串洩漏現象暴露了整個比特幣生態系統的一個關鍵漏洞:即使是錢包和庫中最小的記憶體管理錯誤,例如使用標準字串容器儲存私鑰,也會使可靠的加密保護形同虛設。頻譜字串洩漏攻擊允許擁有進程存取權限的攻擊者從剩餘記憶體中「提取」私鑰,繞過所有保護層,並立即控制用戶的資金。
此次攻擊是「透過殘餘記憶體洩漏實現私鑰洩漏」漏洞的科學實例,該漏洞已正式註冊,CVE編號為CVE-2023-39910,並已在libbitcoin中實現。如果沒有適當的敏感資訊處理架構,所有比特幣用戶和加密服務都面臨資產被盜的風險。比特幣安全必須從根本上保障:只有實現具有記憶體清理保障、嚴格最小化資料複製以及對私有資料輸出進行可靠控制的專用容器,我們才能真正保護新數位世界中的寶貴資產。
頻譜字串洩漏事件不僅僅是一個程式碼漏洞,它向整個社群發出了一個全球性訊號:私鑰處理中的任何缺陷都可能成為攻擊比特幣加密貨幣安全性和信任基本原則的入口,造成毀滅性打擊。 linkedin +3
- https://arxiv.org/html/2109.07634v3
- https://arxiv.org/pdf/1810.11175.pdf
- https://www.sciencedirect.com/science/article/pii/S2667295221000386
- https://socradar.io/npm-supply-chain-attack-crypto-stealing-malware/
- https://ink.library.smu.edu.sg/cgi/viewcontent.cgi?article=8646&context=sis_research
- https://research-management.mq.edu.au/ws/portalfiles/portal/93946576/93873513.pdf
- https://www.linkedin.com/pulse/secure-string-implementation-c-protecting-sensitive-data-cb-xt3ic
- https://keyhunters.ru/critical-vulnerabilities-of-private-keys-and-rpc-authentication-in-bitcoinlib-analysis-of-security-risks-and-attack-methods-on-bitcoin-cryptocurrency/
- https://forklog.com/en/critical-vulnerability-found-in-bitcoin-wallet-chips/
- https://app.opencve.io/cve/?vendor=bitcoin
參考文獻:
C++ 中的安全字串實作:保護敏感資料 linkedin;
使用 HTML 進行比特幣錢包加密 github;
加密錢包安全與金鑰管理 papers.ssrn;
加密錢包保護:網路安全 micromindercs;
加密錢包安全詳解 csteachers
- https://papers.ssrn.com/sol3/Delivery.cfm/5363844.pdf?abstractid=5363844&mirid=1
- https://www.micromindercs.com/blog/crypto-wallet-protection
- https://www.linkedin.com/pulse/secure-string-implementation-c-protecting-sensitive-data-cb-xt3ic
- https://csteachers.org/crypto-wallet-security-explained-a-practical-guide-for-all-learners/
- https://github.com/BeeEvolved/Bitcoin-Wallet-Encryption-with-HTML
- https://pmc.ncbi.nlm.nih.gov/articles/PMC6542324/
- https://onlinelibrary.wiley.com/doi/10.1155/2022/5835457
- https://www.sciencedirect.com/science/article/pii/S2542660523003426
- https://www.nature.com/articles/s41598-023-44101-x
- https://www.sciencedirect.com/science/article/pii/S1319157821000690
- https://www.andela.com/blog-posts/secure-coding-in-c-avoid-buffer-overflows-and-memory-leaks
- https://orbit.dtu.dk/files/210453529/09036864.pdf
- https://stackoverflow.com/questions/33659609/keep-temporary-stdstring-and-return-c-str-to-prevent-memory-leaks
- https://arxiv.org/pdf/2405.04332.pdf
- https://www.janeasystems.com/blog/how-to-avoid-cpp-memory-leaks-in-ml-projects
- https://zimperium.com/hubfs/MAPS/WP/FIN/5_Steps_to_Securing_Mobile_Crypto_Wallets_from_Scams_and_Attacks_24.pdf?hsLang=en
- https://cplusplus.com/forum/general/45730/
- https://labex.io/tutorials/cpp-how-to-manage-memory-in-string-operations-419088
- https://labex.io/tutorials/cpp-how-to-protect-memory-in-c-input-493611
- https://www.reddit.com/r/cpp_questions/comments/wyzsts/i_created_a_memory_leak_using_smart_pointers/
- https://milksad.info/disclosure.html
- https://www.binance.com/cs/square/post/951306
- https://www.linkedin.com/pulse/secure-string-implementation-c-protecting-sensitive-data-cb-xt3ic
- https://www.reddit.com/r/cpp_questions/comments/ivwbm7/how_can_using_cstyle_strings_lead_to_security/
- https://johnfarrier.com/12-ways-c-developers-increase-cyber-attack-vulnerabilities-and-how-to-prevent-them/
- https://b8c.ru/author/wallet/page/11/
- https://www.reddit.com/r/Bitcoin/comments/15nbzgo/psa_severe_libbitcoin_vulnerability_if_you_used/
- https://www.cryptography101.org/programming/cpp.html
- https://security.snyk.io/vuln/SNYK-DEBIAN13-LIBCRYPTO-6129733
- https://www.schneier.com/blog/archives/2023/08/cryptographic-flaw-in-libbitcoin-explorer-cryptocurrency-wallet.html
- https://pdfs.semanticscholar.org/c678/d64aa220af62d1397da19f43c1fef0f08316.pdf
- https://github.com/libbitcoin/libbitcoin-system/wiki/Altchain-Encrypted-Private-Keys
- https://stackoverflow.com/questions/1648618/techniques-for-obscuring-sensitive-strings-in-c
- https://github.com/libbitcoin/libbitcoin-system
- https://core.ac.uk/download/pdf/301367593.pdf
- https://nvd.nist.gov/vuln/detail/CVE-2023-39910
- https://stackoverflow.com/questions/17968803/threadlocal-memory-leak
- https://www.bacancytechnology.com/blog/cpp-for-cybersecurity
- https://bitcoinworld.co.in/disappearance-of-900k-puts-focus-on-vintage-bitcoin-project-libbitcoin/
- https://blog.openresty.com/en/xray-casestudy-lua-lru/
- https://github.com/lirantal/vulnerable-c-and-cpp
- https://groups.google.com/g/cryptopp-users/c/1q0r9zvDrdU
- https://github.com/libbitcoin/libbitcoin-system/wiki/Addresses-and-HD-Wallets
- https://www.diva-portal.org/smash/get/diva2:1570405/FULLTEXT02.pdf
- https://www.reddit.com/r/cpp_questions/comments/wyzsts/i_created_a_memory_leak_using_smart_pointers/
- https://lsds.doc.ic.ac.uk/sites/default/files/bitcoin17-final21.pdf
- https://sean.heelan.io/2023/03/01/finding-10x-performance-improvements-in-c-with-codeql-part-2-2-on-combining-dynamic-and-static-analysis-for-performance-optimisation/
- https://github.com/Tencent/rapidjson/issues/1465
- https://stackoverflow.com/questions/2745074/fast-ceiling-of-an-integer-division-in-cc
- https://devblogs.microsoft.com/oldnewthing/20170209-00/?p=95397
- https://github.com/libbitcoin/libbitcoin-system/wiki/Value-Proposition
- https://stackoverflow.com/questions/13001784/stdstring-memory-leak
- https://dl.acm.org/doi/full/10.1145/3596906
- https://stackoverflow.com/questions/639694/are-c-static-code-analyis-tools-worth-it
- https://forums.codeguru.com/showthread.php?300556-STL-Memory-Leaks
- https://formulae.brew.sh/formula/
- https://www.reddit.com/r/cpp/comments/1eoj0a9/an_empirical_study_of_static_analysis_tools_for/
- https://forums.codeguru.com/showthread.php?338365-std-string-leaks-memory%2Fpage2
參考文獻:
C++ 中的安全字串實作 (LinkedIn)
、BitcoinLib 金鑰洩漏漏洞分析 (Keyhunters)、
比特幣錢包晶片中發現的關鍵漏洞 (Forklog
)、加密錢包保護 (Micromindercs)、
比特幣核心 CVE 註冊表 (OpenCVE)
- https://keyhunters.ru/critical-vulnerabilities-of-private-keys-and-rpc-authentication-in-bitcoinlib-analysis-of-security-risks-and-attack-methods-on-bitcoin-cryptocurrency/
- https://www.linkedin.com/pulse/secure-string-implementation-c-protecting-sensitive-data-cb-xt3ic
- https://www.micromindercs.com/blog/crypto-wallet-protection
- https://forklog.com/en/critical-vulnerability-found-in-bitcoin-wallet-chips/
- https://app.opencve.io/cve/?vendor=bitcoin
- https://stackoverflow.com/questions/41798497/memory-leak-in-crypto-rsaes-class
- https://cve.mitre.org/cgi-bin/cvekey.cgi
- https://www.cve.org/CVERecord/SearchResults?query=bitcoin
- https://nvd.nist.gov/vuln/detail/cve-2024-38365
- https://mirror.softwareheritage.enea.it/browse/revision/ff78d94b131d7bb3b761509d3ce0dd864b1420e3/?path=CHANGES.md
- https://en.wikipedia.org/wiki/Spectre_(security_vulnerability)
- https://en.wikipedia.org/wiki/Spectral_leakage
- https://nvd.nist.gov/vuln/detail/CVE-2022-49566
- https://www.cisa.gov/news-events/bulletins/sb12-226
- https://www.klingbeil.com/data/Klingbeil_Dissertation_web.pdf
- https://access.redhat.com/security/cve/cve-2022-49566
- https://nodejs.org/api/crypto.html
- https://pubchem.ncbi.nlm.nih.gov/compound/Theobromine
- https://feedly.com/cve/CVE-2025-29774
- https://en.bitcoin.it/wiki/Changelog
- https://fastercapital.com/keyword/spectral-leakage.html/1
- https://sean.heelan.io/author/seanhn/