什么是沙盒?

信息安全 攻击预防 沙盒
2021-08-23 15:07:29

在安全讨论中,经常会出现沙盒的话题。什么是应用程序沙盒?它是如何工作的,它可以防止哪些安全漏洞?

3个回答

“沙盒”是幼儿的游乐区:它应该对他们来说是安全的(他们不会伤害自己)并且对他们来说是安全(它是沙子,他们不能打破它)。在 IT 安全的背景下,“沙盒”意味着以这样一种方式隔离某些软件,即无论它做什么,它都不会在其他地方造成严重破坏。

一种常见的 Unix 沙盒方式是chroot命令(使用chroot()系统调用)。使用此命令启动的进程只能看到一个子目录(它所看到的文件系统的根目录'/',即该子目录)。FreeBSD 系统有一个增强版更现代和更彻底的解决方案使用虚拟机(如在VMWare中)。这种沙盒是为了遏制损害:你把一个给定的进程放在监狱里,因为如果它被黑客入侵,比如缓冲区溢出,攻击者仍然在监狱里,将无法影响其他运行的应用程序同一个系统。

另一种沙盒是 Java 或 C#(混淆地也称为“虚拟机”)等编程语言的核心:应用程序代码在虚拟 CPU 上运行,其中检查每个操作码是否违规(缓冲区溢出和下溢,类型不匹配......)。语言和 VM 的结构已经过设计,因此这些检查不会太昂贵。同样,这是损害遏制,但粒度更细。

沙盒不会消除漏洞;它只是减少了这些漏洞的后果(例如,将远程外壳转换为远程崩溃)。缓冲区溢出是一个错误,无论 VM 是否捕获它。

好的,首先,应用程序如何运行?

在您现在可能正在使用的那种标准操作系统上,应用程序是由用户启动的。当应用程序启动时,它会被加载到内存中并有时间在 cpu 上运行。

为了完成任务,应用程序不是直接控制计算机硬件,而是向操作系统发出请求。开发人员调用这些系统调用或 API 调用。本质上,程序所做的一切要么是对其自身内存的操作,要么是执行其他操作的系统调用。

现在,显然,我们不能只加载应用程序并让它们做任何事情,否则用户可以做任何事情。因此,您现在使用的操作系统具有权限的概念。当进行系统调用时,操作系统会查看应用程序上下文——谁在运行它?- 以及相关资源的权限。我说资源而不是文件,因为它regedt32可以让您设置注册表项的权限,并且只有 root 可以在 Linux 上打开端口 1024 以下的套接字。

那么应用程序能做什么呢?你可以做的任何事情。显然,这对于说 Windows 资源管理器来说是可以的,但是假设您下载了另一个程序,例如 pdf 到声音转换器(只是一个随机建议)。您不确定您是否信任实现它的开发人员“Ninefingerz-so-l33t-man”,但如果您运行它,它就可以访问您所做的一切。

应用程序沙盒是为了在某种程度上防止这种情况。沙盒SELinux 沙盒之类的工具挂钩这些操作系统调用,并在更细粒度的级别控制该程序可以执行的操作。例如,您可能允许程序在下面编辑任何内容,C:\Users\Ninefingers\temporaryisolateddata但其他任何地方都是只读的。您可能会阻止它在套接字上建立出站连接,或者根本无法读取注册表。

当然,这不是实现沙箱的唯一方法(挂钩内核)。谷歌浏览器在 Windows 上的沙箱完全由程序实现——谷歌浏览器主进程控制子进程可以访问的内容,简而言之。此沙盒通过利用 Windows 中现有的安全控制来工作,仅当子进程想要采取通常通过系统调用实现的操作时,才允许子进程与目标进程进行通信。这样,目标进程对请求进行过滤。

应用程序沙盒的核心是附加限制,以防止潜在的恶意进程损害您的系统。它是对现有权限模型的扩展。

请注意,强制访问控制是某些操作系统中可用的一项功能,如果实施得当,应该根据用户是谁和进程是什么来沙箱化所有内容。

沙盒是一种信息流控制机制。通过在沙箱中运行一些代码,您可以获得对程序输入和输出的额外控制。这意味着您可以拒绝/调解对外部数据或其他资源的访问,以防沙盒程序遭到破坏或本身是恶意的。

通常,沙箱中包含复杂的执行环境,例如基于 JVM 的沙箱中的 Java 和 Java 库。或者,您可以在专用 VM 中运行应用程序,使其成为您的沙箱,并使用完整的旧操作系统作为执行环境。

据我所知,用于 x86 执行的最先进的沙盒技术在 Google 的 Java Native Client 中有所描述:http ://research.google.com/pubs/pub34913.html

信息流控制的概念对于安全设计至关重要。linux 中关于权限和 MAC 的全部内容都是关于信息流控制的。因此,DJB 在他的论文“关于 qmail 1.0 十年后的安全性的一些想法”中指出,信息流和接口是实质性的,“最小特权”只不过是一种干扰。然而,他没有使用完整的 JVM 等显式沙箱,而是使用标准操作系统功能将 qmail 拆分为几个具有显式、定义良好接口的小程序。事实上,沙盒的设计只不过是对操作系统(应该)给你的东西进行复制/微调/改进。