一种残膜回收机防缠绕挑膜装置的制 一种秧草收获机用电力驱动行走机构

BranchScope及其编译器防护方法的验证方法与流程

2021-12-08 00:25:00 来源:中国专利 TAG:

branchscope及其编译器防护方法的验证方法
技术领域
1.本发明属于软件工程技术领域,具体涉及一种branchscope及其编译器防护方法的验证方法。


背景技术:

2.当前计算机互联网已成为人们在日常生产生活中必不可少的部分,并且对计算机的依赖度逐渐增加,cpu的性能成为大众眼中评判计算机好坏的关键。
3.分支预测单元(branch prediction unit,bpu)是现代cpu中一个重要的性能优化组件。主要作用是预测程序的执行路径,并指导处理器投机预先执行该预测路径,如果最终发现该预测是正确的,处理器会继续沿着当前的路径继续执行,缩短了处理器的译码时间;反之会将当前的流水线刷新,从预测出错的位置重新执行。bpu的功能可以缩短了处理器等待译码器译码的时间,进而提升cpu整体性能。
4.处理器厂商不断改进升级架构,为人们带来高速运行的cpu的同时也埋下了许多安全隐患:2015年,blackhat会议上,由domas christopher公开了一项memory sinkhole的漏洞,该漏洞可以利用可编程的中断控制器地址,重映射为特有地址的特性,可以将权限从ring

0提升至ring

2;2018年meltdown和spectre漏洞利用了测信道的探测方式,使得普通权限用户读取计算机中所有的内存信息,导致私密信息泄漏并威胁到云平台上的用户信息安全。2018年,evtyushkin d等人发表了一种branchscope漏洞,并说明了这个漏洞的原理(参见【evtyushkin d,riley r,cse n,et al.branchscope:a new side

channel attack on directional branch predictor[c]//twenty

third international conference.2018】),然而,目前,针对branchscope还没有提出过相应的poc(proof of concept,概念验证)实现方法和防护技术,仅仅是提到了可以使用mov指令替代条件跳转语句。
[0005]
目前常用的计算机处理器漏洞的防护方法,主要包括如下几个方面:
[0006]
1)操作系统级更新,通过windows安全更新或者linux内核补丁等方式,在软件层面对不同的cpu漏洞进行补丁修复;
[0007]
2)应用程序级更新,在操作系统中添加修复的后台应用,或者使用防护型编译器编译源代码,避免生成具有漏洞特征的代码片段。
[0008]
3)硬件层更新,通过在cpu硬件层上添加修改新特性,从而在测信道、cache、bpu等架构层级进行防护,从根本上杜绝漏洞引起的隐私数据的泄漏。一般情况下,这种修复方式需要更换最新款的处理器,通常花费较高不易大规模应用。
[0009]
编译器在安全领域的应用广泛,常作为自动化分析和转换工具以及针对性的增强安全特性。在安全领域的主要应用是:代码复用攻击、代码注入攻击、可信编译器以及作为自动化分析和转换安全增强工具,常用的防御手段有:编译随机化、添加检查代码、权限隔离、控制流完整性保护、边界检查等。
[0010]
因此,针对现代处理器的bpu特性以及branchscope攻击的特点,急需提供一种实
现branchscope的poc(proof of concept,概念验证)的实现方法,同时需要一种根据攻击特点使用gcc编译器进行防护的方法。


技术实现要素:

[0011]
本发明的目的在于提供一种branchscope及其编译器防护方法的验证方法,以成功将bpu刷新到一级预测器的st状态,使得branchscope的poc验证方便快捷并且正确率高。
[0012]
为了实现上述目的,本发明提供一种branchscope的验证方法,包括:
[0013]
s1:生成随机跳转指令片段,生成的随机跳转指令片段用于使得分支预测单元的状态初始化为一级预测器的st状态;
[0014]
s2:预先在第一用户程序中嵌入所述步骤s1中的随机跳转指令,将第一用户程序和第二用户程序这两个不同的用户程序通过taskset命令绑定在主机的cpu上同一物理核上运行,在此过程中利用第一用户程序探测分支预测单元的状态,进而推测出第二用户程序中的隐私数据信息。
[0015]
所述步骤s1包括:
[0016]
s11:通过使用随机函数随机生成大量数值,根据每一个数值的奇偶性质确定一个固定的长度位数的01数组的序列,其中数字1表示跳转,数字0表示不跳转,最终转换为一串具有多个随机的条件跳转语句的当前的汇编代码片段;
[0017]
s12:利用同一汇编代码片段对所述分支预测单元进行训练的训练结果,根据一级预测器的bimodel特征验证分支预测单元的状态是否为st;
[0018]
s13:根据验证结果,回到步骤s11或者将当前的汇编代码片段作为最终生成的随机跳转指令片段。
[0019]
在所述步骤s11中,所述01数组的长度位数是10万。
[0020]
在所述步骤s13中,根据验证结果,如果验证结果为不通过,则回到所述步骤s11;否则,将当前的汇编代码片段作为最终生成的随机跳转指令片段。
[0021]
在所述步骤s12中,所述训练结果为经过所述汇编代码片段训练的分支预测单元;
[0022]
所述步骤s12包括:
[0023]
s121:利用所述训练结果执行两次必跳转的条件跳转指令,并且查看分支预测单元的预测结果;
[0024]
s122:利用所述训练结果执行两次必不跳转的条件跳转指令,并且查看分支预测单元的预测结果;
[0025]
s123:将所述步骤s121和步骤s122重复多次并统计,根据统计结果确定验证结果是否通过;
[0026]
在所述步骤s123中,若统计结果为每次步骤s121查看的分支预测单元的预测结果均为两次正确,每次步骤s122查看的分支预测单元的预测结果均为两次错误,则验证结果通过;否则,验证结果为不通过。
[0027]
所述步骤s2包括:
[0028]
s21:在第一用户程序a的源代码中嵌入所述步骤s1中的随机跳转指令和branchscope程序的源代码;
[0029]
s22:查看第一用户程序a和第二用户程序b的条件跳转语句的地址,通过在源代码
中添加填充指令的方式对齐第一用户程序a和第二用户程序b的条件跳转语句所在的地址的后30位;随后,分别利用编译器对第一用户程序a和第二用户程序b的源代码进行编译得到第一用户程序a和第二用户程序b这两个不同的用户程序;
[0030]
s23:在物理核上启动第一用户程序并执行所述随机跳转指令,等待第二用户程序启动;
[0031]
s24:在同一物理核上启动第二用户程序,利用第二用户程序自动执行多个条件跳转语句,并且根据各个条件跳转语句的跳转方向输出执行的条件跳转语句的跳转方向所组成的数值序列;同时,第一用户程序基于branchscope程序探测第二用户程序所执行的各个条件跳转语句的跳转方向作为探测结果,随后输出该探测结果。
[0032]
在所述步骤s22中,所述第一用户程序a和第二用户程序b利用一gcc编译器编译得到。
[0033]
在branchscope程序中,第一用户程序a通过判断条件跳转语句的执行时间的长短来推测出bpu在预测当前地址的条件跳转语句时的预测结果,该执行时间对应于性能监控计数器统计的时钟周期数。
[0034]
另一方面,本发明提供一种branchscope的编译器防护方法的验证方法,包括:
[0035]
s1’:执行根据上文所述的branchscope的验证方法;
[0036]
s2’:获取带有防护机制的编译器,并利用带有防护机制的编译器重复所述branchscope的验证方法的步骤s2,从而验证探测结果是否正确。
[0037]
在所述步骤s2’中,获取带有防护机制的编译器,包括:
[0038]
b1:在编译器的编译选项内添加防护功能使能标识和确定防护代码位置的防护编译选项,并且制定变量作为防护代码位置的输入参数;
[0039]
b2:将编译器设置为根据防护编译选项,在相应的防护代码位置处的源代码由gimple格式在转换成rtl语言的过程中,添加随机数量的无关语句,使得所述编译器在使用时所述防护代码位置处的条件跳转语句的地址能够进行随机的增加;
[0040]
b3:进行编译器的工程编译,以生成具有防护功能的新的编译器,以及打包生成发布版本;
[0041]
其中,所述步骤b2包括:
[0042]
b21:根据防护编译选项来确定防护代码位置,进而判断当前的条件跳转语句是否需要进行branchscope保护;
[0043]
b22:根据判断结果,如果当前的条件跳转语句不需要进行branchscope保护,则生成条件跳转指令并继续正常编译流程,随后结束流程,将下一条件跳转语句作为当前的条件跳转语句并回到步骤b21,从而进入下一个gcc编译器中的ifcvt处理pass;否则,需继续执行如下步骤;
[0044]
b23:获取当前的指令周期级别的系统时间,将获取到的系统时间作为种子,生成随机数,根据随机数的数值生成序列个数,进而生成所述序列个数的无关指令的序列;
[0045]
b24:将步骤b23生成的无关指令的序列插入到当前的条件跳转语句之前。
[0046]
本发明的branchscope的验证方法通过随机构建跳转序列的方法,利用程序自动生成不同的随机跳转指令序列,并且通过量化的方式更够更加高效快捷的找到可用的随机指令序列,可以成功将bpu刷新到bimode模式的st状态,使得branchscope的poc的实现方式
方便快捷并且正确率高。此外,本发明利用bpu特性以及处理器内部性能计数器pmc寄存器的相关数值,推测bpu预测结果,从而完成branchscope的poc实现,在bpu探测阶段,通过不断测试bpu状态,可以将探测准确率稳定在99.9%,本发明的验证方法的稳定性以及准确性很高,在探测验证以及处理器漏洞研究方面具有很大的价值。
[0047]
另外,本发明的branchscope的编译器防护方法的验证方法还通过使用编译器防护的方式,可以从软件层面对branchscope进行防护,并且对其进行验证。具体来说,本发明的branchscope的编译器防护方法的验证方法通过添加随机数量的无关语句,从而利用branchscope漏洞的原理,从根本上降低了恶意进行通过动态编译的方式进行逻辑地址对齐的操作,从而有效的防护了用户进程的私密数据,与其他层面的防护相比,不需要进行升级内核或者系统更新,以及更换cpu硬件设备,极大的降低了在防护方面付出的人工以及资金成本,并且提升了用户程序在使用过程中的安全性。
附图说明
[0048]
图1是根据本发明的一个实施例的branchscope的验证方法的流程图。
[0049]
图2是本发明的branchscope的验证方法的步骤s123的统计结果的矩阵图。
[0050]
图3a

图3b是第二用户程序b和第一用户程序a的跳转结果比较图,其中,图3a示出了第二用户程序b的所执行的条件跳转语句的数值序列,图3b示出了第一用户程序a输出的探测结果。
[0051]
图4是本发明的本发明的branchscope的编译器防护方法的验证方法在获取带有防护机制的编译器时的流程图。
[0052]
图5a

图5d是4次不同的编译的汇编代码的反汇编结果图。
[0053]
图6a

图6b是防护之后的第二用户程序b和第一用户程序a的跳转结果比较图,其中,图6a示出了第二用户程序b的所执行的条件跳转语句的数值序列,图6b示出了第一用户程序a输出的探测结果。
具体实施方式
[0054]
以下结合具体实施例,对本发明做进一步说明。应理解,以下实施例仅用于说明本发明而非用于限制本发明的范围。
[0055]
实施例一branchscope的验证方法
[0056]
如图1所示为根据本发明的一个实施例的branchscope的验证方法,该验证方法为一个poc实现方法。如图1所示,所述branchscope的验证方法包括以下步骤:
[0057]
步骤s1:生成随机跳转指令片段,生成的随机跳转指令片段用于使得分支预测单元(bpu)的状态初始化为一级预测器的st状态;
[0058]
由此,本发明通过不断随机生成不同方向上的随机跳转指令,可以将装有linxu主机的bpu转换为初始状态,继而在后续的bpu预测时使用一级预测器,使得branchscope漏洞可以利用一级预测器的固定逻辑进行隐私数据信息的探测。
[0059]
其中,所述步骤s1在装有linux的主机上通过运行训练文件来执行。
[0060]
所述步骤s1包括:
[0061]
步骤s11:通过使用随机函数随机生成大量数值,根据每一个数值的奇偶性质确定
一个固定的长度位数的01数组(即数组的每一位都是0或者1)的序列,其中数字1表示跳转,数字0表示不跳转,最终转换为一串具有多个随机的条件跳转语句的当前的汇编代码片段;
[0062]
具体来说,通过获取随机种子并使用随机函数随机生成10万个数值。在本实施例中,所述01数组的长度位数是10万,因此,当前的汇编代码片段所具有的随机的条件跳转语句的数量也是10万。
[0063]
步骤s12:利用同一汇编代码片段对所述分支预测单元(bpu)进行训练的训练结果,根据一级预测器的bimodel特征验证分支预测单元的状态是否为st;
[0064]
步骤s13:根据验证结果,回到步骤s11或者将当前的汇编代码片段作为最终生成的随机跳转指令片段。由此,找到一个能够使得bpu稳定并且位于st的状态的随机跳转指令片段。
[0065]
在所述步骤s13中,根据验证结果,如果验证结果为不通过,则回到所述步骤s11,以重复步骤s11和步骤s12,从而直接对所述分支预测单元继续进行训练;反之,则说明找到了使得bpu稳定并且位于st的状态的随机跳转指令片段,将当前的汇编代码片段作为最终生成的随机跳转指令片段。这是因为,如果验证结果为不通过,说明当前bpu状态处于已给非st状态,那么直接回到步骤s11以重新利用汇编代码片段对所述分支预测单元进行训练刷新即可,汇编代码片段的10w个跳转的目的就是通过大量无序的跳转将bpu训练到st状态。
[0066]
在主机执行了不同的随机跳转指令之后,此时bpu的状态是未知的,需要通过大量的实验进行验证此时bpu的预测功能是否是使用一级预测器,并且需要确保此时一级预测器的状态也在初始状态下。因此,步骤s1的目的是在于找到一组10w个跳转的汇编代码片段,可以将bpu的状态稳定地置于st状态,因此步骤s11和步骤s12会一直重复,直到得到一组可以稳定地将bpu置为st的指令序列,得到之后就不需要再进行尝试,而是可以在s2过程中直接使用该汇编代码片段作为随机跳转指令片段。
[0067]
在所述步骤s12中,所述训练结果为经过所述汇编代码片段训练的分支预测单元(bpu)。所述训练的目的是找到经过训练的分支预测单元退回到一级预测器(即双模态预测器)的汇编代码片段。
[0068]
所述步骤s12具体包括:
[0069]
步骤s121:利用所述训练结果执行两次必跳转的条件跳转指令,并且查看分支预测单元的预测结果;
[0070]
在所述步骤s121中,所述训练结果是通过同一汇编代码片段对所述分支预测单元进行新的一次训练来得到的。
[0071]
其中,必跳转的分支指令可以是任意类型的,比如说cmp 0x0,eax je lable1(eax是0)。
[0072]
执行两次必跳转的条件跳转指令的目的就是要验证分支预测单元经过训练之后的状态是否是st,具体来说,执行两次必跳转的条件跳转指令,并且查看分支预测单元的预测结果,预测结果为两次正确则说明此时bpu的状态位于一级预测器的st(强选择)或wt(弱选择),对错各一次说明状态为wn(弱不选择),两次错说明状态为sn(强不选择)。
[0073]
步骤s122:利用所述训练结果执行两次必不跳转的条件跳转指令,并且查看分支预测单元的预测结果;
[0074]
在所述步骤s122中,所述训练结果是通过同一汇编代码片段对所述分支预测单元进行新的一次训练来得到的。
[0075]
其中,必不跳转的条件跳转指令是可以是任意类型的,比如说cmp 0x0,eax je lable1(eax是1)。
[0076]
执行两次必不跳转的条件跳转指令的目的是验证分支预测单元经过训练之后的状态是否是st,具体来说,执行两次必不跳转的条件跳转指令,并且查看分支预测单元的预测结果,若两次预测结果正确则说明此时bpu的状态位于一级预测器的sn或者wn,对错各一次则说明状态为wt,预测结果为两次错误说明状态为st。
[0077]
步骤s123:将所述步骤s121和步骤s122重复500次并统计,根据统计结果确定验证结果是否通过。
[0078]
执行所述步骤s123的原因是将bpu置为st的这个状态需要是稳定的,不能执行完这个汇编代码片段之后,有的时候是st,有的时候是其他的状态,因此需要多次测试,并且每次都能够置st才可以使用。
[0079]
在所述步骤s123中,若统计结果为每次步骤s121查看的分支预测单元的预测结果均为两次正确,每次步骤s122查看的分支预测单元的预测结果均为两次错误,则说明bpu的状态位于一级预测器的st,验证结果通过;否则,验证结果为不通过。
[0080]
在本实施例中,统计结果为如图2所示的4
×
2矩阵。图2中的每一个4
×
2矩阵,分别代表一次验证,即代表对同一个汇编代码片段执行了500次训练的统计结果。不同的4
×
2矩阵,分别代表对不同的汇编代码片段所执行的500次重复和统计结果。图2中,hh表示预测结果两次正确,mm表示预测结果两次错误,hm、mh表示预测结果一次正确一次错误。因此,从矩阵中找到左上和右下对角线都是500的序列,矩阵的两列则分别表示步骤s121、步骤s122的预测结果。
[0081]
步骤s2:进行分支预测单元(bpu)的状态探测以及私密数据抓取;即,预先在第一用户程序中嵌入所述步骤s1中的随机跳转指令,将第一用户程序和第二用户程序这两个不同的用户程序通过taskset命令绑定在主机的cpu上同一物理核上运行,在此过程中利用第一用户程序探测分支预测单元的状态,进而推测出第二用户程序中的隐私数据信息。
[0082]
由于branchscope漏洞的实现是建立在相同物理核下,不同应用程序是共享同一bpu的前提下,因此需要将第一用户程序a以及第二用户程序b放置在相同的物理核上运行。
[0083]
通过步骤s1可以得到一个稳定的将分支预测单元的st状态初始化为一级预测器的st状态的随机跳转指令片段。因此,本发明在所述步骤s2中,通过预先将随机跳转指令片段插入到第一用户程序中,从而可以在执行第一用户程序中的随机跳转指令片段之后,将装有linxu主机的bpu状态转换为一级预测器的st状态,继而在后续的bpu预测时使用一级预测器,使得branchscope漏洞可以利用一级预测器的固定逻辑进行隐私数据信息的探测。
[0084]
所述步骤s2包括:
[0085]
步骤s21:在第一用户程序a的源代码中嵌入所述步骤s1中的随机跳转指令和branchscope程序的源代码;
[0086]
步骤s22:查看第一用户程序a和第二用户程序b的条件跳转语句的地址,通过在源代码中添加填充指令的方式对齐第一用户程序a和第二用户程序b的条件跳转语句所在的地址的后30位;随后,分别利用编译器对第一用户程序a和第二用户程序b的源代码进行编
译得到第一用户程序a和第二用户程序b这两个不同的用户程序;
[0087]
在所述步骤s22中,所述第一用户程序a和第二用户程序b利用gcc(gnu compiler collection,gnu编译器套件)编译器编译得到。
[0088]
由此,通过第一用户程序a和第二用户程序b之间的关系满足两者的条件跳转地址的后30位对齐,就可以使得第一用户程序a能够推测出第二用户程序b的跳转方向。这个与分支预测单元(bpu)的逻辑有关,branchscope生效的前提是第一用户程序a和第二用户程序b位于相同物理核上的不同逻辑核且两者共用分支预测单元的同一个模式历史表(pht),因此这样地址对齐的设置,可以使得逻辑核1的跳转方向在逻辑核2上可以探测到。
[0089]
步骤s23:在物理核上启动第一用户程序并执行所述所述随机跳转指令,等待第二用户程序启动;
[0090]
在本实施例中,在所述步骤s21中,将随机跳转指令嵌入所述第一用户程序的源代码中的randomize_pht函数里,并且在所述步骤s23中,通过执行该randomize_pht函数,以执行所述随机跳转指令,将bpu状态转换为一级预测器的st状态,等待第二用户程序启动。
[0091]
步骤s24:在同一物理核上启动第二用户程序,利用第二用户程序自动执行多个条件跳转语句,并且根据各个条件跳转语句的跳转方向输出执行的条件跳转语句的跳转方向所组成的数值序列;同时,第一用户程序基于branchscope程序探测第二用户程序所执行的各个条件跳转语句的跳转方向作为探测结果,随后输出该探测结果。该第一用户程序输出的探测结果就是用户程序b的隐私数据,可以供用户查看。
[0092]
其中,branchscope程序为现有技术,其通过对齐第一用户程序a和第二用户程序b的条件跳转语句所在的地址的后30位,来构造第一用户程序a与第二用户程序b的相同的模式历史表(pht)分支冲突,使得在bpu使用一级预测器(一级预测器仅使用pc来索引pht)时,能够推测出指定的pht分支上的跳转方向,从而获取第二用户程序b在程序执行过程中对应的分支路径的关键信息,得到第二用户程序b的隐私数据。
[0093]
由于bpu预测器的分支预测跳转结果会直接影响到在指定的pht分支上的条件跳转语句的执行时间,因此,在branchscope程序中,第一用户程序a通过判断条件跳转语句的执行时间的长短可以推测出bpu在预测当前地址的条件跳转语句时的预测结果,该执行时间由处理器的性能监控计数器(pmc)在时间统计时的相关操作得出,消耗的执行时间对应于性能监控计数器统计的时钟周期数。由于对于条件跳转语句来说,预测错误的条件跳转语句的执行时间大于预测正确的条件跳转语句的执行时间,因此通过设置一个时间阈值并判断执行时间的长短,可以确定预测当前地址的条件跳转语句时的预测结果是否正确,进而确定条件跳转语句的跳转方向。
[0094]
在本实施例中,以第二用户程序b自动执行321个条件跳转语句为例,第二用户程序b所执行的条件跳转语句的数值序列如图3a所示。第一用户程序a输出的探测结果如图3b所示。从实验结果看出,本发明的branchscope的poc实现方法通过生成随机跳转指令使得bpu初始化为一级预测器且对齐第一用户程序a和第二用户程序b的条件跳转语句所在的地址,从而在验证branchscope方面能够准确快速的检测出bpu的状态是否被正确检测;并且在没有防护方法的条件下,本发明的branchscope的poc实现方法能够使得第一用户程序a在用户权限状态下能够推测出第二用户程序b的分支跳转信息,推测准确率达到99.9%。
[0095]
实施例二branchscope的编译器防护方法的验证方法
[0096]
其中,本发明的branchscope的编译器防护方法的验证方法同样为一个poc实现方法,其基于以下原理:由于编译器在编译可执行文件的过程中,对源代码程序进行解析以及生成汇编代码,因此可以利用编译器的解析能力,有选择的在处理条件分支语句的过程中,加入无关代码片段,从而打乱编译生成的条件跳转语句的逻辑地址,从而起到防护branchscope的功能。条件跳转语句在程序中是一个常用的指令,因此如果对所有的条件跳转语句都进行防护,会增加编译时间以及生成可执行程序的大小,因此需要在编译器中添加与防护相关的选项,动态灵活的控制可以防护的条件分支跳转指令。
[0097]
因此本发明的branchscope的编译器防护方法的验证方法,其包括如下步骤:
[0098]
步骤s1’:执行根据上文所述的branchscope的验证方法;
[0099]
步骤s2’:获取带有防护机制的编译器,并利用带有防护机制的编译器重复所述branchscope的验证方法的步骤s2,从而确定探测结果是否正确。
[0100]
也就是说,所述步骤s1’包括:
[0101]
步骤s1:生成随机跳转指令片段,生成的随机跳转指令片段用于使得分支预测单元(bpu)的状态初始化为一级预测器的st状态;
[0102]
步骤s2:进行分支预测单元(bpu)的状态探测以及私密数据抓取;即,预先在第一用户程序中嵌入所述步骤s1中的随机跳转指令,将第一用户程序和第二用户程序这两个不同的用户程序通过taskset命令绑定在主机的cpu上同一物理核上运行,在此过程中利用第一用户程序探测分支预测单元的状态,进而推测出第二用户程序中的隐私数据信息。
[0103]
其中,所述步骤s2包括:
[0104]
步骤s21:在第一用户程序a的源代码中嵌入所述步骤s1中的随机跳转指令和branchscope程序的源代码;
[0105]
步骤s22:查看第一用户程序a和第二用户程序b的条件跳转语句的地址,通过在源代码中添加填充指令的方式对齐第一用户程序a和第二用户程序b的条件跳转语句所在的地址的后30位;随后,分别利用编译器对第一用户程序a和第二用户程序b的源代码进行编译得到第一用户程序a和第二用户程序b这两个不同的用户程序;
[0106]
步骤s23:在物理核上启动第一用户程序,等待第二用户程序启动;
[0107]
步骤s24:在同一物理核上启动第二用户程序,利用第二用户程序自动执行多个条件跳转语句,并且根据各个条件跳转语句的跳转方向输出执行的条件跳转语句的跳转方向所组成的数值序列;同时,第一用户程序基于branchscope程序探测第二用户程序所执行的各个条件跳转语句的跳转方向作为探测结果,随后输出该探测结果。
[0108]
也就是说,在步骤s2’中,重复所述branchscope的验证方法的步骤s2的步骤s22时,利用带有防护机制的编译器,来编译得到第一用户程序a和第二用户程序b这两个不同的用户程序。
[0109]
其中,使用编译器进行防护,需要随机改变条件跳转语句的虚拟地址,使得第一用户程序a以及在第二用户程序b程序在生成时条件跳转语句的地址产生随机的偏移,令第一用户程序a无法成功构造pht冲突,从而令其无法完成信息数据的探测过程。
[0110]
因此,如图4所示,在步骤s2’中,获取带有防护机制的编译器的具体步骤如下:
[0111]
步骤b1:在编译器的编译选项内添加防护功能使能标识和确定防护代码位置的防护编译选项,并且制定变量作为防护代码位置的输入参数;
[0112]
在本实施例中,编译器为gcc编译器,因此在所述步骤b1中,在gcc编译器的源代码中的./gcc/common.opt文件里加入fprotect

branch选项作为防护功能使能标识(即进行全局branchscope防护,防护代码位置为所有的条件跳转语句)的防护编译选项、加入fprotect

file选项作为确定防护代码位置(进行保护文件的branchscope防护)的防护编译选项,并且制定变量protect_file作为fprotect

file选项下防护代码位置的输入参数,用来传输需要保护的保护文件以及参数特征如行号。
[0113]
由此,使用编译器进行防护,可以选择全局条件跳转语句,也可以按照需求防护指定条件跳转语句,具有更加灵活的应用范围。
[0114]
在现有技术中,common.opt文件用于声明gcc编译器使用的所有的选项,因此本发明添加防护编译选项需要在这里声明。
[0115]
所述步骤b1中,为了加入fprotect

file选项作为防护编译选项,common.opt文件中的代码如下:
[0116]
fprotect

branch
[0117]
common report var(flag_protect_branch)optimization
[0118]
run predictive commoning optimization.(执行预测公共优化)
[0119]
fprotect

file=
[0120]
common joined rejectnegative var(protect_file)
[0121]
protect if away from branchscope.(保护if条件判断语句免受branchscope攻击)
[0122]
其中第一行“fprotect

branch”、第四行“fprotect

file”声明了为编译器添加的防护编译选项的名称,第二、五行声明了与该防护编译选项所对应的接收参数的变量名flag_protect_branch、protect_file,第三行、六行为解释说明。
[0123]
变量flag_protect_branch是一个bool类型的变量,用来表示是否进行全局branchscope防护,该fprotect

branch选项在之后使用时没有其他参数传入(即fprotect

branch选项的参数只有flag_protect_branch,且flag_protect_branch的值只有启用和不启用),使用时例如:
[0124]
./gcc

fprotect

branch test.c。
[0125]
变量protect_file是一个char数组类型的变量,用来传递防护代码位置(即需要保护的文件的文件名和参数特征),使用时,例如,保护test.c文件中44行的条件分支语句为:
[0126]
./gcc

fprotect

file=test.c:44test.c。
[0127]
步骤b2:将编译器设置为根据防护编译选项,在相应的防护代码位置处的源代码由gimple格式在转换成rtl语言的过程中,添加随机数量的无关语句,使得所述编译器在使用时防护代码位置处的条件跳转语句的地址能够进行随机的增加;
[0128]
此处,源代码是指步骤b2的第一用户程序a和第二用户程序b的源代码。
[0129]
需要说明的是,正如上文所述,使用编译器进行防护,可以选择全局条件跳转语句,也可以按照需求防护指定条件跳转语句,以针对单一文件或者当前编译的项目工程进行防护,防护的目标是可以选择的,因此在编译器使用时,可能仅仅通过防护编译选项指定第一用户程序a的源代码或者是第二用户程序b的源代码处于防护代码位置,或者是指定第
一用户程序a、第二用户程序b的源代码都处于防护代码位置。在本发明中,单独针对第一用户程序a、第一用户程序b或者ab两者都保护,都可以达到防护的目的。本发明的branchscope的编译器防护方法的验证方法,通过改变防护编译选项所指定的防护代码位置,可以比较不同的防护代码位置各自的防护效果。
[0130]
根据现有技术,源代码在使用gcc编译器的编译过程中,会进行多次符号转换,其中gcc编译器的expand处理流程是将源代码的gimple格式转换成rtl语言。因此,通过将添加随机数量的无关语句的具体的实现步骤所对应的文件保存在./gcc/cfgexpand.c中,来将编译器设置为根据防护编译选项,在防护代码位置处的源代码由gimple格式在转换成rtl语言的过程中添加随机数量的无关语句。
[0131]
由于第一用户程序a与第二用户程序b之间共享bpu预测以及跳转语句需要具有部分相同的虚拟地址(branchscope需要手动对齐来保证第一用户程序a与第二用户程序b具有部分相同的虚拟地址,从而实现私密数据抓取),因此通过对条件跳转语句的地址进行随机的增加,可以改变第二用户程序b的汇编代码地址,防止第一用户程序a对bpu的成功探测。
[0132]
所述步骤b2具体包括以下步骤:
[0133]
步骤b21:根据防护编译选项来确定防护代码位置,进而判断当前的条件跳转语句是否需要进行branchscope保护;
[0134]
步骤b22:根据判断结果,如果当前的条件跳转语句不需要进行branchscope保护,则生成条件跳转指令并继续正常编译流程,随后结束流程,将下一条件跳转语句作为当前的条件跳转语句并回到步骤b21,从而进入下一个gcc编译器中的ifcvt处理pass;否则,需继续执行如下步骤:
[0135]
步骤b23:获取当前的指令周期级别的系统时间,将获取到的系统时间作为种子,生成随机数,根据随机数的数值生成序列个数,进而生成所述序列个数的无关指令的序列;
[0136]
步骤b24:将步骤b23生成的无关指令的序列插入到当前的条件跳转语句之前。
[0137]
由此,生成的条件跳转指令与原本的条件跳转语句区别在于是否在条件跳转指令之前加入nop指令进行填充,条件跳转语句相比于原本的条件跳转语句,其地址经过随机改变。
[0138]
其中,无关指令就是对程序正常执行不产生影响的指令,所以根据程序语义来说,无关指令可以是nop指令或不会执行的指令。在本实施例中,无关指令为nop指令,因此,本发明可以通过添加nop指令,更改了分支语句的地址,使得branchscope的必要条件

地址对齐失效。
[0139]
步骤b3:进行编译器的工程编译,以生成具有防护功能的新的编译器,以及打包生成发布(release)版本。在本实施例中,编译器为gcc编译器。
[0140]
由此,本发明的branchscope的编译器防护方法的验证方法可以利用生成的新的编译器,验证防护功能是否完好。
[0141]
在步骤s21中利用步骤b3得到的新的编译器对第一用户程序a和第二用户程序b的源代码进行编译得到第一用户程序a和第二用户程序b这两个不同的用户程序时,通过objdump反汇编工具可以查看编译出的汇编代码的反汇编结果,可以查看到在指定的条件跳转语句所对应的汇编代码上,前面会有若干个nop指令,该nop指令的个数在每次编译成
功之后的可执行程序中各不相同,从而改变条件跳转语句的逻辑地址,阻碍branchscope漏洞执行过程中的地址对齐过程,破坏漏洞必备条件之一。如图5a

图5d所示为多次编译之后的汇编代码的反汇编结果,其中图5a

图5d分别示出了4次不同的编译的汇编代码的反汇编结果。图5a

图5d中右侧一列是指令名称,左侧一列是逻辑地址,即指令对应的机器码。由图5a

图5d可知,每一次编译之后,条件跳转语句的地址都会发生改变,这样另外一个用户程序(例如第一用户程序a)的进程无法进行地址对齐,由此实现了防护。
[0142]
由此,在本发明的branchscope的编译器防护方法的验证方法中,在步骤s22使用经过防护的编译器重新编译后,随后执行步骤s23、步骤s24,可以发现在程序执行过程中,在第二用户程序b执行完毕之后,第一用户程序a的推测地址出现大部分相同的推测结果且明显不对应于第二用户程序b,如图6a

图6b所示。从图6a

图6b的实验结果看出,通过修改gcc编译器之后得到的具有防护branchscope功能的编译器,可以很好的防护用户进程a中的分支跳转信息,使得用户进程b中的推测结果失效。
[0143]
以上所述的,仅为本发明的较佳实施例,并非用以限定本发明的范围,本发明的上述实施例还可以做出各种变化。凡是依据本发明申请的权利要求书及说明书内容所作的简单、等效变化与修饰,皆落入本发明专利的权利要求保护范围。本发明未详尽描述的均为常规技术内容。
再多了解一些

本文用于企业家、创业者技术爱好者查询,结果仅供参考。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

相关文献