基于GPU三种共享内存的隐藏通道的实现方法与流程

文档序号:15144029发布日期:2018-08-10 20:13阅读:232来源:国知局
本发明属于gpu安全领域,具体涉及到利用gpu的sharedmemory(共享内存)、texturememory(纹理内存)以及tlb(转换旁置缓冲器)三类不同的共享内存实现隐藏通道,进行信息泄露的攻击方法。
背景技术
:近年来传统的图形硬件已经演化为可编程图形处理器(gpu),其强大的计算性能、灵活的可编程性以及面向个人消费市场的低廉价格,吸引了越来越多的研究者将gpu用在解决图形渲染之外的通用计算任务,其涉及的领域包括物理模拟、科学计算、信号处理、数据库操作等。从硬件角度,一个gpu主要由若干个sm组成,sm代表流多处理器(streammultiprocessor),它是gpu的计算核心。每个sm里面包含一些共享资源和执行单元,sm里面的执行单元可以访问一个共享的设备内存,比如sharedmemory、texturememory和tlb等。这些内存被所有的sm所共享,它们也用于cpu和gpu之间的数据传输。示意图如图1所示。从软件角度,运行在gpu上的cuda并行计算函数称为kernel函数,kernel以线程网格(grid)的形式组织,每个grid由若干个线程块(block)组成,每个block又由若干个线程组成,这些线程相互合作完成计算。实质上kernel是以block为单位加载到sm上运行的,各block间是并行执行的,block之间无法通信,也没有执行顺序。sharedmemory保存公用的计数器或者block的公用结果,是gpu的重要组成之一。物理上,每个sm包含一个当前正在执行的block中所有thread共享的低延迟的内存池。它使得同一个block中的thread能够相互合作,重用on-chip数据,并且能够显著减少kernel需要的globalmemory带宽。为了获得高带宽,sharedmemory一般被分成32个相等大小的内存块,它们可以被同时访问。它使用关键字shared添加到变量的声明中,这将使这个变量驻留在共享内存中。对于在gpu上启动的每个线程块,cudac编译器都将创建该变量的一个副本,线程块中的每一个线程都共享这块内存,但这个线程却无法看到也不能修改其他线程块的变量的副本。这就实现了一种非常好的方式,使得一个线程块中的多个线程能够在计算上进行通信和协作,而且,共享内存缓冲区驻留在物理gpu上,而不是驻留在gpu之外的系统内存中。texturememory主要存放的是纹理数据,在设备端是只读内存。纹理缓存是专门为那些在内存访问模式中存在大量空间局部性的图形应用程序而设计的。数据常以一维、二维或者三维数组的形式存储在显存中;纹理内存缓存在芯片上,因此在某些情况中,它能够减少对内存的请求并提供更高效的内存带宽。在kernel中访问纹理存储器的操作称为纹理拾取(texturefetching);通过纹理参照系约定二者的映射方式,纹理拾取使用的坐标与数据在显存中的位置可以不同;将显存中的数据与纹理参照系关联的操作,称为将数据与纹理绑定(texturebinding);显存中可以绑定到纹理的数据有:普通线性存储器和cuda数组;可以设定滤波模式,寻址模式等。与cpu一样,cuda也使用虚拟地址空间。gpu具有内存保护功能,所以cuda程序不可以随机地读取或破坏其他cuda程序的内存,也不可以访问还没有被内核模式驱动程序映射的内存。但是,gpu并不支持请求式调页,所以被cuda分配的每一字节虚拟内存都必须对应一个字节的物理内存。tlb被称为转换旁置缓冲器(translationlook-asidebuffer),位于globalmemory中,存放的就是最近转换的地址区间。隐藏通道可定义为系统中不受安全策略控制的、范围安全策略的信息泄露路径。通过在系统中的两个进程利用不受安全策略控制的而传递信息。简言之,就是发送和接收两个进程之间进行合作(用s代表发送进程,用r代表接收进程),在s进程获得了私密信息之后,巧妙地绕过系统的安全策略,将信息传递给r进程。与暴力入侵不同,因为隐藏通道是在安全模型的监控之下将保密信息外泄,所以更加难以发现和防御。在隐藏通道安全问题提出以来,各国的信息安全专家,以及计算机、数学通讯等当面的相关学者通过广泛地研究发现,隐藏通道在信息安全方面特别是信息的机性泄露方面具有很大的危害性。在计算机网络的飞速发展之际,隐藏通道问题更加引起各界的重视。正是由于充分认识到隐藏通道在机密信息泄露方面的危害性高,各国及各组织都把是否通过隐藏通道分析作为评估一个高等级安全系统的硬性指标。随着gpu的发展和广泛应用,又因为兴起时间短,在其安全领域的研究非常有限,这样就会使得这些应用领域遭受严重的安全威胁,其中最重要的一种威胁就来自隐藏通道。技术实现要素:首先对gpu的sharedmemory、texturememory和tlb做了分析比较。示意图如图2所示。选取这三类共享内存,是因为三者的容量具有梯度,在gpu中的位置具有代表性,其他与这三类相似的内存可以用同样的方法来实现完成。根据这三类各自的特性,分别用算法描述了隐藏通道的实现方式。另一方面,在不同的gpu型号下也对算法的正确性进行了验证。结果表明当今市场上的gpu在这一方面仍存在着安全漏洞。本发明提供了一种对gpu的三类内存进行隐藏通道攻击的方法,步骤如下:1.控制r,s进程的位置因为gpu上存在多个sm,所以要控制两个合作进程的位置。这样有两种情况,一种是两个进程在同一个sm中,另一种就是不在同一个sm。二者的区别就是进行秘密通信的共享内存的选择不同,一旦确定了这两个并发进程的位置,就可以展开接下来的通信。具体步骤如下:(1)确定位置。nvidia官方文档对并发进程的布局并未公开,因此需要通过其他方法来得知。首先读取每个block的smid,并确定每个sm的id号,然后调用clock()函数来测算出每个block的运行时间,当增加测算block的数量时,就会得到不同的结果,反复进行实验,得出第一个kernel的block主要是以轮询的方式进行分配。如果有闲置的sm,则第二个kernel运行,如果有剩余容量或者有sm被释放,则被分配。因此,每个kernel启动的block数量要大于等于sm的数量,这样才能保证两个进程被定位到同一个sm上,当启动的block数量小于sm数量的时候,就不属于同一个sm。(2)进程启动。两个进程是合作关系,在s进程发送信息之后,r进程需要准确接收,这就需要一种机制来控制二者的执行顺序,这里选择使用流技术。cuda流表示一个gpu操作队列,该队列中的操作以添加到流中的先后顺序依次执行。使用cuda流,首先要选择一个支持设备重叠(deviceoverlap)功能的设备,支持设备重叠功能的gpu能够在执行一个cuda核函数的同时,还能在主机和设备之间执行复制数据操作。之所以选择支持重叠功能的设备,是因为可以在一定程度上提升gpu程序的执行效率。一般情况下,cpu内存远大于gpu内存,对于数据量比较大的情况,不可能把cpu缓冲区中的数据一次性传输给gpu,需要分块传输,如果能够在分块传输的同时,gpu也在执行核函数运算,这样的异步操作,就用到设备的重叠功能,能够提高运算性能。2.获取共享内存的大小因为共享内存是此实验中两个进程之间通信的主要渠道,不同的gpu之间,或者同一gpu的不同共享内存之间,其大小是不同的。因此需要一种方法来得到它具体的参数。首先从所选的共享内存中载入不同大小的数组,这时候cache读取数组,再以多个恒定步幅的数组依次载入,因为新的数组载入后会产生缓存未命中。这样每次cache读取时都会产生一个延迟,在共享内存还有剩余容量的时候,这个延迟是呈规律递增的。当继续增加载入的数组,其延迟是一个恒定的常量时,表明内存已经没有剩余空间,此时载入的数组大小之和就是内存的总大小。因此可以根据通过载入数组观察延迟变化的方法,来得到共享内存的大小。3.通信方式在控制了r进程和s进程的位置,以及测得共享内存的大小之后,通信分别在sharedmemory、texturememory以及tlb上进行,以下针对这三种共享内存的通信方式依次进行分析。(1)sharedmemory当一个block开始执行时,gpu会分配一定数量的sharedmemory,它的地址空间会由block中的所有线程共享。在选择它作为共享内存的时候:●第一步:需要将s,r两个进程定位到同一个sm中,因为sharedmemory是私有的,只能允许同一个sm的线程访问。●第二步:因为s,r进程的执行顺序性,s进程首先在t1时间占用内存,主要做两件事,一是执行空操作,二是在每隔相同的一段时间载入一次数组。cache读取之后紧接着r进程在t2时间占用,r进程在占用的时候每次都载入一次数组,大小和s进程载入的相同。如果s进程在t1段时间执行空操作,而r进程在t2时间载入了数组,这时候缓存命中,表现出低延迟(用二进制0表示);如果s进程在t1时间载入数组,而r进程在t2时间也载入相同大小的数组,因为内容的不同,会导致缓存未命中,此时会产生很高的延迟(用二进制1表示)。这样就可以利用这种方法,s,r两个进程就可以合作将获取的数据通过0,1的形式传送出来。(2)texturememorygpu的最主流的作用之一就是图形渲染,而用于渲染的纹理都保存在纹理内存中。纹理内存与常量内存一样,是另一种类型的只读内存。纹理存储器提供了地址映射、数据滤波、缓存等功能,在特定的访问模式中,纹理内存能够提升性能。在基于纹理内存上实现隐藏通道的主要步骤如下:●第一步:声明两个纹理参照系,因为纹理存储器中的数据以一维、二维或者三维数组的形式存储在显存中,这里选用线性数组,声明两个线性数组并分配空间。●第二步:使用默认的运行时纹理参照系属性,然后将纹理与数组进行绑定,与纹理绑定的数据的类型必须与声明纹理参照系时的参数匹配。●第三步:定位两个进程的位置,再以固定步幅的方式增加数组的大小载入到纹理内存中,根据表现出的延迟变化进而测出纹理内存的大小。然后在r进程和s进程中分别调用进行纹理拾取,s进程在相同间隔的时间内选择载入数组或者执行空操作,r进程则一直进行载入数组的操作。在cache读取的时候,若二者都分别载入数组,因为数组内容不同,则会产出缓存未命中,表现出高延迟,用二进制1表示;若s进程什么都不做,则缓存命中,表现出低延迟,用二进制0表示。根据高低延迟的差异来判断传送的数据。最后进行纹理解绑,将延迟结果打印输出。(3)tlb位于gpu的globalmemory内,globalmemory中除了tlb之外还包含dram,l1和l2缓存。gpu使用页表存放虚拟地址与物理地址之间的映射关系。tlb作为页表的缓存,因其位置的特殊性以及存放数据的重要性,如果造成数据外泄,将对系统产生难以估量的负面影响。在对tlb做出详细的分析后,同样是采用r进程和s进程合作的方式来窃取数据。但因自身特殊性,在算法方面有诸多不同。主要步骤如下:●第一步:不同型号的gpu的tlb的层级不同,类比于cache,有一级、二级或者三级。因为不同层级的大小梯度明显,因此自定义几组不同的最大值,以0为初始值,在最大值里面以固定的步幅递增,使用载入数组的方法来得出该层级数下tlb的大小。●第二步:tlb的操作需要分两轮。第一轮运行tlb,第二轮才开始计时,以固定步幅的形式递增载入的数组。●第三步:在t1时间,s进程在k的控制下什么都不做或者载入数组,r进程在t2时间载入数组。在cache读取的时候根据缓存是否命中而产生延迟的高低来判断发送的内容,高延迟代表二进制1,低延迟代表二进制0。最后将延迟结果打印输出。附图说明图1:gpu存储器示意图图2:sharedmemory、texturememory以及tlb分析比较示意图具体实施方式本发明的开发环境主要是基于一台pc,测试环境是基于一台服务器。其中,服务器包含三个gpu,其基本配置如表1所示。表1开发环境与测试环境配置可通过cudasetdevice()来定位到不同的gpu上进行测试。以下是分别基于sharedmemory、texturememory以及tlb来实现隐藏通道的算法,并在最后给出一个实例说明。1.sharedmemory(1)算法描述算法输入:算法输出:k,l说明:k为控制s进程载入数组的间隔,l为得到的延迟。算法步骤:1)将两进程定位在同一个sm上;2)测量共享内存的大小以及设置步幅;3)利用流技术启动两个进程,初始化发送数据的组数,s进程在k的控制下执行空操作或者载入数组,r进程载入数组;4)将k与l打印输出,根据显示的延迟来判断s进程发送的信息。其伪代码如下:2.texturememory(1)算法描述算法输入:算法输出:k,l说明:k为控制s进程载入数组的间隔,l为得到的延迟。算法步骤:1)声明纹理参照系,并分配初始数组大小为size;2)确定是否在同一个sm上;3)初始化数组,并将数组与纹理绑定,同时设置步幅;4)利用流技术启动两个进程,初始化发送数据的组数,s进程在k的控制下什么都不做或者拾取纹理,r进程拾取纹理;5)释放数组,解除绑定。其伪代码如下:3.tlb(1)算法描述算法输入:算法输出:k,l说明:k为控制s进程载入数组的间隔,l为得到的延迟。算法步骤:1)以固定步幅的形式递增数组,并控制tlb的层级数;2)第一轮运行tlb;第二轮开始计时,载入数组测得tlb大小;3)利用流技术启动两个进程,初始化发送数据的组数,两个进程分别载入数组,s进程在k的控制下选择发送数据,r进程接收数据。其伪代码如下:4.实例说明以geforcegtx1070为例,基于sharedmemory实现隐藏通道,以下进行简单说明。1、首先确定发送者和接收者的位置。因为sharedmemory是sm中的私有内存,不能被其他sm所访问,因此每个kernel启动的block数量要大于等于sm的数量,这样才能保证两个进程被定位到同一个sm。对于geforcegtx1070,其sm数为15个,因此发送进程和接收进程启动的block数要大于等于15。2、自定义初始化数组大小为512bytes,并以48bytes为步幅。初始延迟为30clk,在继续多次载入数组之后,延迟稳定在84clk左右,选取第一次到达84clk延迟开始计算,求得载入数组的总和,即为sharedmemory的大小,结果为48kb。3、定义s进程在k为5的倍数下执行空操作,否则载入数组,r进程一直载入数组。根据缓存命中与否,来确定发送的数据内容。此处初始变量k为20,测得的l结果如表2所示。k1234567891011121314151617181920l8079768033818178793079807884357677818336表2发送数据实例如表2结果显示,高延迟为76-84clk,表示二进制1;低延迟为33-36clk,表示二进制0。该实例中发送的数据为11110111101111011110,也可以自定义变量k的约束条件来发送不同的数据。当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1