【《Rowhammer攻击设计方案报告》5200字】_第1页
【《Rowhammer攻击设计方案报告》5200字】_第2页
【《Rowhammer攻击设计方案报告》5200字】_第3页
【《Rowhammer攻击设计方案报告》5200字】_第4页
【《Rowhammer攻击设计方案报告》5200字】_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Rowhammer攻击设计方案报告1Rowhammer攻击设计方案1.1概述本次实验设计方案是针对X86架构下的DRAM芯片Rowhammer漏洞攻击。图1.1设计方案流程图设计方案流程图如图1.1所示。该设计方案首先通过对物理内存映射关系的创建,以实现对DRAM芯片内同一独立内存阵列的不同行进行快速访问;其次对划分内存区域内进行赋值,全部赋值为1,方便Rowhammer攻击和比特翻转检测——对划分区域内的每一位进行逐位相加;比特翻转检测即在攻击后对每一位进行比对,如果发现某一位不是1则发生了比特翻转。然后在一个周期访问完成后进行比特翻转检测,同时输出发生错误的地址以达到检测Rowhammer漏洞的目的。主要包含四个部分:第一,创建映射关系方便快速访问;第二,对属于同一独立内存控制器的不同行进行快速多次访问读取;第三,每次循环完一个周期后,进行比特翻转检测并输出发生错误的行地址;第四,在本次检测Rowhamer漏洞的过程中引入了时间检测工具,能够清晰得对每个操作的时间进行检测。本次实验使用的芯片为:QuadCoreIntelCorei5-10210U;DRAM芯片为:三星M471A1K43DB1-CTD。1.2创建物理内存映射关系创建物理内存映射关系就是将一段用户空间的内存映射到内核空间。创建完成后,我对该段内存的操作就可以等同于对内核空间的操作,双方的变化会互相影响。当内核空间和用户之间需要进行大量数据操作时,使用mmap()函数会极大的提高效率。因此,本次对于国产信息设备的Rowhammer漏洞检测,便使用mmap()函数创建物理内存映射关系,提高攻击效率。使用mmap()函数创建好映射关系后,DRAM就可以像普通内存一样对映射的文件进行访问,不需要再调用read()、write()等函数进行操作[23]。需要注意的是,mmap()函数并不会对空间进行分配,只会将预设好大小的物理内存映射到进程中的空间地址内[23]。换而言之,通过mmap()函数写入数据时无法增加文件长度,因为映射大小在调用时就已经设置好了。图1.2mmap()函数映射图解如图1.2所示,进程中的空间地址被划分为多个虚拟内存区域。图中所示的正文,初始化数据段,零初始化数据段,堆,内存映射数据段和栈都是一个个相对独立的虚拟内存区域。参与物理内存映射指令的地址空间位于堆栈之间。如图1.3所示,在Linux中使用vm_area_struct结构来划分虚拟独立内存区域。每个不同性质的虚拟内存区域的功能和内部机制各不相同。所以,在一个进程内需要用多个vm_area_struct结构来区分不同性质的虚拟内存区域。每个vm_area_struct结构的虚拟内存区域用链表或者树形结构链接,方便快速访问。一个vm_area_struct结构由该区域的起始地址和终止地址,vm_pops指针以及其他信息构成。Mmap()函数就是要创建一个新的vm_area_struct结构。图1.3vm_area_struct结构代表不同的虚拟内存区域Mmap()函数的原型为:void*mmap(void*start,size_tlength,intprot,intflags,intfd,off_toffset);当mmap()函数执行成功后,会返回被映射区域的指针;反之,mmap()函数会返回MAP_FAILED(即:(void*)-1)[23]。当error被设为下表1.1中的某个值时,则意味着不同的情况。表1.1error被设为不同值的不同情况EACCES访问发生错误EAGAIN锁定文件或者内存EBADFFd无效EINVAL设置的参数无效ENFILE操作权限已经达到系统限制ENODEV指定文件与划分区域冲突ENOMEM内存小于数据EPERM操作权限不足ETXTBSY读文件等于写文件SIGSEGV探索操作,向权限为只读的区域执行写操作SIGBUS探索操作,对于进程之外的内存执行读操作原型函数内不同参数代表不同指令:(1)Start:表示完成映射关系创建的内存的起始地址。通常设为NULL,表示由系统内核指定该地址[23]。(2)Length:表示映射区域的大小。但是值得注意的是,mmap函数映射区域的大小必须与物理页大小呈整数倍关系[23]。(3)Prot:预设的内存权限标志。共有以下4种权限可供选择,可以单独选择某个权限,也可以使用or进行组合使用。但是不能与文件的打开模式发生矛盾。表1.2Prot各种指令的不同意义指令含义PROT_EXEC可被执行PROT_READ可被读取PROT_WRITE可被写入PROT_NONE不可访问(4)Flags:表示指定映射对象的类型,决定映射选项和映射页是否可以共享等[24]。共有以下10种可供选择,可以单独选择某个权限,也可以使用or进行组合。表1.3Flags各种指令的不同意义指令意义MAP_FIXED使用指定的映射地址MAP_SHARED共享映射,对映射区域的数据写入会复刻到文件内,同时运行其他映射这个文件的进程共享MAP_NORESERVE不保留交换空间MAP_PRIVATE私有映射,与MAP_SHARED相互矛盾,只能二选一。即:对进程的写入操作不会影响文件内的数据MAP_LOCKED锁定映射区域MAP_GROWSDOWN用于堆栈MAP_ANONYMOUS隐匿映射,映射区保持独立特性,不与其他文件产生联系MAP_32BIT64位X86架构下的专属指令,用于划分映射区域至指定地址。该指定地址位低2GBMAP_POPULATE以准备被读取的形式提供页表,以此有利于在映射时避免阻塞发生MAP_NONBLOCK同时执行MAP_POPULATE才能成功执行。只能对已经在内存里的页表创建入口Fd:文件描述符(6)Offset:映射偏移量。即写入数据的地址跟头地址之间的距离量。在实际操作中的应用为:伪代码1:创建物理内存映射Begin(算法开始)定义初始内存大小mem_size=1<<30定义函数内的不同参数(NULL,mem_size,PROT_READ|PROT_WRITE,MAP_ANON|MAP_PRIVATE,-1,0)调用mmap()函数End(算法结束)我首先划分需要映射的内存地址大小men_size为1Gb。同时,将划分的映射区域权限设定为可读可写的匿名私有映射,方便接下来快速攻击。在运行完mmap()函数后对其返回值进行检测,如果返回值不为MAP_FAILED,则创建成功,输出“物理内存映射关系创建成功”。进行快速攻击(1)定义取地址函数pick_addr()为了能够进行Rowhammer漏洞检测,需要对划分好的地址空间随机取地址。随机取地址函数伪代码如下。伪代码2:取地址函数Begin(算法开始)char*pick_addr()size_toffset=(rand()<<12)%mem_sizereturng_mem+offsetEnd(算法结束)首先申明pick_addr()的类型为char(整型数据);定义offest为size_t,方便后期的赋值和运算。我利用随机函数对划分好的映射区域内的地址进行取值,同时将划分区域的起始地址指针和随机取的区域的地址指针返回给pick_addr()。方便后期对地址进行准确调用。(2)初始化划分的区域在经过物理内存映射关系建立和定义好取地址函数后,还需要对划分区域初始化才能进行下一步工作。利用memset()函数对划分区域全部初始化为1。Memset()函数的原型是:void*memset(void*buffer,intc,intcount)其包含的三个参数的主要意义如下:buffer是指数组或者指针;c是指想要赋值的值;count为buffer的大小。具体理解为:以buffer为起点的后count位全部赋值为c。利用memset()函数可以对大块内存进行快速赋值。其具体操作为:memset(g_mem,0xff,mem_size);即:将创建物理映射关系时返回的起始地址g_mem作为buffer,0xff作为c,mem_size作为count。将划分区域初始化为1主要有两个好处:第一,方便快速读取数据,可以达到Rowhammer攻击的要求;第二,方便完成Rowhammer攻击后进行比特翻转检测。只需要将内存的数据相加可以检测出对否发生比特翻转,节省时间。(3)进行Rowhammer攻击做好了上述的准备工作后,利用for循环进行Rowhammer攻击。具体伪代码如下:伪代码3:快速Rowhammer攻击Begin(算法开始)toggles=540000;forj:=0to10{fora:=0to8{数组[a]=随机取地址内的数据}sum=0fori:=0to540000{fora:=0to8{sum+=[a]+1}fora:=0to8{asmvolatile("clflush(%0)"::"r"(addrs[a]):"memory")}}}End(算法结束)如流程图1.4所示,整个for循环进行10次迭代,每次大循环随机取8个地址,并将这8个地址内的数据赋值给一个8位数组。随后,将这8位数组进行多次逐位相加,并在每次相加以后清除缓存,保证下次相加时仍然从内存内读取数据。每次大循环后,对是否发生比特翻转进行检测,如果发生则立即停止攻击。反之,继续。图1.4Rowhammer攻击流程图1.4比特翻转检测完成10次大循环后的比特翻转检测相比于攻击时进行的比特翻转检测更加详细具体,不仅可以检测出是否发生了比特翻转,还能输出比特翻转发生的位置。图1.4比特翻转检测流程图比特翻转检测流程图如图1.4所示。首先定义了两个无符号64位整型指针,end指针代表划分内存区域的最终位置地址,ptr指针代表划分区域内的起始地址。比特翻转检测机制利用for循环将指针got从起始位置开始,一位一位取值与1进行对比。由于初始化划分内存时,已经将内存所有数据均设置为1。如果发生比特翻转就意味着该地址的数据会由1翻转为0。一旦发现存在0的地址就会提示错误,并且将该地址输出。具体伪代码如下:伪代码4:比特翻转检测end:=g_mem+mem_sizeforptr:=(uint64_t*)g_memtoend{uint64_tgot=*ptrif<got!=~(uint64_t)0>then{输出错误地址}}1.5时间检测工具时间检测工具主要使用gettimeofday()函数进行构造。gettimeofday()函数的原型为:intgettimeofday(structtimeval*tv,structtimezone*tz);这表明gettimeofday()函数以结构体的形式返回数值。这两个结构体分别为:structtimeval{longtv_sec;//秒longtv_usec;//微秒};structtimezone{inttz_minuteswest;//和greenwich时间查了多少分钟inttz_dsttime;//DST时间的修正方式}值得注意的是这两个数值均可设置为NULL,即不返回对应数值。利用gettimeofday()函数获取函数运行的开始时间和结束时间,具体运行时间为结束时间减去开始时间,并在不同的步骤下进行调用,以便知晓不同操作下的运行时间。具体可以知道每个地址集和十个地址集花费的时间,每次内存访问花费的时间,检查比特翻转花费的时间。

2实验结果与分析2.1实验结果在Linux终端运行代码,首先会输出“物理映射关系创建成功!”的提示语句,这代表mmap函数运行成功。随后再间隔数秒后会输出一组数据,包括迭代次数、每个地址集花费时间、10个地址集花费时间、每次内存地址访问消耗时间、每个地址在刷新周期内的访问次数、检查比特翻转花费时间。其中迭代次数由for循环提供数据,余下的时间由gettimeofday()函数提供数据。其中,内存访问次数=攻击次数*地址个数*单次攻击次数,单一地址集在一个刷新周期内的访问次数=DRAM刷新时间(转化单位)*攻击轮数*单轮攻击次数/总共花费时间。具体实验结果如图2.1和图2.2所示:图2.1刚开始运行图2.2迭代6678次后的结果2.2结果分析根据前六千余次迭代的数据可知,在前六千次的迭代攻击中每次内存访问的所花费是时间大概在22~30纳秒之间,每一次DRAM刷新周期内对单个地址的访问在120000~220000次之间,检查比特翻转花费的时间在0.1秒左右。但是在一定时间内,在映射区域内的地址中没有产生比特翻转。对代码进行分块检查。首先从实验结果进行观察,记录每一个指令的返回值是否正确。如表2.1所示。表2.1不同指令的判断指令返回值判断创建物理内存关系映射如果创建失败,由于在函数书写时加入了检测语句:assert(g_mem!=MAP_FAILED);不会返回该语句。所以,该指令运行成功。其他操作成功返回迭代次数、花费时间等信息,表明指令执行成功。在确定代码可执行后,更换DDR3DRAM芯片再次重复上述实验。第二次实验结果如下图2.3所示。在第588次Rowhammer攻击时攻击成功,成功使地址“0x7f9fcbf4c078”发生比特翻转,比特翻转结果位“0xffffffffffffbfff”。图2.3更换DRAM芯片后的实验结果实验结果表明,本文设计的Rowhammer攻击方案可以成功实现Rowhammer攻击。但是DRAM芯片对该攻击方案有一定影响,具体分析如下。2.2.1不同DRAM芯片受Rowhammer攻击影响不同收集谷歌安全团队及其他研究资料可画出不同年份生产的DRAM芯片受Rowhammer攻击的难易影响图。图中用不同形状、不同颜色的图案表示不同厂商在不同时间内生产的DRAM芯片。可以清楚地知道,容易受到Rowhammer攻击影响的DRAM芯片主要集中在2012-2014年之间。这主要与DRAM厂商在这两个特定的年份更换生产模具有关。2012年前后,各大生产厂商开始更换新的DRAM生产模具,由于新模具技术不成熟,此时生产的芯片容易受到Rowhammer攻击的影响。在新模具得到大规模商用,生产厂商在得到市场反馈后改进模具,在2014年后生产的DRAM芯片受Rowhammer攻击影响变弱。如图2.4所示。图2.4不同年份DRAM芯片受Rowhammer攻击难易程度第一次实验所用的DDR4DRAM芯片生产于2019年,第二次实验所用的DDR3DRAM芯片模具2013年生产的。2012和2013年生产的DRAM由于DRAM模型的更换和技术刚刚迭代,可以轻易触发Rowhammer漏洞,但是对于2014年以及之后生产的DRAM芯片由生产商进行了技术更迭使其更难触发Rowhammer漏洞。2.2.2刷新率对Rowhammer攻击的影响DDR4内存相较于DDR3内存提高了刷新频率,使得内存单元的刷新间隔变得更短。这就意味着,Rowhammer有效攻击变得更短,单一DRAM储存单元在一个刷新周期内受到的攻击次数相较于DDR3内存大幅减少,这可能会使得攻击行泄露的电量还没有达到使相邻行发生比特翻转的阈值时,DRAM芯片就已经完成了刷新操作,如表2.2所示。表2.2DDR3内存和DDR4内存的区别内存类型起始频率最高频率商用时间工作电压DDR3800Hz2133Hz2007年1.5VDDR42133Hz3200Hz2014年1.4V第一次实验的DDR4DRAM芯片比第二次实验的DDR3DRAM刷新时间缩短一倍。同理,在单位刷新时间间隔内,访问行被访问的次数也减少了一半。这使得实验设计的Rowhammer攻击方案难以达到预期效果。2.2.3ECC模块对Rowhammer攻击的影响ECC内存是DRAM芯片的一种软硬件防御措施——带有ECC内存的DRAM

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论