Packet Chasing:通过缓存侧信道监视 络数据包

摘要

关键词:侧信道攻击,缓存攻击,DDIO,包处理,安全,微架构安全

1. 导言

多千兆以太 和其他高速 络I/O技术(如Infiniband)的广泛采用,凸显了高速处理 络数据包以维持这种新出现的 络吞吐量,并进一步提高带宽密集型数据中心工作负载的性能的重要性。因此,目前大多数英特尔服务器级处理器都采用了DDIO技术,该技术允许直接在处理器的末级缓存(LLC)中注入和后续处理 络数据包,绕过传统的DMA(直接内存访问)接口。DDIO对包括操作系统驱动程序在内的软件来说是不可见的,而且总是默认启用。

DDIO背后的关键动机是,现代服务器级处理器采用了大型LLC(大小为20MB)从而使 络堆栈能够在LLC内完全托管热数据结构和进程中的 络数据包,减少对主存储器的访问。通过消除冗余的内存传输,DDIO已经被证明可以在I/O带宽和整体功耗方面提供实质性的改进。尽管英特尔限制为DDIO分配超过10%的LLC,以防止缓存污染,但它既没有为DDIO静态保留也没有为DDIO动态分区缓存的专用部分。

我们进一步表明, 络驱动程序使用的数据包缓冲区的位置(在缓存中),以及它们被填充的顺序,很容易被攻击者发现,这大大减少了跟踪被追逐的数据包序列所需的探测量。

除了秘密通道,我们还描述了一种新型的基于数据包追逐的侧信道攻击,这种攻击利用了和 络浏览器同时运行(或在 络浏览器内)的本地间谍进程。在我们的实验中,在客户端的间谍程序是与浏览器(如Mozilla Firefox)同时运行的,它能够在不接入 络的情况下对远程受害者的 站访问进行指纹识别。特别是,这种攻击使攻击者能够根据数据包大小模式识别受害者的 络活动。这种类型的 络指纹可以被一个政府用来识别被禁止的 站的访问,或者攻击者可以仅仅通过成功登录会话的指纹来识别一个安全组织的成员(然后进行更有针对性的攻击)。

(1) 在DDIO开启的情况下,很容易发现普通 络驱动的包缓冲区的位置;

(2) 每发送一个数据包的大小(以缓存块为增量)也可以被发现;

(3) 被发现的缓冲区被重复访问的顺序也可以被推断出来;

(4) 在 络上发送数据包的木马和另一台机器上的间谍之间可以建立秘密通道;

(5) 数据包大小的序列/模式会在侧信道上泄露敏感信息,如 络访问活动的痕迹;

(6) 提出了一种短期的纯软件随机化方案以及自适应的缓存分区方案,以最小的性能开销抵御该攻击。

2. 背景和相关工作

本节提供了 络数据包处理、DDIO和相关 络优化、基于 络和I/O的攻击以及缓存攻击的背景知识。

A. 络数据包的旅程

当一个应用程序通过 络发送数据时,通常会发送一个数据流;而传输层的责任是将大的消息分解成 络层可以处理的小块。最大可传输单元(MTU)是指可以通过传输介质发送的最大连续数据块。例如,以太 MTU是1500字节,这意味着以太 帧可以携带的最大IP数据包(或其他有效载荷)是1500字节。加上以太 头部的26个字节,则最大帧为1526字节。

当NIC驱动程序初始化时,它首先分配一个用于接收数据包的缓冲区,然后创建一个描述符,其中包括接收缓冲区大小及其物理内存地址。然后,它将接收描述符添加到接收环 (rx ring),这是一个驱动器和 NIC 共享的循环缓冲区,用于存储传入的数据包,直到它们可以被驱动器处理。然后,驱动程序通知 NIC,它在 rx 环中放置了一个新的描述符。NIC 读取新描述符的内容,并复制大小和物理地址到其内部存储器。在这一步,初始化完成,NIC就可以接收数据包了。

除了PRIME+PROBE之外,还提出了其他多种缓存攻击的变种。FLUSH + RELOAD使用Intel的CLFLUSH指令将目标地址从缓存中驱逐出,然后在测量阶段,攻击者重新加载目标地址并测量其访问时间。但它依赖于间谍程序和受害者之间的共享内存,并且需要访问精确的定时器。PRIME+ABORT利用英特尔的事务性内存扩展(TSX)硬件来装载无计时器的末级缓存攻击。

文献中已经提出了一些防御措施来缓解缓存时序通道。这些缓解策略包括识别软件中的泄漏,观察无规则缓存行为,在硬件设计时关闭通道,动态缓存分割,将物理内核严格保留给安全敏感线程,随机化,内存跟踪遗忘,以及使用诱饵加载微操作的缓存状态混淆。

E. I/O设备和驱动程序的安全性

一些针对设备驱动程序的安全攻击已经公布。Thunderclap描述了一种颠覆输入输出内存管理单元(IOMMU)保护的攻击,以暴露DMA功能的I/O外设可用的共享内存。Zhu等人展示了另一种绕过IOMMU并危及GPU驱动的攻击,以利用GPU微代码获得对CPU物理内存的完全访问。为了解决这些漏洞,研究者们将重点放在隔离设备驱动上,当设备驱动出现bug或有故意恶意的代码时,要使操作系统安全。Tiwari等提出了一个完整的系统,该系统包括一个I/O子系统和一个微内核,通过监视和控制系统的信息流,实现隔离和安全通信。

NetCAT也是我关注的一篇文章,发表在 S&P 2020

3. Packet Chasing,发起攻击

我们对加载到Linux Kernel 4.4.0-142版本中的英特尔千兆以太 络(IGB)驱动5.3.5.22版本进行分析和攻击。我们在戴尔PowerEdge T620服务器上运行攻击,该服务器使用Intel I350 络适配器,由两个Intel Xeon CPU E5-2660处理器运行。每个处理器都有一个20 MB的末级缓存,有16384个缓存集。为了对末级缓存进行PRIME+PROBE,我们使用Mastik微架构侧信道工具包0.02版。

我们的攻击包括两个阶段。一个是离线阶段,攻击者恢复缓冲区的序列,另一个是在线阶段,攻击者利用这些信息来监控传入的数据包。

A. NIC驱动的解构

虽然本小节的代码样本是针对英特尔千兆以太 (IGB)驱动程序的,但我们注意到这些见解是可以通用的。最初的以太 IEEE 802.3标准将以太 帧的最小尺寸定义为64字节,最大尺寸为1518字节,后来最大尺寸增加到1522字节,以允许VLAN标记。由于驱动程序和 卡事先并不知道传入数据包的大小,所以 卡必须分配一个可以容纳任何大小的缓冲区。IGB驱动程序为每个帧分配一个2048字节的缓冲区,并将最多两个缓冲区打包成一个4096字节的页面,该页面将与 络适配器同步。为了保证兼容性,建议设备驱动程序在为DMA映射内存区域时,只映射在页边界上开始和结束的内存区域,而页边界也保证是缓存线边界。另外,在主机处理数据包时,rx环缓冲区用于暂时保存数据包。虽然在环中采用更多的缓冲区可以降低丢包率,但也会增加主机内存的使用量和缓存的占用。因此,虽然英特尔I350适配器支持的最大大小是4096个缓冲区,但IGB驱动程序中的默认值是设置为256个。

linux内核在DMA API中,为设备驱动程序提供了两种不同类型的DMA内存分配。相干内存(或一致内存)和流式DMA映射。相干内存是DMA内存映射的一种类型,对于这种类型的内存,设备或处理器的写入可以被处理器或设备看到和读取,而不需要显式同步,也不用担心缓存效应。但是,处理器在通知设备读取该内存之前,必须先刷新写缓冲区。因此,一致内存在某些平台上可能会很昂贵,因为它由于写障碍和缓冲区的刷新,总是需要等待。缓冲区本身使用流式DMA映射,而环描述符则使用相干内存映射。因此,设备和驱动程序对环描述符有相同的视图。同时,这也使得对rx描述符环的写入成本很高。因此,为了避免改变rx描述符的内容,驱动程序在接收数据包后通常会重复使用缓冲区,而不是分配新的缓冲区。所以,驱动程序通常只分配一次缓冲区,并在整个驱动程序的生命周期中重复使用。

参考:https://www.jianshu.com/p/0607c5f62c51

参考:https://blog.csdn.net/scarecrow_byr/article/details/82584489

通过将监控的缓存集数量缩小到只有256个可能的缓冲区起始位置,我们能够看到NIC设备在接收数据包时缓存中的清晰足迹,如 图7 所示。在这个实验中,我们依靠一个远程发送者,他与间谍程序在同一个 络上,并不断向 络发送广播以太 帧。为此,我们使用Linux raw socket,它可以生成任意大小的广播以太 帧。由于协议字段是未知的,这些帧会在驱动程序中被丢弃。因此,我们所看到的效果只是由驱动程序或适配器访问缓冲区引起的,而没有内核 络栈的任何活动。在样本25k左右,发送者开始发送数据包,并且一直持续到样本100k。在一些缓存集中,例如,缓存集编 53,我们不看到任何活动,那是因为没有一个NIC缓冲区被映射到这些集合。

攻击可以区分出不同大小的数据包流,只需要检测到达的数据包是小数据包流还是大数据包流(本质上是二进制信 ),可以来构建带宽达到1950字节/秒的远程隐蔽信道(详见第四章)。然而,如果我们用更细的粒度来区分数据包大小,每个数据包都会发送多个比特的信息,我们就可以把它变成一个更强大的通道。下面的小节描述了我们在执行PRIME+PROBE时用来进一步缩小监测集的方法。

C. 通过高速缓存追逐数据包

攻击者因为不知道哪些缓冲区会先被填满,所以只能一次性探查所有256个页对齐的缓存集来检测传入的数据包,然后再探查更多的缓存集来检测数据包大小。然而,如果我们知道驱动中缓冲区被填充的顺序,那么我们实际上可以通过只探测下一个预期缓冲区对应的缓存集来追赶缓存上的数据包,建立一个强大的高分辨率攻击。我们表明,在一次性统计分析阶段,几乎可以完全恢复缓冲区的序列。由于缓冲区总是被回收,然后返回到环中,因此在驱动的生命周期内,环中缓冲区的顺序是保持不变的。

算法1 描述了我们用来恢复序列的 SEQUENCER 过程。它包括三个步骤。首先,在 GET_CLEAN_SAMPLES 步骤中,我们收集Nsets缓存集的缓存探测样本。为此,我们从构建页对齐的NIC缓冲区的驱逐集开始。然而,有时我们在一些集上会出现总是漏掉的情况,这很容易被先验观察到。对于这些缓存集,我们只需使用页对齐缓冲区的第二个缓存块来代替第一个缓存块。

最后一步,MAKE SEQUENCE,就是遍历我们在前面几步中建立的图,从一个随机节点开始,继续向前移动,直到到达同一个节点。需要注意的是,由于最后的序列是一个环,其中每个节点的内度和外度正好是一个,所以起始节点的选择并不会改变结果。

虽然这个过程可以恢复被映射到Nset中的缓冲区的顺序,但它只能在我们监控有限的一部分页对齐的缓存集的情况下才能做到这一点(我们最多成功监控到64个缓存集)。这是因为如果我们在监控列表中包含更多的集,那么探测时间会变得比检测传入数据包的顺序所需的时间要长。所以我们首先找到32个缓存集的序列,然后我们用前31个节点(节点0到节点30)加上一个候选节点(如32)重复sequencer过程,我们尝试找到候选节点在序列中的位置。然后,我们重复同样的过程,在节点序列中移动,直到我们在序列中找到所有缓存集的位置。

有时,两个连续的缓冲区被映射到一个集合中。例如,考虑图9 中93 和98 缓冲区被映射到2 集合的情况。通过我们的方法,我们不会在第一轮就捕捉到这些情况,但是从一开始,当我们遇到一个介于两者之间的缓冲区时,我们可以在图中把两者分开。如果它们在最后一环中真的是连续的(不太可能),那么缓冲区基本上就会被合并,但这对我们创建隐蔽通道的机制没有影响,而且对我们观察到的 络指纹泄漏攻击中的整体指纹影响很小。

d) DDIO/DCA的可检测性和作用。在DDIO存在的情况下,携带隐蔽信息的数据包是很难被检测和过滤的(比如被防火墙系统丢弃发送到受害节点的数据包),因为这些数据包可以是普通的广播数据包,比如DHCP和ARP,甚至不要求这些数据包的目的地是运行了间谍程序的主机。这是因为,在DDIO/DCA的情况下, 络适配器会直接将数据包传输到处理器的末级缓存中,只有在这之后,驱动程序才会检查每个帧的头,并丢弃那些不针对该机器中任何协议的数据包。也就是说,在启用DDIO后,即使A只向同一 络中的C机发送数据包,我们也可以在A机和B机之间建立通道。

DDIO使Packet Chasing获得更清晰的信 ,因为有效负载的缓存块与属于数据包头的缓存块同时出现在缓存中。这使得该攻击能够探测相邻的缓存块,并快速检测每个数据包的大小。然而,如果DDIO被禁用或不存在,数据包的传输过程就会有所不同。首先, 卡将数据包的 头存储在内存中,然后驱动程序读取 头,并根据 头字段对数据包进行处理。这样就把包含头的缓存块带入缓存中。对于大多数常见的高层协议(如http),软件栈会在数据包 头到达后不久访问数据包的其他部分。

在没有DDIO的时候,I/O写入和驱动读取之间的延迟成为攻击中的一个因素。在这种情况下,攻击者应该将探测时间设置为大于该延迟。当考虑了该延迟后,数据包的缓存足迹与DDIO情况下保持一致。然而,增加探测间隔会导致每个间隔中捕获更多的噪声。但正如《Direct cache access for high bandwidth network i/o》中表征的那样,几乎100%的数据包的延迟都小于20k周期。这个延迟还取决于数据包的大小。对于小于5个缓存块的小数据包,因为驱动程序会将这类数据包复制到另一个缓冲区,有效载荷几乎会在数据包头被访问后立即被访问。在这种情况下,不使用DDIO的攻击与使用DDIO的攻击一样容易检测到小数据包的数据包大小。

简而言之,DDIO使攻击更隐蔽,更可靠(噪音更小)。但如果没有DDIO,攻击也完全可以实现。举个例子,下一节介绍的 络指纹攻击会安装在有DDIO和没有DDIO的系统上。

5. Packet Chasing:利用包的大小

在本节中,我们将介绍一个Packet Chasing攻击的应用示例,在这个应用中,我们利用数据包大小的高分辨率样本来获取同一地点用户的浏览数据信息。例如,间谍程序可能在等待受害者进入某个 站后再发起一些行动,如密码检测攻击。

这种简单的攻击包括两个阶段。首先是离线阶段,攻击者生成感兴趣的不同 站的数据包大小痕迹,然后处理这些痕迹,计算出每个 站的代表性痕迹。这只是对数据包大小进行逐点平均,从而得到这些点(平均数据包大小)随时间变化的矢量。

在为攻击做准备的过程中,攻击者建立环形缓冲器的序列,如前面所述。之后,该攻击者启用了监听模式,在这个模式下,它不断地监视序列中第一个缓冲区的前两个缓存块,直到她发现一个窗口,其中缓存块0和缓存块1都有活动。这表明有数据包正在填充该缓冲区。然后,与秘密信道中的接收器类似,在每次检测到活动时,攻击者就会移动到序列中的下一个缓冲区。每次,攻击者都会监视缓冲区第一半页的前四个块,以及缓冲区第二半页的前四个块。这是因为当有大数据包时,驱动程序会在半页之间切换(见第三节 – A),这使得攻击者可以区分四个级别大小的数据包。在收集到数据包大小的样本后,间谍程序将收集到的向量送入一个简单的基于相关性的分类器,该分类器计算收集到的样本与不同目标代表性痕迹的交叉相关性。

图13 显示了我们通过Packet Chasing获得的信 和使用tcpdump数据包分析器捕获的实际数据包大小的例子。使用Mozilla Firefox 68.0.1版本浏览器访问 站。图中显示了数据包大小,即使是在缓存块粒度下,也可以成为被访问的 页的标识符。数据包通常在频谱的两侧都很拥挤,它们要么是携带了一个非常大的消息,被碎片化成了MTU大小的帧,要么是小的控制包。但是大消息的最后一个包可以落在1缓存块到MTU之间的任何地方,给我们提供了一个很好的 页指示。此外,将数据包大小与Packet Chasing从数据包中获得的时间信息相结合,给我们提供了足够的信息来区分webpages。我们使用一个小型的封闭数据集来评估我们的指纹攻击,其中有5个不同的 页:facebook.com、twitter.com、google.com、amazon.com、apple.com。在这个实验中,我们检查了两种攻击情景,一种是有DDIO的,一种是没有DDIO的。在我们的1000次实验中,使用DDIO的Packet Chasing检测出正确 站的准确率为89.7%,而禁用DDIO后,准确率降至86.5%。这两种攻击的区别是增加了探测时间(导致更多的噪声),如果数据包头到负载的延迟很高,那么错过大数据包的概率也会增加。

b) 防的性能结果。图14 显示了我们的自适应缓存分区方案的性能,比较了Nginx 络服务器的平均吞吐量。平均而言,我们观察到的吞吐量损失不到2%。这主要是由于CPU缓存分区的缓存行数减少,导致LLC未命中率略有上升(也见图15 )。该图还显示了防御策略对末级缓存大小的敏感性。在末级缓存大小为20 MB的情况下,我们的方法会产生最大2.7%的吞吐量损失。图15 进一步分析了防御的性能,显示了没有任何直接缓存访问(No DDIO)的基线与有DDIO访问和我们的自适应分区防御策略的内存流量和LLC未命中率。自适应分区和DDIO都能有效降低内存流量。自适应分区方案的内存流量增加在DDIO的2%以内。

为了比较自适应缓存分区和我们提出的基于软件的缓解措施(第六节),我们设计了另一个使用wrk2工具的实验。在这个实验中,我们向目标主机上的Nginx Web服务器发送请求。wrk2工具使用8个线程,1000个打开的连接,目标吞吐量设置为每秒140k次请求。图16 显示了本次实验的结果。除了自适应缓存分区和vanilla IGB基线之外,我们还研究了另外三种提出的方案:完全随机化的环形缓冲区方案,为每个传入数据包在随机存储位置分配新缓冲区,以及两个部分随机化方案,在收到指定数量的数据包后,定期重新分配缓冲区 – 我们在收到1k或10k个数据包后随机化。请注意,在我们的设置中,追包攻击目前至少需要65536个数据包才能完全解构环形缓冲区(找到缓存块位置和序列信息),另外还需要100个数据包才能发动合理的指纹攻击。自适应分区方法在横坐标99%的时候,延迟只发生3.1%的损失,而完全随机化方法则发生41.8%的损失。我们在这个实验中使用了千兆以太 ,但我们预计随机化的性能成本会随着链路速率的提高而加剧。

Packet Chasing:通过缓存侧信道监视 络数据包

8. 披露

我们向英特尔披露了这个漏洞,解释了该漏洞的基本实质,并提供了更多细节。MITRE 在 Common Vulnerabilities and Exposures(CVE)数据库中已经分配了一个编 :CVE-2019-11184,该漏洞被列为中度严重漏洞。

9. 结论

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年7月17日
下一篇 2020年7月17日

相关推荐