FreeBSD 提出了一種應用程式隔離機制的實現,類似於 OpenBSD 專案開發的 plegde 和 reveal 系統呼叫。在 plegde 中,隔離是透過禁止存取應用程式中未使用的系統呼叫來實現的;而在 reveal 中,隔離是透過選擇性地僅對應用程式可以使用的單一檔案路徑開放存取權來實現的。系統會為應用程式建立一個類似白名單的系統呼叫和檔案路徑,所有其他呼叫和路徑都被禁止。
為 FreeBSD 開發的 plegde 和 reveal 類似物之間的區別在於,它們提供了一個額外的層,允許在不更改程式碼或僅進行少量更改的情況下隔離應用程式。回想一下,在 OpenBSD 中,plegde 和 reveal 旨在與基礎環境緊密整合,並透過在每個應用程式的程式碼中添加特殊註解來應用。為了簡化保護的組織,過濾器可讓您在無需詳細說明單一系統呼叫的情況下作業系統呼叫的類別(輸入/輸出、讀取檔案、寫入檔案、套接字、ioctl、sysctl、啟動進程等)。在執行某些操作時,可以在應用程式程式碼中呼叫存取限制函數,例如,在開啟必要的檔案並建立網路連線後,可以關閉對套接字和檔案的存取。
FreeBSD 的 plegde 和 reveal 移植的作者希望提供隔離任意應用程式的功能,為此,我們提出了一個「curl」實用程序,允許將單獨檔案中定義的規則應用於應用程式。建議的配置包括一個包含基本設定的文件,用於定義系統呼叫的類別以及特定於某些應用程式(例如處理聲音、網路互動、輸出到日誌等)的典型檔案路徑,以及一個包含特定應用程式存取規則的檔案。
窗簾實用程式可用於隔離大多數未經修改的實用程式、伺服器進程、圖形應用程序,甚至整個桌面會話。它支援與 Jail 和 Capsicum 子系統提供的隔離機制一起使用。當運行中的應用程式繼承父應用程式設定的規則時,也可以組織巢狀隔離,並對其進行單獨的限制。某些核心操作(偵錯工具、POSIX/SysV IPC、PTY)使用屏障機制進行額外保護,該機制不允許存取當前進程或父進程以外的進程所建立的核心物件。
進程可以透過呼叫curtainctl或使用libcurtain函式庫提供的plegde()和unveil()函數來設定自身的隔離,類似OpenBSD中的函數。 sysctl的「security.curtain.log_level」用於追蹤應用程式運行期間的阻塞情況。在啟動curtain時,可以透過指定“-X”/“-Y”和“-W”選項分別啟用對X11和Wayland協議的訪問,但對圖形應用程式的支援尚不夠穩定,並且存在一些未解決的問題(問題主要出現在使用X11時,而Wayland支援實現得更好)。使用者可以透過建立包含規則的本機檔案(~/.curtain.conf)來新增其他限制。例如,若要僅允許從Firefox寫入~/Downloads/目錄,您可以新增「[firefox]」部分,並使用規則「~/Downloads/ : rw +」。
此實作包括用於強制存取控制(MAC)的 mac_curtain 核心模組、一組用於實現必要處理程式和過濾器的 FreeBSD 核心修補程式、用於在應用程式中使用 plegde 和 reveal 函數的 libcurtain 程式庫、curtain 實用程式、範例設定檔、一組測試以及一些使用者空間程式的 libcurtain 程式庫、curtain 實用程式、範例設定檔、一組測試以及一些使用者空間程式的 libcurtain 程式庫、curtain 公用程式、範例設定檔、一組測試以及一些使用者空間程式的程式的統一作者希望盡可能減少需要修補核心和應用程式的更改次數。
來源: opennet.ru
