mlock 記憶體保護是什麼?為什麼你的錢包需要它
你的私鑰正在記憶體中「裸奔」
每次你用加密錢包簽署一筆交易,私鑰都必須被載入到電腦的記憶體(RAM)中。這是無法避免的 — 簽署演算法需要讀取私鑰才能計算出有效的數位簽章。
問題在於:大多數錢包在完成簽署後,並不會妥善處理記憶體中的私鑰。更糟的是,你的作業系統可能會在你不知情的情況下,將記憶體中的私鑰寫入磁碟 — 這被稱為「記憶體交換」(memory swap)。
一旦私鑰被寫入磁碟,它可能在那裡存留數天、數週、甚至數月。任何能夠存取你磁碟的人 — 無論是駭客、惡意軟體、或者取得你電腦的人 — 都可能從磁碟中恢復你的私鑰,盜取你的全部加密資產。
2023 年 LastPass 遭駭事件中,攻擊者從開發者電腦的記憶體轉儲(memory dump)中取得了解密金鑰,導致超過 1.5 億美元的加密資產被盜。這正是記憶體保護不足的後果。
mlock 就是為了解決這個問題而存在的。它是作業系統提供的一道「記憶體保險鎖」,確保你的私鑰永遠不會被寫入磁碟。
mlock 是什麼?一個簡單的比喻
想像你的電腦記憶體(RAM)是一張辦公桌,你的硬碟是一個抽屜。正常情況下,當桌面空間不夠時,作業系統會把桌上暫時不用的文件放進抽屜(swap),等需要時再拿出來。
這對一般文件沒問題。但如果桌上有一張寫著你銀行密碼的紙條呢?你絕對不希望這張紙條被放進抽屜 — 因為抽屜沒有鎖,任何人打開都能看到。
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 — 它建立了一套完整的四層記憶體保護體系,確保你的私鑰在任何情境下都盡可能安全:
ArcSign 在載入私鑰的瞬間,立即對存放私鑰的記憶體區域呼叫 mlock。這確保私鑰所在的記憶體頁面永遠不會被作業系統交換到磁碟。在 macOS 和 Linux 上使用 syscall.Mlock(),在 Windows 上使用 VirtualLock()。
ArcSign 的簽署流程經過極致優化:私鑰從 USB 載入 → 簽署交易 → 立即清零。整個過程只需要 1-5 毫秒。相比之下,許多軟體錢包在整個應用程式運行期間都將私鑰保留在記憶體中。
簽署完成後,ArcSign 不是簡單地「釋放」記憶體(釋放不等於清除),而是主動將存放私鑰的每一個 byte 覆寫為零。這確保即使有人在之後讀取這塊記憶體,也只會看到全零。Go 語言中使用 for i := range key { key[i] = 0 } 並配合編譯器優化屏障,防止清零操作被最佳化掉。
即使在 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 的系統呼叫介面
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 提供了跨平台的系統呼叫介面:
- Linux:使用
mlock(2)系統呼叫,受RLIMIT_MEMLOCK限制(預設 64KB 通常足夠) - macOS:使用
mlock(2),Darwin 核心完全支援 - Windows:使用
VirtualLock()Win32 API,功能等同
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 的優勢是完全免費、架構透明(計畫用戶破萬後開源)、且無供應鏈風險。