Sandbox2 设计基于成熟可靠的技术、政策框架和两个进程:沙盒执行器和沙盒化进程。
涉及的技术
以下部分介绍了为 Sandbox2 构建基础层的技术。
Linux 命名空间
Linux 命名空间旨在提供操作系统级虚拟化。虽然多个用户空间看似彼此独立运行,但它们共享一个内核实例。Sandbox2 使用以下类型的命名空间:
- IPC
- 网络(除非通过调用
PolicyBuilder::AllowUnrestrictedNetworking()
显式停用) - 装载(使用文件系统树的自定义视图)
- PID
- 用户
- UTS
如需详细了解 Linux 命名空间,请参阅 Wikipedia 或相关的手册页。
IPC
Sandbox2 允许在沙盒执行器和不受信任的沙盒进程之间交换任意数据。它支持类型-长度-值 (TLV) 消息、传递文件描述符,以及通过令牌和句柄进行凭据交换。
Seccomp-BPF
Sandbox2 依赖于 seccomp-bpf,它是安全计算模式 (seccomp) 的扩展,允许使用伯克利封包过滤器 (BPF) 规则来过滤系统调用。
seccomp 是一种 Linux 内核设施,可限制进程的系统调用,仅允许 exit
、sigreturn
、read
和 write
。如果进程尝试执行其他系统调用,则会被终止。与 seccomp 相比,seccomp-bpf 扩展程序可提供更高的灵活性。seccomp-bpf 不允许使用固定的系统调用集,而是对系统调用数据运行 BPF 程序,并根据程序的返回值来执行系统调用、跳过系统调用并返回虚拟值、终止进程、生成信号或通知跟踪器。
Ptrace
ptrace(进程跟踪)系统调用提供了一种功能,使跟踪器进程能够观察和控制被跟踪进程的执行。一旦附加,跟踪器进程就对被跟踪进程拥有完全控制权。如需详细了解 ptrace,请参阅 Wikipedia 或相关的手册页面。
沙盒政策
沙盒政策是沙盒最关键的部分,因为它规定了 Sandboxee 可以执行和不能执行的操作。沙盒政策包含 2 个部分:
- 系统调用政策
- 命名空间设置
默认系统调用政策
默认政策会屏蔽始终危险的系统调用,并且优先于用户提供的扩展政策。
扩展的系统调用政策
可以使用我们的 PolicyBuilder 类创建扩展的系统调用政策。此类定义了许多便捷规则(例如 AllowStaticStartup
、AllowDynamicStartup
、AllowOpen
),可用于提高政策的可读性。
如果您想进一步限制系统调用或需要更复杂的规则,可以使用 AddPolicyOnSyscall
和 AddPolicyOnSyscalls
指定原始 BPF 宏。crc4 示例利用此机制来限制 read
、write
和 close
系统调用的实参。
一般来说,沙盒政策越严格越好,因为代码中存在的任何漏洞的利用都会受到政策的限制。如果您能够准确指定程序正常运行所需的系统调用和实参,那么任何利用代码执行漏洞的攻击者也会受到相同的限制。
非常严格的沙盒政策可能会拒绝除标准输入和输出文件描述符上的读取和写入之外的所有系统调用。在此沙盒中,程序可以接收输入、处理输入并返回输出。不过,如果该进程尝试执行任何其他系统调用,则会因违反政策而被终止。因此,如果进程遭到入侵(恶意用户执行代码),它最多只能生成错误输出(执行程序和其他进程仍需要正确处理)。
命名空间设置
PolicyBuilder 对象还用于设置 Sandboxee 的文件系统单独视图。单个文件(AddFile
/ AddFileAt
)、整个目录(AddDirectory
/ AddDirectoryAt
)以及临时存储空间 (AddTmpfs
) 都可以映射到 Sandboxee 的环境中。此外,AddLibrariesForBinary
可用于自动映射指定动态链接的可执行文件所需的所有库。
命令行标志
您可以通过指定以下任一命令行标志来停用任何 Sandbox2 政策。这些标志仅用于测试目的(例如,在优化扩展系统调用政策时)。
--sandbox2_danger_danger_permit_all
--sandbox2_danger_danger_permit_all_and_log
沙盒执行器
沙盒执行器本身不是沙盒进程。它是附加到 Sandboxee(ptrace tracee 进程)的 ptrace 跟踪器进程。Sandbox 执行器还会设置并运行一个 Monitor 实例,该实例会跟踪 Sandboxee 并提供状态信息。
Sandbox2 允许三种执行模式:独立、Sandbox2 Forkserver 和自定义 Forkserver。如果您使用 forkserver,则 Sandboxee 会创建为沙盒执行器的子进程。您可以点击此处详细了解这些模式。
Sandboxee
Sandboxee 是在受限的沙盒环境中运行的进程,该环境由沙盒政策定义。沙盒执行器通过 IPC 将政策发送到沙盒执行对象。然后,Sandboxee 会应用该政策。除非另有配置(请参阅沙盒政策),否则任何违反该政策的行为都会导致进程终止。