libfuse/libfuse

GitHub: libfuse/libfuse

Linux FUSE 接口的参考实现,让开发者能在用户空间创建自定义文件系统而无需修改内核代码。

Stars: 5990 | Forks: 1257

# libfuse ## 关于 FUSE (Filesystem in Userspace) 是一个接口,用于用户空间程序向 Linux 内核导出文件系统。FUSE 项目由两个组件组成:*fuse* 内核模块(在常规内核仓库中维护)和 *libfuse* 用户空间库(在本仓库中维护)。libfuse 提供了与 FUSE 内核模块通信的参考实现。 FUSE 文件系统通常实现为与 libfuse 链接的独立应用程序。libfuse 提供挂载文件系统、卸载文件系统、从内核读取请求以及发回响应的功能。libfuse 提供两种 API:“high-level”(高级)同步 API 和“low-level”(低级)异步 API。在这两种情况下,来自内核的传入请求都通过回调传递给主程序。使用 high-level API 时,回调可以处理文件名和路径而不是 inode,并且当回调函数返回时,请求的处理即告完成。使用 low-level API 时,回调必须处理 inode,并且必须使用单独的一组 API 函数显式发送响应。 ## 开发状态 libfuse 由所有主要的 Linux 发行版发布,并已在各种系统中投入生产使用多年。然而,目前 libfuse 没有任何活跃的定期贡献者。现任维护者继续合并 pull request 并定期发布版本,但遗憾的是没有能力进行任何超出解决高影响问题之外的开发。报告错误时,请理解除非您包含 pull request 或报告严重问题,否则可能不会收到回复。如果您正在使用 libfuse,请考虑为项目做出贡献。 ## 支持的平台 * Linux(完全支持) * BSD(大部分支持/尽力而为) * 对于 macOS,请使用 [macFUSE](https://macfuse.github.io) ## 安装 您可以从 https://github.com/libfuse/libfuse/releases 下载 libfuse。要构建和安装,您必须使用 [Meson](http://mesonbuild.com/) 和 [Ninja](https://ninja-build.org)。下载 tarball 和 `.sig` 文件后,使用 [signify](https://www.openbsd.org/papers/bsdcan-signify.html) 对其进行验证: ``` signify -V -m fuse-X.Y.Z.tar.gz -p fuse-X.Y.pub ``` `fuse-X.Y.pub` 文件包含签名密钥,需要从可信来源获取。每个 libfuse 版本都在 `signify` 目录中包含其后继版本的签名密钥,因此您只需要在首次安装 libfuse 时手动获取此文件一次。 验证 tarball 后,将其解压缩,创建一个(临时)构建目录并运行 Meson: ``` $ tar xzf fuse-X.Y.Z.tar.gz; cd fuse-X.Y.Z $ mkdir build; cd build $ meson setup .. ``` 通常,默认的构建选项可以正常工作。如果您仍然想要调整它们,可以使用 *meson configure* 命令: ``` $ meson configure # list options $ meson configure -D disable-mtab=true # set an optionq $ # ensure all meson options are applied to the final build system $ meson setup --reconfigure ../ ``` 要构建、测试和安装 libfuse,请使用 Ninja: ``` $ ninja $ sudo python3 -m pytest test/ $ sudo ninja install ``` 运行测试需要 [py.test](http://www.pytest.org/) Python 模块。如果不作为 root 运行测试,只要先设置 *util/fusermount3* 为 setuid root,大部分测试也可以作为普通用户运行: ``` $ sudo chown root:root util/fusermount3 $ sudo chmod 4755 util/fusermount3 $ python3 -m pytest test/ ``` ## 安全影响 *fusermount3* 程序以 setuid root 安装。这样做是为了允许普通用户挂载自己的文件系统实现。 为了限制恶意用户以此方式造成的损害,*fusermount3* 强制执行以下限制: - 用户只能挂载在其具有写入权限的挂载点上 - 挂载点不能是属于其他用户的粘滞目录(如 /tmp 通常那样) - 没有其他用户(包括 root)可以访问挂载文件系统的内容(尽管可以通过在 */etc/fuse.conf* 中允许使用 *allow_other* 和 *allow_root* 挂载选项来放宽此限制) 如果您打算使用 *allow_other* 挂载选项,请注意 FUSE 存在一个未解决的[安全漏洞](https://github.com/libfuse/libfuse/issues/15):如果未使用 *default_permissions* 挂载选项,则只要被访问条目的 inode 存在于内核缓存中,文件系统对目录项执行的第一次权限检查的结果将被后续访问重用——即使权限此后已更改,即使后续访问是由不同的用户进行的。如果文件系统仅可供挂载用户访问(无论如何该用户都拥有对文件系统的完全访问权),这没什么影响,但当允许其他用户访问文件系统时,这就会成为一个安全问题(因为他们可以利用这一点在文件系统上执行他们实际上没有权限执行的操作)。 此错误需要在 Linux 内核中修复,自 2006 年以来已知,但遗憾的是尚未应用任何修复。如果您依赖 FUSE 文件系统的正确权限处理,唯一的解决方法是使用 `default_permissions`(目前不支持 ACL),或者完全禁用目录项属性的缓存。 ## 构建您自己的文件系统 FUSE 在 `example` 目录中附带了几个示例文件系统。例如,*passthrough* 示例将根目录的内容镜像到挂载点下。从那里开始并调整代码! API 函数和必要回调的文档主要包含在文件 `include/fuse.h`(用于 high-level API)和 `include/fuse_lowlevel.h`(用于 low-level API)中。API 的自动生成 html 版本可在 `doc/html` 目录和 http://libfuse.github.io/doxygen 中找到。 ## 获取帮助 如果您需要帮助,请在 邮件列表上提问(在 https://lists.sourceforge.net/lists/listinfo/fuse-devel 订阅)。 请在 GitHub issue 跟踪器上报告任何错误,地址为 https://github.com/libfuse/libfuse/issues。
标签:BSD, FUSE, Hpfeeds, libfuse, SOC Prime, 内核模块, 参考实现, 同步API, 存储, 安全渗透, 安全资源, 客户端加密, 开发工具, 开源库, 异步API, 挂载, 搜索引擎爬虫, 操作系统, 数据挖掘, 文件系统, 用户空间文件系统, 系统编程, 系统调用, 虚拟文件系统, 逆向工具, 预握手