计划将质押隔离机制移植到Linux

最近, Cosmopolitan C 标准库和 Redbean 平台的作者宣布在 Linux 上实现 poll() 隔离机制。

Pledge 最初由 OpenBSD 项目开发,它允许您选择性地禁止应用程序访问未使用的系统调用(为应用程序创建一个系统调用白名单,并禁止其他调用)。与 Linux 中可用的系统调用访问控制机制(例如 seccomp)不同,Pledge 从一开始就被设计得尽可能用户友好。

使用 systrace 机制在 OpenBSD 基础环境中隔离应用程序的失败举措表明,在单个系统调用级别的隔离过于复杂和耗时。

或者,可以采用 promise,它允许创建隔离规则,而无需详细说明和操作已准备好的访问类。

例如,提供的类有 stdio(输入/输出)、rpath(只读文件)、wpath(写入文件)、cpath(创建文件)、tmppath(处理临时文件)、inet(套接字网络)、unix(unix 套接字)、dns(DNS 解析)、getpw(对用户数据库的读取访问权限)、ioctl(ioctl 调用)、proc(进程控制)、exec(启动进程)和 id(权限控制)。

系统调用的使用规则以注解的形式指定,其中包括允许的系统调用类列表和允许访问的文件路径数组。编译并运行修改后的应用程序后,内核将接管监控是否遵守这些规则的任务。

另外,FreeBSD 的质押实现正在开发中,其特点是能够在不更改代码的情况下隔离应用程序,而在 OpenBSD 中质押调用旨在与基础环境紧密集成并在代码中添加注释每一个。

当老板说我们应该使用像Linux这样的东西时,承诺就像我们都渴望的禁果。 为什么这很重要? 这是因为承诺()实际上使安全性可以理解。 Linux 从来没有真正拥有普通人可以理解的安全层。

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 程序代码中的权限限制,从而允许创建 enclave 以选择性地限制对特定应用程序功能的访问。

过去已经有一些开发人员尝试过这个。 我不会点名,因为这些项目中的大多数都没有完成。 说到 SECOMP,在线教程只解释了如何将系统调用列入白名单,因此大多数人在弄清楚如何过滤参数之前就失去了兴趣。 向前推进的项目也有一些疏忽,比如允许更改 setuid/setgid/sticky 位。 因此,不应使用任何当前的替代方案。 我认为这种努力使我们比以往任何时候都更接近拥有承诺()。

实现不需要内核更改:实用程序约束被转换为 SECCOMP BPF 规则并使用 Linux 的本机系统调用隔离机制进行处理。 例如,调用 promise("stdio rpath", 0) 将转换为 BPF 过滤器

最后,如果您有兴趣了解更多信息,可以点击以下链接查看详情。


在 Google 中将其添加为首选来源