攻击者模型,通过提升特权)或限制系统及其服务的可用性(例如,通过使系统崩溃或占用其资源)。在这个知识领域,我们专注于安全的技术方面,撇开内部威胁、人类行为、物理攻击、项目管理、公司政策等。不是因为它们不重要,而是因为它们不在操作系统的控制范围内并且需要它们自己的知识领域。表1列出了我们考虑的一些威胁和攻击方法。破坏系统的最简单方法是将恶意扩展注入操作系统的核心。例如,在Linux和Windows等单体系统中,这可能是恶意驱动程序或内核模块,它们可能会被无意中加载为特洛伊木马,可以访问所有特权功能。无论操作系统或管理程序可能在做什么,为了以隐蔽的方式保持对系统的控制,攻击者可能会进一步感染系统的引导过程(例如,通过覆盖主引导记录或统一可扩展固件接口(UEFI),固件)——让恶意代码在每次重启时控制启动过程(甚至在操作系统运行之前),从而允许它绕过任何和所有操作系统级别的防御。除了使用特洛伊木马之外,攻击者还经常在没有任何用户帮助的情况下利用漏洞来破坏安全属性。事实上,攻击者可能会使用多种方法。例如,他们通常会滥用软件中的漏洞(例如内存错误)来更改操作系统中的代码指针或数据,从而破坏其完整性、机密性或可用性。通过损坏代码指针,它们可以控制程序在使用损坏的代码指针的调用、跳转或返回指令后从何处恢复执行。更改数据或数据指针开辟了其他可能性,例如将非特权进程的特权级别提升到“root”(提供全面的“系统”特权)或修改页表以允许进程访问任意内存页面。此外,他们可能会使用此类错误通过更改系统调用或网络请求返回的数据量或数据量来从操作系统泄漏信息。攻击描述恶意扩展攻击者设法诱使系统加载恶意驱动程序或内核模块(例如,作为特洛伊木马)。Bootkit攻击者甚至在操作系统开始运行之前就中断引导过程以获取控制权。内存错误(软件)空间和时间内存错误允许攻击者(本地或远程)转移控制流或泄露敏感信息。内存损坏(硬件)DRAM中的Rowhammer等漏洞允许攻击者(本地或远程)修改他们无法访问的数据。统一的数据泄露操作系统将数据返回给未正确初始化且可能包含敏感数据的用户程序。并发错误和双重获取示例:操作系统两次使用用户空间中的值(例如,一次使用大小值来分配缓冲区,然后将其复制到该缓冲区中),并且该值在两次使用之间发生变化。侧信道(硬件)攻击者利用缓存和TLB等共享资源的访问时间来检测另一个安全域是否正在使用该资源,从而泄露敏感数据。侧通道(推测)在推测或乱序执行期间绕过安全检查,当结果被压缩时,它们会在机器的微架构状态中留下可测量的痕迹。侧信道(软件)示例:当操作系统/管理程序使用内存重复数据删除等功能时,攻击者可以判断另一个安全域是否具有相同的内容。资源耗尽通过占用资源(内存、CPU、总线等),攻击者会阻止其他程序取得进展,从而导致拒绝服务。死锁/挂断(DoS)攻击者使系统处于软件的某些部分无法取得进展的状态,例如,由于死锁(DoS)。表1:现代操作系统的已知攻击方法/安全威胁攻击者还可以利用硬件中的漏洞,例如许多DRAM芯片中存在的Rowhammer错误。由于存储芯片中的位按行组织并非常紧密地组合在一起,因此访问一行中的位可能会导致相邻行中的相邻位向其电容器泄漏少量电荷-即使该位完全处于内存中的不同页面。通过以高频率重复访问该行(“锤击”),干扰会累积,因此在某些情况下相邻位可能会翻转。我们事先不知道哪些连续位(如果有的话)会翻转,但一旦一位翻转,如果我们重复实验,它会再次翻转。如果攻击者成功地翻转了内核内存中的一点,他们就会发起类似于基于软件的内存损坏的攻击。例如,破坏页表以访问其他域中的内存。另一类攻击是并发错误和双重获取。双重获取对于操作系统来说是一个严重的问题,当它两次使用用户空间中的值时会发生(例如,一个大小值被分配的缓冲区使用一次,然后复制到该缓冲区中)。如果操作系统和攻击者之间存在竞争,并且攻击者在访问之间更改用户空间值并使其变小,则可能会出现内存损坏等安全问题。它类似于检查使用时间(TOCTOU)攻击,只是修改后的值被使用了两次。除了直接攻击外,攻击者还可以使用侧通道间接泄露信息,例如通过缓存侧通道。有许多变体,但一个常见的变体涉及攻击者用他们自己的数据或代码填充缓存集,然后定期访问这些地址。如果任何访问速度明显变慢,他们就会知道其他人(可能是受害者)也访问了属于同一缓存集的数据/代码。现在假设受害者代码以秘密依赖它的方式调用该函数。例如,加密例程逐位处理密钥,如果位为0则调用函数foo,如果位为1则调用函数bar,其中foo和bar在不同的缓存集中。通过监控侧通道使用了哪些缓存集,攻击者可以快速获知密钥。另一个著名的硬件侧通道系列滥用推测和乱序执行。为了提高性能,现代CPU可能会在指令完成之前预执行指令。例如,在等待条件分支的条件被解决时,分支预测器可能会推测结果将是“分支采用”(因为那是最后n次的结果),并推测执行对应于采取的分支。如果结果证明是错误的,CPU会压缩所有推测执行的指令的结果,以便寄存器或内存中不存在任何存储。但是,在微架构状态下可能仍然存在执行痕迹(例如在指令集架构中不直接可见的高速缓存、TLB和分支预测器的内容)。例如,如果用户程序中的推测指令从寄存器中的内存中读取敏感且通常不可访问的字节,然后将其用作用户空间数组的偏移量,则该偏移量处的数组元素将位于缓存中,即使CPU发现寄存器中的值不应该被访问,也会压缩寄存器中的值。攻击者可以对数组中每个元素的访问进行计时,并查看其中一个是否明显更快(在缓存中)。该元素的偏移量将是秘密字节。换句话说,攻击者可以使用缓存侧通道来提取推测访问的数据。最近的攻击表明,与推测和乱序执行相关的硬件漏洞可能比我们想象的更具灾难性。Foreshadow攻击滥用了这样一个事实,即只要内存页被标记为不存在,英特尔CPU就会推测性地从L1缓存中读取数据,而没有正确检查该物理地址的数据所有权。更糟糕的是,被称为RogueFlightData(RIDL)的漏洞(可以在未经许可的情况下被攻击者利用,甚至可以从浏览器中的JavaScript中利用)不关心地址,这表明IntelCPU推测执行的指令不断地与来自的数据一起提供通过各种临时微架构缓冲区的任意安全域。缓解这些攻击不仅需要更改硬件,还需要深入且通常是复杂的操作系统参与。例如,操作系统可能需要刷新可能泄漏数据的缓存和缓冲区,保证某些分支之间不会发生推测,或者在不同时间在不同内核上调度安全域等。除了缓存之外,硬件侧通道可以使用各种共享资源,包括TLB、MMU和许多其他组件[17]。事实上,侧信道根本不需要与硬件相关。例如,在操作系统中实现的内存重复数据删除和页面缓存是众所周知的侧信道来源。为了说明起见,关注前者,考虑一个主动删除重复内存页面的系统:每当它看到两个内容相同的页面时,它就会调整虚拟内存布局,使两个虚拟页面都指向同一个物理页面。这样,它只需要保留一个物理页面来存储内容,它可以以写时复制的方式共享这些内容。在这种情况下,写入该页面需要更长的时间(因为操作系统必须再次复制该页面并调整其页表映射),这是攻击者可以测量的。因此,如果写入页面需要更长的时间,攻击者就会知道其他一些程序也有内容的副本——一个告诉攻击者关于受害者数据的信息的边信道。研究人员已经表明,攻击者可能会使用这种粗粒度的侧信道来揭示非常细粒度的秘密[18]。在许多侧信道中,问题是软件和硬件中的安全域之间缺乏隔离(例如,在硬件实现的推测执行期间可能没有隔离或隔离太少)。重要的是要认识到域隔离问题扩展到硬件/软件接口。特别是对于保密而言,信息泄漏可能是微妙的,看似无害的,但仍然会导致严重的安全问题。例如,在我们允许代码重用或Rowhammer攻击之前,对象的物理地址甚至虚拟地址可能看起来不是非常敏感的信息,在这种情况下,地址知识被滥用以将控制流转移到特定地址或翻转特定位。至于攻击的来源,它们可能是从用户空间在受害机器上本机运行的本机代码、(恶意)操作系统扩展、通过网络获取并在本地执行的脚本代码(例如浏览器中的JavaScript)、恶意外围设备甚至远程系统(攻击者通过网络发起攻击)。显然,远程攻击比本地攻击更难执行。在某些情况下,我们明确扩展攻击者模型以包括恶意操作系统或恶意管理程序。这些攻击者可能与基于云的系统相关联,其中云提供商不受信任,或者操作系统本身已受到损害。在这些情况下,目标是保护敏感应用程序(或其片段)免受内核或管理程序的影响,这些应用程序可能在受特殊硬件保护的受信任执行环境或飞地中运行。评估系统安全性的一个有用指标是攻击面,即攻击者可以到达或获取数据的所有不同点。为了尝试破解系统。例如,对于本地运行的本地代码,攻击面包括攻击者可以执行的所有系统调用,系统调用的参数和返回值,以及攻击者可以访问的实现系统调用的所有代码。对于远程攻击者,攻击面包括网络设备驱动程序、部分网络堆栈以及处理请求的所有应用程序代码。对于恶意设备,攻击面可能包括设备可能使用DMA访问的所有内存或设备可能与之交互的代码和硬件功能。但是请注意,将更多代码暴露给攻击者只是一个代理指标,因为代码质量参差不齐。在极端情况下,系统经过正式验证,使得各种常见漏洞不再存在。
