20199312 2019-2020-2 《网络攻防实践》综合实践

综合实践-page cache attack

1研究背景和研究意义

1.1研究目的

该论文采用的是一种新型的侧信道攻击,主要针对的是操作系统,它能够绕过特定硬件的芯片,利用现代操作系统的基础功能(页面缓存)来访问开发人员和用户想要尝试隐藏的那些数据。

1.2技术背景-侧信道攻击

侧信道攻击(side-channel attack 简称 SCA):针对加密电子设备在运行过程中的时间消耗、功率消耗或电磁辐射之类的侧信道信息泄露,而对加密设备进行攻击的方法被称为侧信道攻击。这类新型攻击的有效性远高于密码分析的数学方法,因此给密码设备带来了严重的威胁。

1.3技术背景-缓存

缓存是一种可用来暂时储存数据以方便高速数据交换的存储区域,它可能出现在硬件或软件上。所有现代操作系统(例如,Windows、Linux、Android和IOS)都存在页面缓存。

1.4技术背景-CPU高速缓存

由于计算机内存访问速度比CPU处理速度慢得多,为了不影响工作效率,缓和CPU处理速度和内存访问速度不匹配的矛盾,现代CPU架构中引入了Cache( CPU高速缓存)。CPU高速缓存,由静态随机存储器SRAM组成,容量比较小但访问速度比内存高得多,匹配CPU的处理速度。它由Cache存储体(存放由内存调入的指令和数据)、地址转换部件(实现内存地址到缓存地址的转换)和替换部件(缓存满时进行数据块替换)组成。
程序运行中当CPU在Cache中找到所需的数据时被称为命中(Hit),而当Cache中没有CPU所需的数据时称为未命中(Miss),此时CPU会访问内存并将数据加载到cache中。

1.5页面缓存(paper cache)

硬盘比内存慢几万倍,内存等不及。所以操作系统增加了一个抽象层:Page cache,把慢如蜗牛的硬盘的文件缓存在内存中。页面缓存(Page Cache)则是通过将磁盘中的数据缓存到内存中,从而减少磁盘I/O操作,以此来提高性能。它呈现了来自硬盘或固态硬盘的各种页面,操作系统通常会在闲置的内存上保留一个页面缓存,以方便快速存取页面缓存上的资料,并增进整体效能。
在Linux当中,几乎所有的文件读写操作都依赖Page Cache,在向硬盘写入文件的时候,并不是直接把文件内容写入硬盘以后才返回的,而是写入到Page Cache就直接返回了。这个Page Cache会被标记为“Dirty”,随后由内核线程写入硬盘。
当从硬盘读取文件时,也不是直接把数据从硬盘复制到用户态的内存,而是先复制到内核的Page Cache,然后再复制到用户态的内存。

.1.6传统缓存攻击方案

** Flush-Reload **:步骤1:Flush阶段将特定地址映射的Cache数据清空。
步骤2:等待目标进程运行以更新Cache。
步骤3:Reload阶段重新加载Flush阶段清空的Cache数据对应的内存块,测量并记录重载时间,根据时间长短判断目标程序是否访问了特定的内存地址。
该方法攻击原理如图所示(虚线框为描述中的特定地址):

2攻击原理及攻击内容

2.1威胁模型

我们的攻击如右图所示。攻击者的目的是确定受害者程序何时调用函数foo()。
通过观察该页面何时在页面缓存中,攻击者可以了解foo()何时被调用。  
我们的攻击持续执行以下步骤:
首先,确认缓存状态,即查看目标页面是否在页面缓存中。
逐出,页面不在页面缓存了。攻击者持续探测了,直到页面被添加回时。
一旦页面缓存中发现页面,攻击者将其记录从而获取页面信息。

2.2确认缓存状态

要确定页面是否位于页面缓存中,我们依赖在操作系统上提供API来查询页面缓存。
在Linux上,这个API由mincore系统调用提供。
mincore系统调用原型是int mincore(void *addr, size_tlength, unsigned char *vec),mincore会统计从addr开始长度为 length字节的虚拟内存页,通过vec返回这些页所映射的数据是否被加载到物理内存中。该页数据在内存中,vec对应的元素就为1,否则为0。mincore系统调用能够很方便的拿到该页是否在Page Cache中。
在Windows上,借助的是QueryWorkingSetEx系统调用。通过QueryWorkingSetEx查看页所映射的数据是否被加载到物理内存中

2.3ASLR

在计算机科学中,地址空间配置随机加载(英语:Address space layout randomization,缩写ASLR,又称地址空间配置随机化、地址空间布局随机化)是一种防范内存损坏漏洞被利用的计算机安全技术。
作为攻击者进程在共享库的映射上工作,所有地址都是相对于共享库的开头观察到。因此,地址空间布局随机化(ASLR)等安全机制对我们攻击Linux没有影响。在Windows上攻击甚至允许在其他进程中破坏ASLR。

2.4页面逐出(Linux)

对于攻击者来说,最佳的缓存逐出是仅驱逐受害者的目标页面,不影响其他缓存页面。
我们的想法是不断访问大量的已经在页面缓存(将它们保留在其中),然后访问少数非缓存页面可以驱逐目标页面。

2.5页面逐出(Windows)

Windows上的机制略有不同,因为我们仅使用工作集驱逐。
Windows进程工作集。大小在100KB和1.4MB之间。因此我们从进程中逐出页面而不是页面缓存中。结果显示,从进程逐出和硬件缓存攻击逐出效果相当。
借助VirtualUnlock函数,SetProcessWorkingSetSize。SetProcessWorkingSetSize函数可以设置虚拟缓存大小。
VirtualUnlock(LPVOID lpAddress,SIZE_T dwSize);将页面锁定在物理内存中使用VirtualLock函数。这样页面将不会被交换到硬盘上,使用VirtualUnLock变可以将其解锁从而达到逐出工作集的功能。

2.6性能比较

对于Linux上的测试,我们使用 Ubuntu 16.04。实验观察到的传播率高达9.69 kB/s,平均传输速率为 7.04 kB/s标准错误为 0.18 kB/s。
在Windows操作系统,平均传输速率为100.11 kB/s,位错误率低于 0。000006 %。效果远好于Linux操作系统。
可以得出结论,本论文的攻击效果和需要特定硬件(Intel处理器)的隐蔽通道和共享内存的Flush+Reload和Flush+Flush攻击效果相当。
因此,我们得出结论,我们的侧信道可以与最先进的硬件组件侧信道进行竞争,我们可以取代这些泄漏的硬件组件秘密通道。

3论文复现及结论

3.1Linux攻击原理复现

3.1.1准备工作

编译

make

swapoff命令:关闭系统交换区 当系统的物理内存不够用的时候,把硬盘内存中的一部分空间释放出来,以供当前运行的程序使用。关闭后可以让实验实现更加简单。

swapoff -a

3.1.2运行

发送端
make run-sender
接收端

运行发送端后运行接收端

make run-receiver

3.1.3结果

发送端
LD_LIBRARY_PATH=. ./sender
Sender process
ecicting page cache ...
sending 1th character ...
ecicting page cache ...
sending 2th character ...
ecicting page cache ...
sending 3th character ...
ecicting page cache ...
sending 4th character ...
ecicting page cache ...
sending 5th character ...
ecicting page cache ...
sending 6th character ...
ecicting page cache ...
sending 7th character ...
ecicting page cache ...
sending 8th character ...
ecicting page cache ...
sending 9th character ...
接收端
LD_LIBRARY_PATH=. ./receiver
Sender process
waiting ...
recved caracter(P)
waiting ...
recved caracter(a)
waiting ...
recved caracter(s)
waiting ...
recved caracter(s)
waiting ...
recved caracter(W)
waiting ...
recved caracter(o)
waiting ...
recved caracter(r)
waiting ...
recved caracter(d)
waiting ...
recved caracter()
Received key: PassWord

3.2PHP侧信道密码破译

PHP框架中就使用了PHP函数microtime()来作为伪随机数种子,并用来进行密码操作。由于攻击者可以捕捉到返回的微时间以及调用密码生成器的请求,所以他们就能够了解加密的基本信息,从而使解密的过程变得更加简单。
我们发现流行的phpMyFAQ框架仍然依靠这种方法。现已更新并修补漏洞。

4总结和展望

这种新漏洞强大之处在于不需要对硬件的指令进行分析,直接跨硬件攻击。主要工作原理就是低权限用户通过操作系统就能够获取到的简单系统调用。
以此可以检测并提取整个缓存页表上的数据,甚至是那些只存在了几毫秒的数据它都能获取到。由于攻击本身只需要花几毫秒的时间,因此攻击者有足够多的时间来做他们想做的事情,比如说读取用户的键盘击键数据和那些涉及到加密密钥查询的明文响应数据。
尽管操作系统以及修复了漏洞,限制了API的功能,但并未从根本上解决缓存信息泄露问题,缓存设计的设计上仍存在缺陷,今后的研究方向将侧重于页面缓存的操作权限研究以及优化方案。

posted @ 2020-07-05 11:21  刚刚吃饭来着呢  阅读(267)  评论(0编辑  收藏  举报