ArcSign / Blog / mlock 記憶體保護

mlock 記憶體保護是什麼?為什麼你的錢包需要它

2026-03-17 · 閱讀時間約 10 分鐘 P1 安全教育 記憶體保護
mlock 記憶體保護示意圖
目錄

你的私鑰正在記憶體中「裸奔」

每次你用加密錢包簽署一筆交易,私鑰都必須被載入到電腦的記憶體(RAM)中。這是無法避免的 — 簽署演算法需要讀取私鑰才能計算出有效的數位簽章。

問題在於:大多數錢包在完成簽署後,並不會妥善處理記憶體中的私鑰。更糟的是,你的作業系統可能會在你不知情的情況下,將記憶體中的私鑰寫入磁碟 — 這被稱為「記憶體交換」(memory swap)。

一旦私鑰被寫入磁碟,它可能在那裡存留數天、數週、甚至數月。任何能夠存取你磁碟的人 — 無論是駭客、惡意軟體、或者取得你電腦的人 — 都可能從磁碟中恢復你的私鑰,盜取你的全部加密資產。

真實案例

2023 年 LastPass 遭駭事件中,攻擊者從開發者電腦的記憶體轉儲(memory dump)中取得了解密金鑰,導致超過 1.5 億美元的加密資產被盜。這正是記憶體保護不足的後果。

mlock 就是為了解決這個問題而存在的。它是作業系統提供的一道「記憶體保險鎖」,確保你的私鑰永遠不會被寫入磁碟。

mlock 是什麼?一個簡單的比喻

想像你的電腦記憶體(RAM)是一張辦公桌,你的硬碟是一個抽屜。正常情況下,當桌面空間不夠時,作業系統會把桌上暫時不用的文件放進抽屜(swap),等需要時再拿出來。

這對一般文件沒問題。但如果桌上有一張寫著你銀行密碼的紙條呢?你絕對不希望這張紙條被放進抽屜 — 因為抽屜沒有鎖,任何人打開都能看到。

mlock 就像在這張紙條上貼了一個標記,告訴作業系統:「這份資料永遠不准放進抽屜,必須留在桌上。」當電腦關機時,桌面上的東西會自動消失(RAM 是揮發性記憶體),但抽屜裡的東西不會。

沒有 mlock 的情況
私鑰載入 RAM
OS 將 RAM 交換到磁碟
私鑰殘留在磁碟上
攻擊者可恢復
有 mlock 保護的情況
私鑰載入 RAM
mlock 鎖定記憶體頁面
私鑰僅存在 RAM 中
關機即消失

技術上來說,mlock 是 POSIX 標準定義的系統呼叫(system call),在 Linux 和 macOS 上都可使用。Windows 上的對應功能是 VirtualLock。呼叫 mlock 後,作業系統保證指定的記憶體頁面不會被交換到 swap 分區。

三種記憶體攻擊方式

理解 mlock 的重要性,需要先了解攻擊者如何從記憶體中竊取你的私鑰。以下是三種最常見的記憶體攻擊方式:

1. Swap-to-Disk 攻擊(磁碟交換攻擊)

這是 mlock 直接防禦的攻擊類型。當你的電腦記憶體不足時,作業系統會把一部分 RAM 內容寫到磁碟上的 swap 分區(Linux)或 pagefile(Windows)。如果你的私鑰恰好在這些被交換出去的頁面中,它就會以明文形式留在磁碟上。

攻擊者只需要:取得你的磁碟存取權限(物理或遠端),然後在 swap 分區中搜尋特定格式的私鑰資料。這不需要高超的技術 — 有現成工具可以做到。

2. Cold Boot 攻擊(冷啟動攻擊)

RAM 在斷電後並不會立即清零 — 資料會殘留數秒到數分鐘。冷啟動攻擊利用這個特性:攻擊者在你的電腦還開著時,強制重啟並從 USB 啟動一個特殊工具,在 RAM 資料消失前將其完整讀出。如果私鑰還在 RAM 中,就會被擷取。

mlock 本身不直接防禦冷啟動攻擊(因為資料確實在 RAM 中),但配合 ArcSign 的「使用後立即清零」機制,私鑰只在簽署的幾毫秒內存在於記憶體中,大幅減少了被擷取的時間窗口。

3. Memory Dump 攻擊(記憶體轉儲攻擊)

惡意軟體或有權限的攻擊者可以對正在運行的程式進行記憶體轉儲(memory dump),取得程式記憶體中的所有資料。如果私鑰正在被使用,就可能被捕獲。

防禦方式:最小化私鑰在記憶體中的存活時間。ArcSign 的簽署時間只有 1-5 毫秒,之後立即清除。攻擊者需要在這個極短的時間窗口內精確捕獲,難度極高。

攻擊類型 風險等級 mlock 防護 ArcSign 額外防護
Swap-to-Disk 完全防護 記憶體鎖定 + 使用後清零
Cold Boot 間接防護 1-5ms 暴露窗口 + 立即清零
Memory Dump 中高 不適用 最小化暴露時間 + XOR 分片

ArcSign 的四層記憶體防護

ArcSign 不僅僅使用 mlock — 它建立了一套完整的四層記憶體保護體系,確保你的私鑰在任何情境下都盡可能安全:

1
mlock 記憶體鎖定

ArcSign 在載入私鑰的瞬間,立即對存放私鑰的記憶體區域呼叫 mlock。這確保私鑰所在的記憶體頁面永遠不會被作業系統交換到磁碟。在 macOS 和 Linux 上使用 syscall.Mlock(),在 Windows 上使用 VirtualLock()

2
最小化暴露時間(1-5 毫秒)

ArcSign 的簽署流程經過極致優化:私鑰從 USB 載入 → 簽署交易 → 立即清零。整個過程只需要 1-5 毫秒。相比之下,許多軟體錢包在整個應用程式運行期間都將私鑰保留在記憶體中。

3
使用後立即清零(Zeroing)

簽署完成後,ArcSign 不是簡單地「釋放」記憶體(釋放不等於清除),而是主動將存放私鑰的每一個 byte 覆寫為零。這確保即使有人在之後讀取這塊記憶體,也只會看到全零。Go 語言中使用 for i := range key { key[i] = 0 } 並配合編譯器優化屏障,防止清零操作被最佳化掉。

4
XOR 三分片保護

即使在 USB 上儲存時,私鑰也不是以原始形式存在。ArcSign 使用 XOR 三分片技術將私鑰拆分成三個片段,分散存放。只有三個片段同時組合才能還原私鑰。這意味著即使攻擊者突破了記憶體保護,取得的也只是片段,而非完整私鑰。

四層防護的協同效應

這四層保護不是互相替代,而是互相補強。mlock 防止磁碟洩露、最小化時間減少攻擊窗口、清零消除殘留、XOR 分片確保即使突破一層也無法取得完整私鑰。攻擊者必須同時突破所有四層才可能成功 — 而且需要在 1-5 毫秒的窗口內完成。

錢包記憶體保護比較表

不同類型的加密錢包在記憶體保護方面有很大差異。以下比較幫你了解各方案的防護等級:

防護項目 MetaMask Trust Wallet Ledger ArcSign
mlock 記憶體鎖定 不支援 不支援 不適用* 支援
私鑰暴露時間 應用運行期間 應用運行期間 晶片內部 1-5 毫秒
使用後清零 無保證 無保證 晶片內處理 主動清零
Swap-to-Disk 防護 不適用* mlock 防護
金鑰分片 XOR 三分片
價格 免費 免費 $79-$149 免費

*Ledger 使用專用安全晶片,私鑰不經過主機記憶體,因此 mlock 和 swap 保護「不適用」。但 Ledger 有供應鏈風險和韌體後門的疑慮。

MetaMask 和 Trust Wallet 是瀏覽器擴充功能和手機 App,受限於執行環境,無法呼叫底層的 mlock 系統呼叫。這意味著你的私鑰有可能被作業系統寫入磁碟,而你完全不知情。

ArcSign 是桌面原生應用程式(使用 Go 語言 + Tauri 框架),可以直接呼叫作業系統 API,這是它能實現 mlock 保護的關鍵原因。

加密備份檔:mlock 之外的終極保險

mlock 保護的是「運行時」的安全 — 當你的錢包正在使用時,私鑰不會被洩露到磁碟。但如果你的 USB 遺失或損壞呢?你需要一個同樣安全的備份方案。

傳統冷錢包要求你用紙筆抄寫 12 個助記詞。這個方法有嚴重問題:

ArcSign 提供了更好的解法:一鍵匯出 AES-256 加密的 .arcsign 備份檔

備份方式 紙筆助記詞 .arcsign 加密備份檔
加密保護 無(明文) AES-256 加密
被他人取得 立即被盜 無法破解
備份容易度 手動抄寫 12 詞 一鍵匯出
恢復方式 逐字輸入 一鍵匯入 + 密碼
多份備份風險 高(每份都是明文) 低(每份都有加密)
耐久性 紙張會降解 數位檔案可無限複製
最佳備份策略

將 .arcsign 加密備份檔存到第二支 USB 隨身碟,放在不同的物理位置(例如家裡和辦公室各一支)。即使一支 USB 損壞或遺失,你仍然可以從另一支完整恢復。備份檔即使被他人取得,沒有密碼也無法解密。

技術深入:mlock 的工作原理

對技術有興趣的讀者,以下深入解析 mlock 在作業系統層面的運作方式。

作業系統的虛擬記憶體機制

現代作業系統使用虛擬記憶體管理 RAM。每個程式看到的是連續的虛擬地址空間,由作業系統映射到實體 RAM 頁面。當實體 RAM 不足時,作業系統會選擇一些「最近最少使用」的頁面,將其內容寫入磁碟上的 swap 分區,然後釋放這些 RAM 頁面給其他程式使用。

這個過程對程式是透明的 — 程式不知道自己的記憶體被交換了。當程式再次存取被交換出去的頁面時,會觸發「頁面錯誤」(page fault),作業系統再從 swap 讀回資料。

mlock 的系統呼叫介面

// Go 語言中使用 mlock(簡化示意)
import "syscall"

func protectKey(key []byte) error {
    // 將 key 所在的記憶體頁面鎖定在 RAM 中
    // 作業系統保證不會將其交換到磁碟
    return syscall.Mlock(key)
}

func cleanupKey(key []byte) {
    // 使用後將每個 byte 清零
    for i := range key {
        key[i] = 0
    }
    // 解除 mlock 鎖定
    syscall.Munlock(key)
}

跨平台實作

ArcSign 是用 Go 語言編寫的,而 Go 提供了跨平台的系統呼叫介面:

ArcSign 在編譯時自動選擇對應平台的實作,使用者無需做任何設定。

為什麼瀏覽器錢包做不到

MetaMask 等瀏覽器擴充功能運行在瀏覽器的沙盒環境中。瀏覽器不允許擴充功能直接呼叫 mlock 等系統呼叫 — 這是瀏覽器安全模型的設計。JavaScript 也沒有「記憶體清零」的概念,垃圾回收器何時清除記憶體完全不可控。

這就是為什麼 ArcSign 選擇桌面原生架構(Go + Tauri)而非瀏覽器擴充。只有原生應用才能呼叫底層作業系統的安全 API,提供真正的記憶體保護。

常見問題(FAQ)

mlock 是什麼?

mlock 是 Linux/macOS 作業系統提供的系統呼叫(system call),功能是將指定的記憶體頁面「鎖定」在實體 RAM 中,防止作業系統將其交換(swap)到磁碟上的交換區。這確保敏感數據永遠只存在於揮發性記憶體中,電腦關機後自動消失。

為什麼加密錢包需要 mlock?

加密錢包在簽署交易時需要將私鑰載入記憶體。沒有 mlock 保護,作業系統可能在記憶體不足時將私鑰寫入磁碟的 swap 分區。磁碟上的數據可以被恢復工具讀取,即使你「刪除」了檔案。mlock 確保私鑰永遠不會離開 RAM。

哪些錢包有使用 mlock?

大多數軟體錢包(如 MetaMask、Trust Wallet)是瀏覽器外掛或手機 App,無法直接呼叫 mlock。ArcSign 是桌面原生應用(Go + Tauri),可以直接使用作業系統的 mlock 保護。一些硬體錢包(如 Ledger)不需要 mlock,因為它們有自己的安全晶片,私鑰不經過主機記憶體。

mlock 能防止所有記憶體攻擊嗎?

mlock 主要防止 swap-to-disk 攻擊和冷啟動攻擊。對於正在運行的程序,記憶體中的數據仍然需要其他保護措施,例如最小化暴露時間、使用後立即清零、以及 XOR 分片保護。ArcSign 結合了所有這些技術來提供多層防護。

ArcSign 的記憶體保護和硬體錢包的安全晶片有什麼不同?

硬體錢包使用專用安全晶片(如 ST31、ATECC608)將私鑰隔離在獨立處理器中。ArcSign 使用 USB 隔離 + mlock + XOR 分片 + AES-256 加密的軟體多層防護。兩者目標相同:確保私鑰不被盜取。ArcSign 的優勢是完全免費、架構透明(計畫用戶破萬後開源)、且無供應鏈風險。

你的私鑰值得最好的保護

ArcSign 提供 mlock 記憶體鎖定、XOR 分片、AES-256 加密備份 — 全部免費。不要讓你的私鑰在記憶體中裸奔。

免費下載 ArcSign