正在为 FreeBSD 开发类似于 plegde 和 Reveal 的隔离机制

对于FreeBSD,提出了应用程序隔离机制的实现,让人想起OpenBSD项目开发的plegde和unveil系统调用。 plegde 中的隔离是通过禁止访问应用程序中未使用的系统调用来实现的,而 Reveal 中的隔离是通过有选择地仅开放对应用程序可以使用的单个文件路径的访问来实现的。 对于应用程序来说,形成一种系统调用和文件路径白名单,禁止所有其他调用和路径。

为 FreeBSD 开发的 plegde 和 Reveal 的类似物之间的区别在于提供了一个附加层,该层允许您隔离应用程序,而无需更改其代码或只需进行最小的更改。 回想一下,在OpenBSD中,plegde和unveil旨在与底层环境紧密集成,并通过在每个应用程序的代码中添加特殊注释来使用。 为了简化保护的组织,过滤器允许您省去各个系统调用级别的细节并操纵系统调用的类(输入/输出、读取文件、写入文件、套接字、ioctl、sysctl、进程启动等) 。 当执行某些操作时,可以在应用程序代码中调用访问限制功能,例如,在打开必要的文件并建立网络连接后可以拒绝对套接字和文件的访问。

FreeBSD 的 plegde 和 Unveil 端口的作者打算提供隔离任意应用程序的能力,为此提出了 Curtain 实用程序,它允许您将单独文件中定义的规则应用于应用程序。 建议的配置包括一个具有基本设置的文件,该文件定义了特定于某些应用程序的系统调用类和典型文件路径(使用声音、网络交互、日志记录等),以及一个具有特定应用程序的访问规则的文件。

窗帘实用程序可用于隔离大多数未修改的实用程序、服务器进程、图形应用程序,甚至整个桌面会话。 Curtain 可以与 Jail 和 Capsicum 子系统提供的隔离机制结合使用。 当启动的应用程序继承父应用程序的规则集时,还可以组织嵌套隔离,并用单独的限制对其进行补充。 某些内核操作(调试工具、POSIX/SysV IPC、PTY)还受到屏障机制的保护,该机制防止访问不是由当前进程或父进程创建的内核对象。

进程可以通过调用 Curtainctl 或使用 libcurtain 的 plegde() 和unveve() 函数来配置自己的隔离,类似于 OpenBSD 中的函数。 为了在应用程序运行时跟踪锁定,提供了 sysctl“security.curtain.log_level”。 通过在运行 curve 时指定“-X”/“-Y”和“-W”选项来单独启用对 X11 和 Wayland 协议的访问,但对图形应用程序的支持尚未足够稳定,并且存在许多未解决的问题(问题主要出现在使用X11时,Wayland支持实现得更好)。 用户可以通过创建本地规则文件(~/.curtain.conf)来添加其他限制。 例如,要仅允许从 Firfox 写入 ~/Downloads/ 目录,您可以使用规则“~/Downloads/ : rw +”添加“[firefox]”部分。

该实现包括用于强制访问控制(MAC,强制访问控制)的 mac_curtain 内核模块、一组用于 FreeBSD 内核的补丁(其中实现了必要的处理程序和过滤器)、用于在应用程序中使用 plegde 和 Reveal 函数的 libcurtain 库,窗帘实用程序、示例配置文件、用户空间中某些程序的一组测试和补丁(例如,使用 $TMPDIR 来统一与临时文件的工作)。 在可能的情况下,作者打算尽量减少需要对内核和应用程序进行补丁的更改数量。

来源: opennet.ru

添加评论