1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 网络攻防技术——幽灵攻击实验

网络攻防技术——幽灵攻击实验

时间:2020-10-22 07:55:05

相关推荐

网络攻防技术——幽灵攻击实验

一、题目

幽灵攻击于发现,并于1月公开披露,它利用关键漏洞进行攻击,存在于许多现代处理器中,包括Intel、AMD和ARM处理器。漏洞允许程序突破进程间和进程内的隔离,以便恶意程序可以读取来自无法访问区域的数据。硬件保护不允许这样的访问机制(用于进程间的隔离)或软件保护机制(用于进程内的隔离),但CPU设计中存在漏洞,可能会破坏保护。因为缺陷存在于硬件中,很难从根本上解决问题,除非更换CPU。幽灵和熔断漏洞代表了CPU设计中的一种特殊类型的漏洞,它们还为安全教育提供了宝贵的一课。

本实验的学习目标是让学生获得幽灵攻击的第一手经验。攻击本身非常复杂,因此我们将其分解为几个小步骤,每个步骤都是易于理解和执行。一旦学生理解了每一步,就不难理解了把所有的东西放在一起进行实际的攻击。本实验涵盖了以下内容:

•幽灵攻击

•侧通道攻击

•CPU缓存

•CPU微体系结构内的无序执行和分支预测

二、过程

一、Task 1: Reading from Cache versus from Memory

缓存内存用于以更快的速度向高速处理器提供数据。与主存相比,缓存内存非常快。让我们看看时间差。在代码CacheTime.c中,我们有一个大小为104096的数组。我们首先访问它的两个元素,数组[34096]和数组[74096]。因此,包含这两个元素的页面将被缓存。然后,我们从数组[04096]读取元素到数组[94096],并测量3在内存读取中所花费的时间。需要注意的是,缓存是在缓存块级别完成的,而不是在字节级别。一个典型的高速缓存块大小为64字节。我们使用数组[k4096],因此程序中使用的两个元素不属于同一个缓存块。

使用gcc -march=native CacheTime.c编译

实验结果表明,数组[34096]和数组[74096]的访问速度是否比其他元素更快。

二、Task 2: Using Cache as a Side Channel

该任务的目的是使用侧通道来提取受害者函数所使用的秘密值。假设有一个受害者函数,它使用一个秘密值作为索引来从数组中加载一些值。还假设秘密值不能从外部访问。我们的目标是使用侧边通道来获得这个秘密的数值。

1.从缓存内存中刷新整个阵列,以确保该阵列没有被缓存。

2.调用受害者函数,该函数根据秘密的值访问其中一个数组元素。此操作将导致高速缓存相应的数组元素。

3.重新加载整个数组,并测量重新加载每个元素所需的时间。如果一个特定元素的加载时间快,很可能元素已经在缓存中。该元素必须是受害者函数所访问的元素。因此,我们可以弄清楚秘密值是什么。

程序设定了一个阈值,当时间小于这个阈值,说明被CPU缓存了,这时这个值肯定是调用victim函数的那个值,可以把该值读取出来。

使用gcc -march=native -o FlushReload FlushReload.c编译,得到the secret = 94

三、Task 3: Out-of-Order Execution and Branch Prediction

该任务的目的是了解cpu中的无序执行情况。在这个任务中,我们使用一个实验来观察无序执行所造成的影响。

对于cpu执行投机性执行,它们应该能够预测如果条件的结果。cpu记录过去所采取的分支,然后使用这些过去的结果来预测在投机执行中应该采取哪个分支。因此,如果我们希望在投机执行中使用一个特定的分支,我们应该训练CPU,这样我们所选择的分支就可以成为预测结果。训练在从第➂行开始的循环中完成。在循环中,我们用一个小的参数(从0到9)调用受害者()。这些值小于值大小,因此始终取行➀中的if条件的真分支。这是训练阶段,它本质上训练CPU期望如果条件成为真。

一旦CPU被训练,我们将一个更大的值(97)传递给受害者()函数(Line➄)。这个值大于大小,因此受害者()内部的if条件的假分支将在实际执行中获取,而不是真分支。但是,我们已经从内存中刷新了变量大小,因此从内存中获取其值可能需要一段时间。这是CPU将做出预测,并开始投机执行的时候。

用gcc -march=native -o SpectreExperiment SpectreExperiment.c

编译,得到the secret = 97

注释掉语句_mm_clflush(&size);重新执行,发现无法找出秘密值;

不注释语句_mm_clflush(&size);victim(i)改成victim(i+20),同样无法找出秘密值,因为CPU训练成不执行分支了。

四、Task 4: The Spectre Attack

当在浏览器中打开来自不同服务器的网页时,它们通常会在相同的过程中打开。在浏览器内实现的沙箱将为这些页面提供一个孤立的环境,因此一个页面将无法访问另一个页面的数据。大多数软件保护都依赖于条件检查来决定是否应该授予访问权限。通过Spectre攻击,我们可以让cpu执行(无序地)一个受保护的代码分支,即使条件检查失败,也基本上击败了访问检查。

在这种设置中,有两种类型的区域:限制区域和非限制区域。该限制是通过在下面描述的沙箱函数中实现的如果条件来实现的。沙箱函数仅当x位于缓冲区的下界之间,则返回用户提供的x值的缓冲区[x]值[x]。因此,此沙箱函数永远不会向用户返回限制区域内的任何内容。

用gcc -march=native -o SpectreAttack SpectreAttack.c

编译,得到the secret。该程序运行第一次失败后面成功。

五、Task 5: Improve the Attack Accuracy

我们基本上使用了一种统计技术。这个想法是创建一个大小为256的分数数组,每个可能的秘密值都有一个元素。然后,我们会多次进行攻击。每次,如果我们的攻击程序说k是秘密(这个结果可能是假的),我们加k。在多次攻击后,我们使用得分最高的值k作为对秘密的最终估计。这将产生一个比基于一次运行更可靠的估计。、

用gcc -march=native -o SpectreAttackImproved SpectreAttackImproved.c编译,运行后失败了很多次,尝试多次后得到一次成功拿到secret值。

将usleep(10)改成usleep(100),发现成功率提高很多基本每次都成功。

六、Task 6: Steal the Entire Secret String

使用幽灵攻击打印出整个字符串。

用gcc -march=native -o EntireSecret EntireSecret.c编译,

当usleep(10),得到结果如下,输出部分字符串:

当usleep(30),得到结果如下,输出全部字符串:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。