最近, Cosmopolitan C 標準庫和 Redbean 平台的作者宣佈在 Linux 上實現 poll() 隔離機制。
Pledge 最初由 OpenBSD 專案開發,它允許您選擇性地禁止應用程式存取未使用的系統呼叫(為應用程式建立系統呼叫白名單,並禁止其他呼叫)。與 Linux 中可用的系統呼叫存取控制機制(例如 seccomp)不同,Pledge 從一開始就被設計得盡可能用戶友好。
使用 systrace 機制在 OpenBSD 基礎環境中隔離應用程序的失敗舉措表明,在單個系統調用級別的隔離過於復雜和耗時。
或者,可以採用 promise,它允許建立隔離規則,而無需詳細說明和操作已準備好的存取類別。
例如,提供的類有 stdio(輸入/輸出)、rpath(只讀文件)、wpath(寫入文件)、cpath(創建文件)、tmppath(處理臨時文件)、inet(套接字網絡)、unix(unix 套接字)、dns(DNS 解析)、getpw(對用戶數據庫的讀取訪問權限)、ioctl(ioctl 調用)、proc(進程控制)、exec(啟動進程)和 id(權限控制)。
系統呼叫的使用規則以註解的形式指定,其中包括允許的系統呼叫類別清單和允許存取的檔案路徑陣列。編譯並運行修改後的應用程式後,核心將接管監控是否遵守這些規則的任務。
另外,FreeBSD 的質押實現正在開發中,其特點是能夠在不更改代碼的情況下隔離應用程序,而在 OpenBSD 中質押調用旨在與基礎環境緊密集成並在代碼中添加註釋每一個。
當老闆說我們應該使用像Linux這樣的東西時,承諾就像我們都渴望的禁果。 為什麼這很重要? 這是因為承諾()實際上使安全性可以理解。 Linux 從來沒有真正擁有普通人可以理解的安全層。
Linux Pledge 移植版的開發者效仿 FreeBSD 的做法,沒有修改程式碼,而是從 pledge.com 提供了一個額外的實用程序,允許您在不更改應用程式程式碼的情況下應用限制。例如,要僅允許存取系統呼叫類別 stdio、rpath、inet 和 threadstdio 來執行 curl 實用程序,只需執行 `./pledge.com -p 'stdio rpath inet thread' curl http://example.com`。
該實用程式適用於 RHEL6 及更高版本的所有 Linux 發行版,且無需 root 權限。此外,它還基於 cosmopolitan 庫提供了一個 API,用於管理 C 程式程式碼中的權限限制,從而允許創建 enclave 以選擇性地限制對特定應用程式功能的存取。
過去已經有一些開發人員嘗試過這個。 我不會點名,因為這些項目中的大多數都沒有完成。 對於 SECOMP,在線教程只解釋瞭如何將系統調用列入白名單,因此大多數人在弄清楚如何過濾參數之前就失去了興趣。 向前推進的項目也有一些疏忽,比如允許更改 setuid/setgid/sticky 位。 因此,不應使用任何當前的替代方案。 我認為這種努力使我們比以往任何時候都更接近擁有承諾()。
實現不需要內核更改:實用程序約束被轉換為 SECCOMP BPF 規則並使用 Linux 的本機系統調用隔離機制進行處理。 例如,調用 promise("stdio rpath", 0) 將轉換為 BPF 過濾器