據稱, FreeBSD提出了一種應用程式隔離機制實作方案,類似於 OpenBSD 專案開發的 foldde 和 reveal 系統呼叫。
plegde 中的隔離是通過禁止訪問應用程序未使用的系統調用並通過選擇性地僅打開對應用程序可以使用的某些文件路徑的訪問來完成的。 對於應用程序,形成一種系統調用和文件路徑的白名單,禁止所有其他調用和路徑。
FreeBSD 開發的`pledge` 和 `unveil` 之間的區別在於,前者提供了一個額外的隔離層,允許應用程式在程式碼修改極少甚至無需修改的情況下實現隔離。需要注意的是,在 OpenBSD 中,`pledge` 和 `unlock` 的目標是與基礎環境緊密整合,並透過在每個應用程式的程式碼中添加特殊註解來實現。
為了簡化保護的組織,過濾器允許您避免單個系統調用級別的細節並操作系統調用的類(輸入/輸出、文件讀取、文件寫入、套接字、ioctl、sysctl、進程啟動等) . 當執行某些操作時,可以在應用程序代碼中調用訪問限制函數,例如,在打開必要的文件並建立網絡連接後,可以關閉對套接字和文件的訪問。
FreeBSD 版折疊和展開功能的作者旨在提供隔離任意應用程式的功能。為此,他們提出了 curtain 工具,該工具允許將定義在單獨文件中的規則應用於應用程式。建議的配置包括一個包含基本設定的文件,用於定義系統呼叫類別和特定應用程式(例如處理聲音、網路、日誌等)的典型檔案路徑;以及一個包含特定應用程式存取規則的檔案。
窗簾實用程序可用於隔離大多數實用程序、服務器進程、圖形應用程序,甚至是未修改的整個桌面會話。 支持與 Jail 和 Capsicum 子系統提供的隔離機制共享窗簾。
嵌套隔離也是可行的,在這種情況下,啟動的應用程式會繼承主應用程式建立的規則,並在此基礎上添加額外的限制。某些核心操作(例如偵錯工具、POSIX/SysV 進程間通訊、PTY)也受到屏障機制的進一步保護,該機制阻止存取由當前進程或主進程以外的進程創建的核心物件。
進程可以透過呼叫 curtainctl或使用 libcurtain 函式庫提供的 pledge() 和 reveal() 函數來配置自身的隔離級別,類似於 OpenBSD 中的實作方式。 sysctl 'security.curtain.log_level' 用於在應用程式執行時追蹤鎖定的使用情況。
X11和Wayland協議的訪問通過在啟動幕佈時指定“-X”/“-Y”和“-W”選項分別啟用,但對圖形應用程序的支持還不夠穩定,存在一系列未解決的問題(問題主要出現在使用 X11 時,Wayland 支持要好得多)。 用戶可以通過創建本地規則文件 (~/.curtain.conf) 添加額外的限制。 例如,
該實現包括用於強制訪問控制 (MAC) 的 mac_curtain 內核模塊,一組用於 FreeBSD 內核的補丁,其中包含必要的驅動程序和過濾器的實現,用於在應用程序中使用 plegde 和顯示功能的 libcurtain 庫,實用程序窗簾,顯示配置文件、一套測試和一些用戶空間程序的補丁(例如,使用 $TMPDIR 來統一處理臨時文件)。 只要有可能,作者就會盡量減少需要修補內核和應用程序的更改數量。
最後,如果您有興趣了解更多信息,可以在以下連結中找到詳細信息。