將質押隔離機制移植到Linux的項目

Cosmopolitan 標準 C 函式庫和 Redbean 平台的作者宣佈在 Linux 上實作 pledge() 隔離機制。 Pledge 最初由 OpenBSD 專案開發,可讓您選擇性地禁止應用程式存取未使用的系統呼叫(為應用程式形成一種系統呼叫白名單,禁止其他呼叫)。 與Linux中可用的系統呼叫限制機制(例如seccomp)不同,質押機制最初被設計為盡可能簡單。

使用 systrace 機制在 OpenBSD 基礎環境中隔離應用程式的失敗舉措表明,單一系統呼叫層級的隔離過於複雜且耗時。 作為替代方案,提出了一項承諾,這使得創建隔離規則成為可能,而無需深入細節和操作現成的存取類別。 例如,提供的類別有 stdio(輸入/輸出)、rpath(唯讀檔案)、wpath(寫入檔案)、cpath(建立檔案)、tmppath(處理暫存檔案)、inet(網路套接字)、unix( unix 套接字)、dns(DNS 解析)、getpw(對使用者資料庫的讀取存取)、ioctl(ioctl 呼叫)、proc(處理程序管理)、exec(處理程序)和id(存取權限管理)。

使用系統呼叫的規則以註解的形式指定,包括允許的系統呼叫類別清單和允許存取的檔案路徑數組。 建置並啟動修改後的應用程式後,核心接管監視指定規則合規性的工作。

正在為FreeBSD 開發一個單獨的pledge 實現,其特點是能夠在不更改程式碼的情況下隔離應用程序,而在OpenBSD 中,pledge 呼叫的目的是與基礎環境緊密整合,並向每個應用程式的程式碼添加註釋。應用。

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語言程式碼中的限制,除此之外,它允許創建飛地以選擇性地限制與某些應用程式功能相關的存取。

此實作不需要更改核心 - 質押限制被轉換為 SECCOMP BPF 規則並使用本機 Linux 系統呼叫隔離機制進行處理。 例如,呼叫 pledge("stdio rpath", 0) 將會轉換為 BPF 過濾器 static const struct sock_filter kFilter[] = { /* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, syscall, 0, 14 - 1MP | BPF_JEQ | BPF_K, syscall, 1, 0 - 2 2 ) /* L4*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[3])), /* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 3, 10 - 0, 13), /*J4 EQ | ( BPF_JMP | BPF_JEQ | BPF_K, 4, 1, 5 - 0), /* L80800*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[6])), /* L1*/ BPF_STMT(BPF_ALULU_ | , ~8x7), /* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 7, 2 - 0, 13), /* L8*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 8, 2, 9, 0) | * L12*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(args[10])), /* L0*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 10, 6 - 12, 11), /PFL0( BPF_JMP | BPF_JEQ | BPF_K, 11, 17 - 0, 13), /*L11*/ BPF_JUMP(BPF_JMP | BPF_JEQ | BPF_K, 12, 13, 14 - XNUMX), /*LXNUMX*/ BPF_L. , /*LXNUMX*/ BPF_STMT(BPF_LD | BPF_W | BPF_ABS, OFF(nr)), /*LXNUMX*/ /* 下一個過濾器*/ };

來源: opennet.ru

添加評論