2 个版本

0.3.1 2019年10月20日
0.3.0 2019年3月17日

#653 in Unix APIs


用于 syswall_cli

LGPL-3.0-only

69KB
1.5K SLoC

syswall

一个用于 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