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