FUSE 直通

簡介

FUSE (使用者空間檔案系統) 直通是一種旨在提高 FUSE 檔案系統 I/O 操作效能的功能。 通常,FUSE 操作涉及核心和使用者空間 FUSE 守護程序之間的通訊,這可能會產生開銷。 直通允許對 FUSE 檔案執行的某些操作繞過使用者空間守護程序,並由核心直接在底層“後備檔案”上執行。

這是透過 FUSE 守護程式向 FUSE 核心模組註冊檔案描述符(指向較低檔案系統上的後備檔案)來實現的。 然後,核心接收此註冊後備檔案的識別符號 (backing_id)。 當隨後開啟 FUSE 檔案時,FUSE 守護程式可以在其對 OPEN 請求的響應中包含此 backing_id 並設定 FOPEN_PASSTHROUGH 標誌。 這為特定操作建立了直接連結。

目前,直通支援的操作包括 read(2)/write(2)(透過 read_iter/write_iter)、splice(2)mmap(2)

啟用直通

要使用 FUSE 直通:

  1. 必須編譯啟用 CONFIG_FUSE_PASSTHROUGH 的 FUSE 檔案系統。

  2. FUSE 守護程式必須在 FUSE_INIT 握手期間協商 FUSE_PASSTHROUGH 功能並指定其所需的 max_stack_depth

  3. (特權)FUSE 守護程式在其連線檔案描述符(例如,/dev/fuse)上使用 FUSE_DEV_IOC_BACKING_OPEN ioctl 來註冊後備檔案描述符並獲取 backing_id

  4. 在處理 FUSE 檔案的 OPENCREATE 請求時,守護程式在 fuse_open_out::open_flags 中設定 FOPEN_PASSTHROUGH 標誌,並在 fuse_open_out::backing_id 中提供相應的 backing_id

  5. 當不再需要將後備檔案用於直通設定時,FUSE 守護程式應最終呼叫 FUSE_DEV_IOC_BACKING_CLOSE 並提供 backing_id 以釋放核心對後備檔案的引用。

許可權要求

目前,設定直通功能要求 FUSE 守護程序具有 CAP_SYS_ADMIN 功能。 此要求源於一些正在積極討論和處理的安全和資源管理方面的考慮因素。 以下詳細說明了此限制的主要原因。

資源核算和可見性

直通的核心機制涉及 FUSE 守護程式開啟指向後備檔案的檔案描述符,並透過 FUSE_DEV_IOC_BACKING_OPEN ioctl 向 FUSE 核心模組註冊該檔案描述符。 此 ioctl 返回與核心內部 struct fuse_backing 物件關聯的 backing_id,該物件儲存對後備 struct file 的引用。

一個重要的擔憂是,FUSE 守護程式可以在註冊後關閉其自己的指向後備檔案的檔案描述符。 但是,只要 struct filebacking_id 關聯(或者隨後,與處於直通模式的開啟的 FUSE 檔案關聯),核心仍將透過 struct fuse_backing 物件保持對 struct file 的引用。

對於非特權 FUSE 守護程序,此行為會導致兩個主要問題:

  1. 對 lsof 和其他檢查工具不可見:一旦 FUSE 守護程式關閉其檔案描述符,核心保留的已開啟後備檔案將變為“隱藏”。 諸如 lsof 之類的標準工具(通常檢查程序檔案描述符表)將無法識別系統代表 FUSE 檔案系統仍開啟該檔案。 這使得系統管理員難以跟蹤資源使用情況或除錯與開啟的檔案相關的問題(例如,防止解除安裝)。

  2. 繞過 RLIMIT_NOFILE:FUSE 守護程式程序受到資源限制,包括開啟的檔案描述符的最大數量 (RLIMIT_NOFILE)。 如果非特權守護程式可以註冊後備檔案,然後關閉其自己的 FD,則它可能會導致核心持有無限數量的已開啟 struct file 引用,而這些引用不會計入守護程式的 RLIMIT_NOFILE。 這可能會因耗盡系統範圍內的檔案資源而導致拒絕服務 (DoS)。

CAP_SYS_ADMIN 要求充當針對這些問題的安全措施,將此強大功能限制為可信程序。

注意io_uring 透過公開其“固定檔案”來解決此類似問題,這些檔案透過 fdinfo 可見,並在註冊使用者的 RLIMIT_NOFILE 下進行核算。

檔案系統堆疊和關閉迴圈

另一個擔憂與非特權使用者可以設定直通時建立複雜且有問題的檔案系統堆疊場景的可能性有關。 FUSE 直通檔案系統可能會使用位於以下位置的後備檔案:

  • 同一 FUSE 檔案系統上。

  • 在另一個檔案系統(如 OverlayFS)上,該檔案系統本身可能具有作為 FUSE 檔案系統的上層或下層。

這些配置可能會建立依賴迴圈,尤其是在檔案系統關閉或解除安裝序列期間,從而導致死鎖或系統不穩定。 這在概念上類似於 LOOP_SET_FD ioctl 相關的風險,它也需要 CAP_SYS_ADMIN

為了緩解這種情況,FUSE 直通已經結合了基於檔案系統堆疊深度(sb->s_stack_depthfc->max_stack_depth)的檢查。 例如,在 FUSE_INIT 握手期間,FUSE 守護程式可以協商其支援的 max_stack_depth。 透過 FUSE_DEV_IOC_BACKING_OPEN 註冊後備檔案時,核心會檢查後備檔案的檔案系統堆疊深度是否在允許的限制內。

CAP_SYS_ADMIN 要求提供了額外的安全層,確保只有特權使用者才能建立這些潛在的複雜堆疊安排。

一般安全態勢

作為一項通用原則,對於允許使用者空間指示核心基於使用者提供的檔案描述符代表其執行直接操作的新核心功能,從更高的許可權要求(如 CAP_SYS_ADMIN)開始是一種保守且常見的安全實踐。 這允許在使用和測試該功能的同時,進一步評估和解決安全影響。