2 个版本
0.3.1 | 2019年10月20日 |
---|---|
0.3.0 | 2019年3月17日 |
#653 in Unix APIs
用于 syswall_cli
69KB
1.5K SLoC
一个用于 Linux 系统调用的正在开发中的防火墙,使用 Rust 编写。
简介
syswall
与 *nix 的 strace
工具功能相似,但对于每个系统调用,程序都会阻塞子进程的执行,并询问用户是否允许该系统调用。因此,syswall
可以作为进程和操作系统内核之间的安全屏障。
syswall
还会收集处理过的系统调用的统计数据,并在子进程执行完成后生成报告。
有关 syswall
的更多信息,包括计划内容和原因,请参阅我网站上这篇博客文章:syswall:系统调用的防火墙
结构
此存储库分为一个 Cargo 工作空间,分为两个独立的项目:-
lib
:主要的syswall
库,包含主要功能,可以作为 Cargo crate 用于其他应用程序。cli
:一个简单的 CLI,用于访问syswall
库,允许单个程序以类似strace
工具的方式追踪,但具有额外的syswall
功能。
以这种方式拆分项目是为了更容易地集成其他接口。例如,可以为 syswall
库编写图形、基于 Web 或脚本界面,以便在除了命令行之外的环境中使用。
安装
如果您只想使用命令行界面(CLI),最简单的安装方法是使用以下命令:cargo install
。
cargo install syswall_cli
这将下载最新版本的 syswall_cli
及其所有依赖项,构建它们并将其安装到您的本地 Cargo 二进制目录。只要这个目录在您的路径中,您现在就可以简单地通过命令行运行 syswall_cli
。
此方法需要您已安装 Rust 工具链。如果您还没有这样做,请按照这些官方说明进行操作。
当前进度
syswall
是一个非常早期的原型,因此目前只实现了计划功能的一小部分。
系统调用的处理当然非常依赖于平台。 syswall
将库功能与处理特定系统调用的实际代码分开,这意味着支持其他平台应该相对容易集成。然而,到目前为止,只支持 Linux x86_64 平台。
从 Linux x86_64 平台来看,目前只积极处理了相对少量的系统调用。目前这包括文件 I/O 和一些套接字系统调用。
strace
可以使用 -vv 开关运行 syswall CLI,这将显示所有系统调用和结果。这提供了类似于 strace
工具的功能,但尚未提供系统调用参数的解释。
交互式执行
对于支持的系统调用, syswall
允许用户执行以下操作:
- 允许系统调用一次
- 始终允许该特定系统调用
- 阻止系统调用一次(硬或软)
- 始终阻止该特定系统调用(硬或软)
在阻止时,程序可以执行“硬”或“软”阻止。硬阻止防止系统调用执行,并向子进程返回权限被拒绝错误。另一方面,软阻止阻止系统调用,但尝试向子进程返回一个合适的响应,以假装系统调用实际上已执行。
保存和加载进程配置
执行期间所做的选择可以保存到 JSON 文件中。然后可以在另一执行期间加载此文件,以便使用以前的选择。
这是一个正在进行中的工作:只保存始终允许/阻止的答案。
报告
当子进程终止时, syswall
将输出关于子进程系统调用的简要报告。目前这包括所有打开或阻止的文件和套接字,但将在未来的版本中进一步扩展。
未来计划
该项目有一个庞大的待办事项列表,但一些亮点包括:
- 允许更细粒度的选择,例如始终允许具有一个或多个匹配参数的特定系统调用
- 允许将子进程的状态(文件、套接字列表等)保存到文件中。这将最终允许比较程序的不同的执行。
- 添加忽略所有动态 .so 加载的选项。
- 添加一组默认配置(例如,阻止所有套接字但允许文件访问)。
- 添加新的接口,例如图形、基于 Web 和脚本(Python)接口。
依赖关系
~2.4–3.5MB
~71K SLoC