软件沙盒是一种在无需管理权限的情况下,通过编程方式限制进程特权的实践。虽然历史上该技术较为复杂且常依赖遗留技术,但现代沙盒专注于“自主权限降级”——即开发者明确限制进程行为的设计,旨在补充而非取代系统级的管理策略。沙盒面临的主要挑战在于,传统的操作系统接口(如标准的 UNIX 文件系统权限)往往无法满足现代应用的需求,例如在 Web 浏览器中隔离第三方插件。开发者过去常求助于“suid”二进制文件或内核级黑客手段来实施限制,但这些方法往往会增加内核攻击面或引入安全漏洞。例如,滥用 Linux 用户命名空间进行通用沙盒化已导致严重的安全隐患,因为它可能无意中暴露了仅供超级用户使用的内核代码路径。当前的最佳实践不再依赖此类广泛的机制,而是倾向于进程级的组件化。通过将应用的每个组件视为独立进程,开发者可以为每个组件分配特定权限,并通过消息传递管理通信。这种方法与 Actor 模型一致,即进程作为独立实体运行,不共享内存,并通过定义的接口(如 UNIX 域套接字)进行通信。该模型允许安全地交换文件描述符,从而在不授予沙盒进程完全系统访问权限的情况下,实现对文件、管道和共享内存等资源的细粒度控制。虽然 FreeBSD 等平台为此提供了 Capsicum 等专用机制,OpenBSD 也提供了 pledge(2) 和 unveil(2) 等简化工具,但其核心原则始终如一:将进程的固有权限降低到其功能所需的最低限度。

文章讨论了现代沙盒技术如何旨在将进程的固有权限降低到其功能所需的最低限度,并将其与传统的系统级权限进行了对比。

文中解释了传统文件系统权限往往不足以满足现代需求(如隔离第三方插件),并展示了组件化如何能够实施更严格的控制。