沙盒 2 说明

Sandbox2 设计基于知名技术、政策框架和两个流程:沙盒执行器和 Sandboxee。

涉及的技术

下面几部分介绍了用于为 Sandbox2 构建基础层的技术。

Linux 命名空间

Linux 命名空间旨在提供操作系统级虚拟化。虽然多个用户空间似乎彼此独立运行,但它们共享一个内核实例。Sandbox2 使用以下类型的命名空间:

  • IPC
  • 网络(除非通过调用 PolicyBuilder::AllowUnrestrictedNetworking() 明确停用)
  • 装载(使用文件系统树的自定义视图)
  • PID
  • 用户(除非通过调用 PolicyBuilder::AllowUnsafeKeepCapabilities() 明确停用)
  • UTS

如需详细了解 Linux 命名空间,请参阅维基百科或相关的手册页面。

IPC

Sandbox2 允许在沙盒执行器与不可信的 Sandboxee 之间交换任意数据。它支持“类型-长度-值”(TLV) 消息、传递文件描述符,以及通过令牌和句柄进行凭据交换。

Seccomp-BPF

Sandbox2 依赖于 seccomp-bpf,seccomp-bpf 是安全计算模式 (seccomp) 的扩展,它允许使用柏克莱封包过滤器 (BPF) 规则来过滤系统调用。

seccomp 是一种 Linux 内核设施,它将进程的系统调用限制为仅允许 exitsigreturnreadwrite。如果某个进程尝试执行另一个系统调用,该进程将会终止。seccomp-bpf 扩展程序比 seccomp 具有更高的灵活性。seccomp-bpf 会在系统调用数据上运行 BPF 程序,而不是允许一组固定的系统调用,并且根据程序的返回值,它可以执行系统调用、跳过系统调用并返回虚拟值、终止进程、生成信号或通知跟踪器。

Ptrace

ptrace(进程跟踪)系统调用提供了可让跟踪程序进程观察和控制跟踪进程执行的功能。跟踪器进程可在附加跟踪记录后完全控制跟踪记录。如需详细了解 ptrace,请参阅维基百科或相关的手册页面。

沙盒政策

沙盒政策是沙盒机制中最为重要的部分,因为它指定了沙盒用户能够执行以及无法执行的操作。沙盒政策包含两部分:

  • Syscall 政策
  • 命名空间设置

默认系统调用政策

默认政策会屏蔽总是危险的系统调用,其优先级高于用户提供的扩展政策。

扩展系统调用政策

您可以使用我们的 PolicyBuilder 类创建扩展系统调用政策。此类定义了一些便捷规则(例如 AllowStaticStartupAllowDynamicStartupAllowOpen),这些规则可用于提高政策的可读性。

如果您想进一步限制系统调用或需要更复杂的规则,可以使用 AddPolicyOnSyscallAddPolicyOnSyscalls 指定原始 BPF 宏。crc4 示例利用此机制来限制 readwriteclose 系统调用的参数。

一般来说,沙盒政策越严格越好,因为政策可能会限制利用代码内存在的任何漏洞的利用。如果您能够明确指定程序正常操作所需的系统调用和参数,那么利用代码执行漏洞的任何攻击者也受到相同的限制。

非常严格的沙盒政策可以拒绝所有系统调用,但对标准输入和输出文件描述符的读取和写入除外。在此沙盒内,程序可以接受输入、处理输入并返回输出。但是,如果该进程尝试进行任何其他系统调用,则会由于违反政策而终止该进程。因此,如果进程被破解(恶意用户执行代码),它不会做比生成错误输出(执行程序和其他需要正确处理)更糟糕的事情。

命名空间设置

PolicyBuilder 对象还可用于设置 Sandboxee 的文件系统个人视图。单个文件 (AddFile / AddFileAt)、整个目录 (AddDirectory / AddDirectoryAt) 以及临时存储空间 (AddTmpfs) 可以映射到 Sandboxee 的环境中。此外,AddLibrariesForBinary 还可用于自动映射指定的动态链接可执行文件所需的所有库。

命令行标记

通过指定以下命令行标志之一,可以停用任何 Sandbox2 政策。这些标记用于测试目的(例如,在优化扩展系统调用策略时)。

  • --sandbox2_danger_danger_permit_all
  • --sandbox2_danger_danger_permit_all_and_log

沙盒执行器

沙盒执行器是一个未经过沙盒化的进程。它是附加到 Sandboxee 的 ptrace 跟踪程序进程(ptrace 跟踪进程)。沙盒执行器还会设置并运行一个 Monitor 实例,该实例用于跟踪 Sandboxee 并提供状态信息。

Sandbox2 支持三种执行模式:独立、Sandbox2 Forkserver 和自定义 Forkserver。如果您使用 forkserver,系统会将 Sandboxee 作为 Sandbox Executor 的子进程创建。下文详细介绍了这些模式。

沙盒模式

Sandboxee 是在由沙盒政策定义的受限沙盒化环境中运行的进程。Sandbox Executor 通过 IPC 将政策发送给 Sandboxee。然后,Sandboxee 会应用此政策。除非另有配置,否则任何违反此政策的行为都将终止该流程(请参阅沙盒政策)。