Linux

在某些假設下將未加密的密鑰儲存在 RAM 上的可行性

  • September 10, 2021

我們有執行 Linux 5.4.31 核心的物聯網網關。這些網關需要管理數以千計的移動設備,每個設備都有唯一的加密密鑰。這個想法是當設備進入範圍時從伺服器(通過安全通道)獲取設備的密鑰,只要設備在範圍內就使用它進行解密,並在離開時從記憶體中刪除密鑰。必須在網關上進行解密,因為我們必鬚根據接收到的數據執行特定操作。

我們希望將密鑰儲存在未加密的 RAM 中,因為我們不希望每次訪問它們時都需要解密密鑰的成本。我們有以下假設:

  1. 無法物理訪問網關。
  2. 該服務在非 root 使用者下執行。
  3. 攻擊者可能會以非 root 使用者身份訪問網關(如果重要,這與服務使用者不同)。
  4. 攻擊者可能會發起緩衝區溢出攻擊。

在這些假設下,攻擊者有哪些選擇來訪問 RAM 上的加密密鑰,如果

  1. 我們將密鑰儲存在靜態分配的記憶體中(通過 C 中的 static 關鍵字,而不是在堆棧中)
  2. 我們將密鑰儲存在動態分配的記憶體中(由於資源有限,這可能是一次性分配)。

另外我們應該對非root使用者施加什麼限制,例如他們不能訪問交換記憶體、核心轉儲、安裝包、使用gdb等,以防止訪問程序RAM?

注意:如果攻擊者俱有 root 訪問權限,那麼他們可以使用用於訪問伺服器的私鑰訪問所有密鑰,因此我們不考慮此問題的這種情況。

您可能會在Information Security SE上獲得更好的答案。

您應該通過鎖定相關的記憶體範圍來確保密鑰不會被寫入交換空間(請參閱 參考資料mlock);如果您為鍵分配記憶體池,這更容易做到。

另外我們應該對非root使用者施加什麼限制,例如他們不能訪問交換記憶體、核心轉儲、安裝包、使用gdb等,以防止訪問程序RAM?

非 root 使用者無論如何都無法訪問交換,並且通過將密鑰鎖定在記憶體中,您可以完全避免該問題。非root使用者也不能訪問除了他們自己的程序生成的核心轉儲之外,他們也不能訪問ptrace其他使用者的程序(這意味著他們不能執行gdb等來查看其他程序的記憶體)。

如果您的 CPU 提供所需的功能,您可以考慮使用pkeys額外的保護。另一種可能性是將密鑰處理完全委託給核心。有關keyrings詳細資訊,請參見手冊頁

引用自:https://unix.stackexchange.com/questions/668475