* [PATCH v2 0/2] Add a documentation for FUSE passthrough @ 2025-05-07 8:42 Chen Linxuan via B4 Relay 2025-05-07 8:42 ` [PATCH v2 1/2] MAINTAINERS: update filter of FUSE documentation Chen Linxuan via B4 Relay ` (2 more replies) 0 siblings, 3 replies; 5+ messages in thread From: Chen Linxuan via B4 Relay @ 2025-05-07 8:42 UTC (permalink / raw) To: Miklos Szeredi, Jonathan Corbet Cc: linux-kernel, linux-fsdevel, linux-doc, Chen Linxuan, Amir Goldstein, Bernd Schubert This series adds a new file, Documentation/filesystems/fuse-passthrough.rst, which documents why FUSE passthrough functionality requires CAP_SYS_ADMIN capabilities. The series also updates the MAINTAINERS file to ensure scripts/get_maintainer.pl works correctly with FUSE documentation. Signed-off-by: Chen Linxuan <chenlinxuan@uniontech.com> --- Changes in v2: - Add the docs to Documentation/filesystems/index.rst toctree as Bagas Sanjaya suggested - Remove some paragraphs as Amir Goldstein suggested - Link to v1: https://lore.kernel.org/r/20250507-fuse-passthrough-doc-v1-0-cc06af79c722@uniontech.com --- Chen Linxuan (2): MAINTAINERS: update filter of FUSE documentation docs: filesystems: add fuse-passthrough.rst Documentation/filesystems/fuse-passthrough.rst | 133 +++++++++++++++++++++++++ Documentation/filesystems/index.rst | 1 + MAINTAINERS | 2 +- 3 files changed, 135 insertions(+), 1 deletion(-) --- base-commit: 0d8d44db295ccad20052d6301ef49ff01fb8ae2d change-id: 20250507-fuse-passthrough-doc-59e1c8432a63 Best regards, -- Chen Linxuan <chenlinxuan@uniontech.com> ^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v2 1/2] MAINTAINERS: update filter of FUSE documentation 2025-05-07 8:42 [PATCH v2 0/2] Add a documentation for FUSE passthrough Chen Linxuan via B4 Relay @ 2025-05-07 8:42 ` Chen Linxuan via B4 Relay 2025-05-07 8:42 ` [PATCH v2 2/2] docs: filesystems: add fuse-passthrough.rst Chen Linxuan via B4 Relay 2025-05-12 8:10 ` [PATCH v2 0/2] Add a documentation for FUSE passthrough Miklos Szeredi 2 siblings, 0 replies; 5+ messages in thread From: Chen Linxuan via B4 Relay @ 2025-05-07 8:42 UTC (permalink / raw) To: Miklos Szeredi, Jonathan Corbet Cc: linux-kernel, linux-fsdevel, linux-doc, Chen Linxuan, Amir Goldstein From: Chen Linxuan <chenlinxuan@uniontech.com> There are some fuse-*.rst files in Documentation directory, let's make get_mantainers.pl work on those file instead of only fuse.rst. Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Chen Linxuan <chenlinxuan@uniontech.com> --- MAINTAINERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MAINTAINERS b/MAINTAINERS index 5f8688630c014d2639ed9023ba5a256bc1c28e25..08cedaa87eb3f7047ca49d0e6f946dbd8e7ad793 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -9736,7 +9736,7 @@ L: linux-fsdevel@vger.kernel.org S: Maintained W: https://github.com/libfuse/ T: git git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git -F: Documentation/filesystems/fuse.rst +F: Documentation/filesystems/fuse* F: fs/fuse/ F: include/uapi/linux/fuse.h -- 2.43.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v2 2/2] docs: filesystems: add fuse-passthrough.rst 2025-05-07 8:42 [PATCH v2 0/2] Add a documentation for FUSE passthrough Chen Linxuan via B4 Relay 2025-05-07 8:42 ` [PATCH v2 1/2] MAINTAINERS: update filter of FUSE documentation Chen Linxuan via B4 Relay @ 2025-05-07 8:42 ` Chen Linxuan via B4 Relay 2025-05-07 9:08 ` Amir Goldstein 2025-05-12 8:10 ` [PATCH v2 0/2] Add a documentation for FUSE passthrough Miklos Szeredi 2 siblings, 1 reply; 5+ messages in thread From: Chen Linxuan via B4 Relay @ 2025-05-07 8:42 UTC (permalink / raw) To: Miklos Szeredi, Jonathan Corbet Cc: linux-kernel, linux-fsdevel, linux-doc, Chen Linxuan, Amir Goldstein, Bernd Schubert From: Chen Linxuan <chenlinxuan@uniontech.com> Add a documentation about FUSE passthrough. It's mainly about why FUSE passthrough needs CAP_SYS_ADMIN. Some related discussions: Link: https://lore.kernel.org/all/4b64a41c-6167-4c02-8bae-3021270ca519@fastmail.fm/T/#mc73e04df56b8830b1d7b06b5d9f22e594fba423e Link: https://lore.kernel.org/linux-fsdevel/CAOQ4uxhAY1m7ubJ3p-A3rSufw_53WuDRMT1Zqe_OC0bP_Fb3Zw@mail.gmail.com/ Cc: Amir Goldstein <amir73il@gmail.com> Cc: Bernd Schubert <bernd.schubert@fastmail.fm> Reviewed-by: Amir Goldstein <amir73il@gmail.com> Signed-off-by: Chen Linxuan <chenlinxuan@uniontech.com> --- Documentation/filesystems/fuse-passthrough.rst | 133 +++++++++++++++++++++++++ Documentation/filesystems/index.rst | 1 + 2 files changed, 134 insertions(+) diff --git a/Documentation/filesystems/fuse-passthrough.rst b/Documentation/filesystems/fuse-passthrough.rst new file mode 100644 index 0000000000000000000000000000000000000000..2b0e7c2da54acde4d48fd91ecece27256c4e04fd --- /dev/null +++ b/Documentation/filesystems/fuse-passthrough.rst @@ -0,0 +1,133 @@ +.. SPDX-License-Identifier: GPL-2.0 + +================ +FUSE Passthrough +================ + +Introduction +============ + +FUSE (Filesystem in Userspace) passthrough is a feature designed to improve the +performance of FUSE filesystems for I/O operations. Typically, FUSE operations +involve communication between the kernel and a userspace FUSE daemon, which can +incur overhead. Passthrough allows certain operations on a FUSE file to bypass +the userspace daemon and be executed directly by the kernel on an underlying +"backing file". + +This is achieved by the FUSE daemon registering a file descriptor (pointing to +the backing file on a lower filesystem) with the FUSE kernel module. The kernel +then receives an identifier (``backing_id``) for this registered backing file. +When a FUSE file is subsequently opened, the FUSE daemon can, in its response to +the ``OPEN`` request, include this ``backing_id`` and set the +``FOPEN_PASSTHROUGH`` flag. This establishes a direct link for specific +operations. + +Currently, passthrough is supported for operations like ``read(2)``/``write(2)`` +(via ``read_iter``/``write_iter``), ``splice(2)``, and ``mmap(2)``. + +Enabling Passthrough +==================== + +To use FUSE passthrough: + + 1. The FUSE filesystem must be compiled with ``CONFIG_FUSE_PASSTHROUGH`` + enabled. + 2. The FUSE daemon, during the ``FUSE_INIT`` handshake, must negotiate the + ``FUSE_PASSTHROUGH`` capability and specify its desired + ``max_stack_depth``. + 3. The (privileged) FUSE daemon uses the ``FUSE_DEV_IOC_BACKING_OPEN`` ioctl + on its connection file descriptor (e.g., ``/dev/fuse``) to register a + backing file descriptor and obtain a ``backing_id``. + 4. When handling an ``OPEN`` or ``CREATE`` request for a FUSE file, the daemon + replies with the ``FOPEN_PASSTHROUGH`` flag set in + ``fuse_open_out::open_flags`` and provides the corresponding ``backing_id`` + in ``fuse_open_out::backing_id``. + 5. The FUSE daemon should eventually call ``FUSE_DEV_IOC_BACKING_CLOSE`` with + the ``backing_id`` to release the kernel's reference to the backing file + when it's no longer needed for passthrough setups. + +Privilege Requirements +====================== + +Setting up passthrough functionality currently requires the FUSE daemon to +possess the ``CAP_SYS_ADMIN`` capability. This requirement stems from several +security and resource management considerations that are actively being +discussed and worked on. The primary reasons for this restriction are detailed +below. + +Resource Accounting and Visibility +---------------------------------- + +The core mechanism for passthrough involves the FUSE daemon opening a file +descriptor to a backing file and registering it with the FUSE kernel module via +the ``FUSE_DEV_IOC_BACKING_OPEN`` ioctl. This ioctl returns a ``backing_id`` +associated with a kernel-internal ``struct fuse_backing`` object, which holds a +reference to the backing ``struct file``. + +A significant concern arises because the FUSE daemon can close its own file +descriptor to the backing file after registration. The kernel, however, will +still hold a reference to the ``struct file`` via the ``struct fuse_backing`` +object as long as it's associated with a ``backing_id`` (or subsequently, with +an open FUSE file in passthrough mode). + +This behavior leads to two main issues for unprivileged FUSE daemons: + + 1. **Invisibility to lsof and other inspection tools**: Once the FUSE + daemon closes its file descriptor, the open backing file held by the kernel + becomes "hidden." Standard tools like ``lsof``, which typically inspect + process file descriptor tables, would not be able to identify that this + file is still open by the system on behalf of the FUSE filesystem. This + makes it difficult for system administrators to track resource usage or + debug issues related to open files (e.g., preventing unmounts). + + 2. **Bypassing RLIMIT_NOFILE**: The FUSE daemon process is subject to + resource limits, including the maximum number of open file descriptors + (``RLIMIT_NOFILE``). If an unprivileged daemon could register backing files + and then close its own FDs, it could potentially cause the kernel to hold + an unlimited number of open ``struct file`` references without these being + accounted against the daemon's ``RLIMIT_NOFILE``. This could lead to a + denial-of-service (DoS) by exhausting system-wide file resources. + +The ``CAP_SYS_ADMIN`` requirement acts as a safeguard against these issues, +restricting this powerful capability to trusted processes. + +**NOTE**: ``io_uring`` solves this similar issue by exposing its "fixed files", +which are visible via ``fdinfo`` and accounted under the registering user's +``RLIMIT_NOFILE``. + +Filesystem Stacking and Shutdown Loops +-------------------------------------- + +Another concern relates to the potential for creating complex and problematic +filesystem stacking scenarios if unprivileged users could set up passthrough. +A FUSE passthrough filesystem might use a backing file that resides: + + * On the *same* FUSE filesystem. + * On another filesystem (like OverlayFS) which itself might have an upper or + lower layer that is a FUSE filesystem. + +These configurations could create dependency loops, particularly during +filesystem shutdown or unmount sequences, leading to deadlocks or system +instability. This is conceptually similar to the risks associated with the +``LOOP_SET_FD`` ioctl, which also requires ``CAP_SYS_ADMIN``. + +To mitigate this, FUSE passthrough already incorporates checks based on +filesystem stacking depth (``sb->s_stack_depth`` and ``fc->max_stack_depth``). +For example, during the ``FUSE_INIT`` handshake, the FUSE daemon can negotiate +the ``max_stack_depth`` it supports. When a backing file is registered via +``FUSE_DEV_IOC_BACKING_OPEN``, the kernel checks if the backing file's +filesystem stack depth is within the allowed limit. + +The ``CAP_SYS_ADMIN`` requirement provides an additional layer of security, +ensuring that only privileged users can create these potentially complex +stacking arrangements. + +General Security Posture +------------------------ + +As a general principle for new kernel features that allow userspace to instruct +the kernel to perform direct operations on its behalf based on user-provided +file descriptors, starting with a higher privilege requirement (like +``CAP_SYS_ADMIN``) is a conservative and common security practice. This allows +the feature to be used and tested while further security implications are +evaluated and addressed. diff --git a/Documentation/filesystems/index.rst b/Documentation/filesystems/index.rst index a9cf8e950b15ad68a021d5f214b07f58d752f4e3..2913f4f2e00ccc466563aba5692e2f95699cb674 100644 --- a/Documentation/filesystems/index.rst +++ b/Documentation/filesystems/index.rst @@ -99,6 +99,7 @@ Documentation for filesystem implementations. fuse fuse-io fuse-io-uring + fuse-passthrough inotify isofs nilfs2 -- 2.43.0 ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2 2/2] docs: filesystems: add fuse-passthrough.rst 2025-05-07 8:42 ` [PATCH v2 2/2] docs: filesystems: add fuse-passthrough.rst Chen Linxuan via B4 Relay @ 2025-05-07 9:08 ` Amir Goldstein 0 siblings, 0 replies; 5+ messages in thread From: Amir Goldstein @ 2025-05-07 9:08 UTC (permalink / raw) To: chenlinxuan Cc: Miklos Szeredi, Jonathan Corbet, linux-kernel, linux-fsdevel, linux-doc, Bernd Schubert On Wed, May 7, 2025 at 10:42 AM Chen Linxuan via B4 Relay <devnull+chenlinxuan.uniontech.com@kernel.org> wrote: > > From: Chen Linxuan <chenlinxuan@uniontech.com> > > Add a documentation about FUSE passthrough. > > It's mainly about why FUSE passthrough needs CAP_SYS_ADMIN. > > Some related discussions: > > Link: https://lore.kernel.org/all/4b64a41c-6167-4c02-8bae-3021270ca519@fastmail.fm/T/#mc73e04df56b8830b1d7b06b5d9f22e594fba423e > Link: https://lore.kernel.org/linux-fsdevel/CAOQ4uxhAY1m7ubJ3p-A3rSufw_53WuDRMT1Zqe_OC0bP_Fb3Zw@mail.gmail.com/ > For future reference, those links are usually part of the tail part (without newline) but don't worry about it - this can be fixed when applying the patch. Thanks, Amir. > Cc: Amir Goldstein <amir73il@gmail.com> > Cc: Bernd Schubert <bernd.schubert@fastmail.fm> > Reviewed-by: Amir Goldstein <amir73il@gmail.com> > Signed-off-by: Chen Linxuan <chenlinxuan@uniontech.com> > --- > Documentation/filesystems/fuse-passthrough.rst | 133 +++++++++++++++++++++++++ > Documentation/filesystems/index.rst | 1 + > 2 files changed, 134 insertions(+) > > diff --git a/Documentation/filesystems/fuse-passthrough.rst b/Documentation/filesystems/fuse-passthrough.rst > new file mode 100644 > index 0000000000000000000000000000000000000000..2b0e7c2da54acde4d48fd91ecece27256c4e04fd > --- /dev/null > +++ b/Documentation/filesystems/fuse-passthrough.rst > @@ -0,0 +1,133 @@ > +.. SPDX-License-Identifier: GPL-2.0 > + > +================ > +FUSE Passthrough > +================ > + > +Introduction > +============ > + > +FUSE (Filesystem in Userspace) passthrough is a feature designed to improve the > +performance of FUSE filesystems for I/O operations. Typically, FUSE operations > +involve communication between the kernel and a userspace FUSE daemon, which can > +incur overhead. Passthrough allows certain operations on a FUSE file to bypass > +the userspace daemon and be executed directly by the kernel on an underlying > +"backing file". > + > +This is achieved by the FUSE daemon registering a file descriptor (pointing to > +the backing file on a lower filesystem) with the FUSE kernel module. The kernel > +then receives an identifier (``backing_id``) for this registered backing file. > +When a FUSE file is subsequently opened, the FUSE daemon can, in its response to > +the ``OPEN`` request, include this ``backing_id`` and set the > +``FOPEN_PASSTHROUGH`` flag. This establishes a direct link for specific > +operations. > + > +Currently, passthrough is supported for operations like ``read(2)``/``write(2)`` > +(via ``read_iter``/``write_iter``), ``splice(2)``, and ``mmap(2)``. > + > +Enabling Passthrough > +==================== > + > +To use FUSE passthrough: > + > + 1. The FUSE filesystem must be compiled with ``CONFIG_FUSE_PASSTHROUGH`` > + enabled. > + 2. The FUSE daemon, during the ``FUSE_INIT`` handshake, must negotiate the > + ``FUSE_PASSTHROUGH`` capability and specify its desired > + ``max_stack_depth``. > + 3. The (privileged) FUSE daemon uses the ``FUSE_DEV_IOC_BACKING_OPEN`` ioctl > + on its connection file descriptor (e.g., ``/dev/fuse``) to register a > + backing file descriptor and obtain a ``backing_id``. > + 4. When handling an ``OPEN`` or ``CREATE`` request for a FUSE file, the daemon > + replies with the ``FOPEN_PASSTHROUGH`` flag set in > + ``fuse_open_out::open_flags`` and provides the corresponding ``backing_id`` > + in ``fuse_open_out::backing_id``. > + 5. The FUSE daemon should eventually call ``FUSE_DEV_IOC_BACKING_CLOSE`` with > + the ``backing_id`` to release the kernel's reference to the backing file > + when it's no longer needed for passthrough setups. > + > +Privilege Requirements > +====================== > + > +Setting up passthrough functionality currently requires the FUSE daemon to > +possess the ``CAP_SYS_ADMIN`` capability. This requirement stems from several > +security and resource management considerations that are actively being > +discussed and worked on. The primary reasons for this restriction are detailed > +below. > + > +Resource Accounting and Visibility > +---------------------------------- > + > +The core mechanism for passthrough involves the FUSE daemon opening a file > +descriptor to a backing file and registering it with the FUSE kernel module via > +the ``FUSE_DEV_IOC_BACKING_OPEN`` ioctl. This ioctl returns a ``backing_id`` > +associated with a kernel-internal ``struct fuse_backing`` object, which holds a > +reference to the backing ``struct file``. > + > +A significant concern arises because the FUSE daemon can close its own file > +descriptor to the backing file after registration. The kernel, however, will > +still hold a reference to the ``struct file`` via the ``struct fuse_backing`` > +object as long as it's associated with a ``backing_id`` (or subsequently, with > +an open FUSE file in passthrough mode). > + > +This behavior leads to two main issues for unprivileged FUSE daemons: > + > + 1. **Invisibility to lsof and other inspection tools**: Once the FUSE > + daemon closes its file descriptor, the open backing file held by the kernel > + becomes "hidden." Standard tools like ``lsof``, which typically inspect > + process file descriptor tables, would not be able to identify that this > + file is still open by the system on behalf of the FUSE filesystem. This > + makes it difficult for system administrators to track resource usage or > + debug issues related to open files (e.g., preventing unmounts). > + > + 2. **Bypassing RLIMIT_NOFILE**: The FUSE daemon process is subject to > + resource limits, including the maximum number of open file descriptors > + (``RLIMIT_NOFILE``). If an unprivileged daemon could register backing files > + and then close its own FDs, it could potentially cause the kernel to hold > + an unlimited number of open ``struct file`` references without these being > + accounted against the daemon's ``RLIMIT_NOFILE``. This could lead to a > + denial-of-service (DoS) by exhausting system-wide file resources. > + > +The ``CAP_SYS_ADMIN`` requirement acts as a safeguard against these issues, > +restricting this powerful capability to trusted processes. > + > +**NOTE**: ``io_uring`` solves this similar issue by exposing its "fixed files", > +which are visible via ``fdinfo`` and accounted under the registering user's > +``RLIMIT_NOFILE``. > + > +Filesystem Stacking and Shutdown Loops > +-------------------------------------- > + > +Another concern relates to the potential for creating complex and problematic > +filesystem stacking scenarios if unprivileged users could set up passthrough. > +A FUSE passthrough filesystem might use a backing file that resides: > + > + * On the *same* FUSE filesystem. > + * On another filesystem (like OverlayFS) which itself might have an upper or > + lower layer that is a FUSE filesystem. > + > +These configurations could create dependency loops, particularly during > +filesystem shutdown or unmount sequences, leading to deadlocks or system > +instability. This is conceptually similar to the risks associated with the > +``LOOP_SET_FD`` ioctl, which also requires ``CAP_SYS_ADMIN``. > + > +To mitigate this, FUSE passthrough already incorporates checks based on > +filesystem stacking depth (``sb->s_stack_depth`` and ``fc->max_stack_depth``). > +For example, during the ``FUSE_INIT`` handshake, the FUSE daemon can negotiate > +the ``max_stack_depth`` it supports. When a backing file is registered via > +``FUSE_DEV_IOC_BACKING_OPEN``, the kernel checks if the backing file's > +filesystem stack depth is within the allowed limit. > + > +The ``CAP_SYS_ADMIN`` requirement provides an additional layer of security, > +ensuring that only privileged users can create these potentially complex > +stacking arrangements. > + > +General Security Posture > +------------------------ > + > +As a general principle for new kernel features that allow userspace to instruct > +the kernel to perform direct operations on its behalf based on user-provided > +file descriptors, starting with a higher privilege requirement (like > +``CAP_SYS_ADMIN``) is a conservative and common security practice. This allows > +the feature to be used and tested while further security implications are > +evaluated and addressed. > diff --git a/Documentation/filesystems/index.rst b/Documentation/filesystems/index.rst > index a9cf8e950b15ad68a021d5f214b07f58d752f4e3..2913f4f2e00ccc466563aba5692e2f95699cb674 100644 > --- a/Documentation/filesystems/index.rst > +++ b/Documentation/filesystems/index.rst > @@ -99,6 +99,7 @@ Documentation for filesystem implementations. > fuse > fuse-io > fuse-io-uring > + fuse-passthrough > inotify > isofs > nilfs2 > > -- > 2.43.0 > > ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2 0/2] Add a documentation for FUSE passthrough 2025-05-07 8:42 [PATCH v2 0/2] Add a documentation for FUSE passthrough Chen Linxuan via B4 Relay 2025-05-07 8:42 ` [PATCH v2 1/2] MAINTAINERS: update filter of FUSE documentation Chen Linxuan via B4 Relay 2025-05-07 8:42 ` [PATCH v2 2/2] docs: filesystems: add fuse-passthrough.rst Chen Linxuan via B4 Relay @ 2025-05-12 8:10 ` Miklos Szeredi 2 siblings, 0 replies; 5+ messages in thread From: Miklos Szeredi @ 2025-05-12 8:10 UTC (permalink / raw) To: chenlinxuan Cc: Jonathan Corbet, linux-kernel, linux-fsdevel, linux-doc, Amir Goldstein, Bernd Schubert On Wed, 7 May 2025 at 10:42, Chen Linxuan via B4 Relay <devnull+chenlinxuan.uniontech.com@kernel.org> wrote: > > This series adds a new file, > Documentation/filesystems/fuse-passthrough.rst, which documents why > FUSE passthrough functionality requires CAP_SYS_ADMIN capabilities. > > The series also updates the MAINTAINERS file to ensure > scripts/get_maintainer.pl works correctly with FUSE documentation. > > Signed-off-by: Chen Linxuan <chenlinxuan@uniontech.com> Applied, thanks. Miklos ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2025-05-12 8:10 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-05-07 8:42 [PATCH v2 0/2] Add a documentation for FUSE passthrough Chen Linxuan via B4 Relay 2025-05-07 8:42 ` [PATCH v2 1/2] MAINTAINERS: update filter of FUSE documentation Chen Linxuan via B4 Relay 2025-05-07 8:42 ` [PATCH v2 2/2] docs: filesystems: add fuse-passthrough.rst Chen Linxuan via B4 Relay 2025-05-07 9:08 ` Amir Goldstein 2025-05-12 8:10 ` [PATCH v2 0/2] Add a documentation for FUSE passthrough Miklos Szeredi
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).