CN109829313B - 一种基于代码复用编程防御sgx侧信道攻击的方法及装置 - Google Patents
一种基于代码复用编程防御sgx侧信道攻击的方法及装置 Download PDFInfo
- Publication number
- CN109829313B CN109829313B CN201910152138.6A CN201910152138A CN109829313B CN 109829313 B CN109829313 B CN 109829313B CN 201910152138 A CN201910152138 A CN 201910152138A CN 109829313 B CN109829313 B CN 109829313B
- Authority
- CN
- China
- Prior art keywords
- instruction
- code base
- code
- node
- current
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Abstract
本发明提供一种基于代码复用编程防御SGX侧信道攻击的方法及装置。该方法包括:构建代码基,代码基包含与指令模板对应的多个指令序列,指令模板表示用于实现特定业务的指令流,每个指令序列尾部附有标志指令;根据指令流和代码基生成执行逻辑,执行逻辑表示连接代码基内各指令序列以实现特定业务的控制逻辑;根据执行逻辑从代码基中读取相应的指令序列,并将各指令序列连接起来,形成指令流以完成业务。该装置包括:指令模板模块、翻译引擎模块、代码基模块、执行逻辑模块和执行引擎模块。本发明提出一种代码复用编程思想,从而使SGX程序具有代码不变而控制流发生改变的特点,干扰SGX侧信道分析,极大提高SGX侧信道攻击的难度。
Description
技术领域
本发明涉及计算机操作系统技术领域,尤其涉及一种基于代码复用编程防御SGX侧信道攻击的方法及装置。
背景技术
在传统的SGX攻击方法中,攻击者需要往计算机系统内注入恶意代码,这使得只要检测计算机系统内出现的未知不明代码,就可以发现此类攻击。为此,攻击者提出代码复用攻击,代码复用攻击是指不需要在计算机系统注入恶意代码,而是利用计算机现有的代码,从中抽取少量特定的指令片段,通过某种手段将其“编织”在一起,从而使原来无害的代码变成攻击代码。这方面有代表性的是ROP攻击。具体来讲,ROP攻击所依赖的指令片段是指以ret指令为结尾的指令片段(英文称之为gadget),通过在现有代码中查找所需求的gadget,并且重新设置程序栈中的数据,从而多个gadget连接起来,进而实现执行特定系统调用等复杂的攻击目的。
实质上,侧信道攻击是指攻击者通过观测SGX程序执行过程,发现SGX程序数据流与控制流之间的关系,可以间接推断SGX程序数据。为了避免这种攻击,就必须打乱SGX程序数据流与控制流之间的关系。现在常采用的方法是控制流混乱技术。当SGX侧信道攻击出现时,研究人员希望通过控制流混乱技术,打乱软件控制流和数据流之间的关系。控制流混乱技术一般是在软件里添加一些无用的代码块、跳转分支等策略,使软件运行后呈现不同的控制流。这样固然可以打破软件控制流和数据流之间的关系,但是控制流混乱一般是在编译环节完成,对于防止SGX侧信道攻击效果有限。这是因为,这种控制流混乱相当于:程序开发者完成一份编码工作,可以编译生成多个可执行程序(这些可执行程序完成同样的功能)。不过,对于SGX侧信道攻击者而言,其攻击对象仍然是一个可执行程序,并没有从根本上解决这一问题。
但是,除了自修改程序,现有大多数程序一旦编译完成后,其指令就不允许修改。特别是SGX程序运行在一个不可信的操作系统之上,操作系统完全可以不允许其修改代码。如何在不修改SGX程序的前提下,仍然改变SGX程序的控制流,使SGX程序数据流与控制流不存在必然的联系,从而使上述侧信道攻击行为失效。这正是本发明要解决的问题。
发明内容
为解决现有技术中存在的上述问题,本发明提供一种基于代码复用编程防御SGX侧信道攻击的方法,提出一种代码复用编程思想,从而使SGX程序具有代码不变而控制流发生改变的特点,进而干扰SGX侧信道分析,极大提高SGX侧信道攻击的难度。
本发明提供一种基于代码复用编程防御SGX侧信道攻击的方法,该方法包括:
步骤1、判断是否已构建代码基,若是则执行步骤2,若否则构建代码基;其中,所述代码基包含与指令模板对应的多个指令序列,所述指令模板表示按照传统方式编程得到的用于实现特定业务的指令流,每个所述指令序列尾部均附有用于与其他所述指令序列进行连接的标志指令;
步骤2、根据所述指令流和所述代码基生成执行逻辑,所述执行逻辑表示连接代码基内各指令序列以实现所述特定业务的控制逻辑;
步骤3、根据所述执行逻辑从代码基中读取相应的指令序列,并将各指令序列连接起来,以完成所述特定业务。
进一步地,在步骤1之前还包括:
分析所述指令流,将所述指令流分解为多个指令片段。
进一步地,所述步骤1具体包括:
步骤1.1、构建空单链表;
步骤1.2、从指令模板中读取需要进入所述代码基的指令片段,并执行步骤1.2.1至步骤1.2.4:其中,所述步骤1.2.1至步骤1.2.4具体为:
步骤1.2.1、遍历单链表,判断所述单链表是否包含当前指令片段,若不包含则执行步骤1.2.2;反之则读取下一个指令片段;
步骤1.2.2、生成随机数random_1作为当前指令片段的副本数量,其中,n_min<random_1<n_max,n_min表示指令片段的副本数最小值,n_max表示指令片段的副本数最大值;
步骤1.2.3、所述单链表增加一个节点,所述节点包括:当前指令片段和当前指令片段的副本数量;
步骤1.2.4、重复步骤1.2.1至步骤1.2.3,直至所有指令片段处理完毕,则执行步骤1.3;
步骤1.3、初始化单链表节点数量为n和计步器k=0,并执行步骤1.3.1至步骤1.3.4:其中,所述步骤1.3.1至步骤1.3.4具体为:
步骤1.3.1、生成随机数x;
步骤1.3.2、以当前节点为起点,顺序遍历单链表,遍历一个节点计步长为1,确定单链表下一个待处理节点,所述下一个待处理节点为距离当前节点的步长为ki+1=ki+xmod n的节点,i为迭代次数;
步骤1.3.3、在所述待处理节点对应的指令片段尾部添加标志指令后形成指令序列并写入代码基,所述待处理节点对应的副本数量减1,若当前副本数量为0,则从单链表中删除所述待处理节点,且单链表节点数n减1;
步骤1.3.4、重复步骤1.3.1至步骤1.3.3,直至单链表为空表。。
进一步地,所述步骤2具体包括:
步骤2.1、读取指令模板中的指令片段;
步骤2.2、对每个指令片段执行步骤2.2.1至步骤2.2.6,其中,所述步骤2.2.1至步骤2.2.6具体为:
步骤2.2.1、生成随机数random_2;
步骤2.2.2、设置计数器j=random_2+seed,seed为设定的随机因子;
步骤2.2.3、在代码基当前位置查找目标指令序列;
步骤2.2.4、若查找到目标指令序列,则更新计数器ji+1=ji-1,i为迭代次数;
步骤2.2.5、若当前计数器j=0,则定位当前目标指令序列,输出执行逻辑;若当前计数器j>0,则查找下一个目标指令序列;
步骤2.2.6、重复步骤2.2.1至步骤2.2.5,直至指令模板中的所有指令片段均处理完毕,则执行步骤2.3;
步骤2.3、生成随机数作为下一次运行时的随机因子seed。
另一方面,本发明提供一种基于代码复用编程防御SGX侧信道攻击的装置,该装置包括:指令模板模块、翻译引擎模块、代码基模块、执行逻辑模块和执行引擎模块;
所述指令模板模块,用于存储指令模板,所述指令模板表示按照传统方式编程得到的用于实现特定业务的指令流;
所述翻译引擎模块,用于构建代码基,所述代码基包含与所述指令模板对应的多个指令序列,每个所述指令序列尾部均附有用于与其他所述指令序列进行连接的标志指令;以及根据所述指令流和所述代码基生成执行逻辑,所述执行逻辑表示连接代码基内各指令序列以实现所述特定业务的控制逻辑;
所述代码基模块,用于存储翻译引擎模块构建的代码基;
所述执行逻辑模块,用于存储翻译引擎模块生成的执行逻辑;
所述执行引擎模块,用于根据所述执行逻辑从代码基中读取相应的指令序列,并将各指令序列连接起来,以完成所述特定业务。
进一步地,所述翻译引擎模块还用于:
分析所述指令流,将所述指令流分解为多个指令片段。
进一步地,所述翻译引擎模块具体包括:
初始化单元,用于构建空单链表;
指令片段分析单元,用于从指令模板中读取需要进入所述代码基的指令片段,并执行步骤a1至步骤a4:其中,所述步骤a1至步骤a4具体为:
步骤a1、遍历单链表,判断所述单链表是否包含当前指令片段,若不包含则执行步骤a2;反之则读取下一个指令片段;
步骤a2、生成随机数random_1作为当前指令片段的副本数量,其中,n_min<random_1<n_max,n_min表示指令片段的副本数最小值,n_max表示指令片段的副本数最大值;
步骤a3、所述单链表增加一个节点,所述节点包括:当前指令片段和当前指令片段的副本数量;
步骤a4、重复步骤a1至步骤a3,直至所有指令片段处理完毕;
代码基生成单元,用于初始化单链表节点数量为n和计步器k=0,并执行步骤a5至步骤a8:其中,所述步骤a5至步骤a8具体为:
步骤a5、生成随机数x;
步骤a6、以当前节点为起点,顺序遍历单链表,遍历一个节点计步长为1,确定单链表下一个待处理节点,所述下一个待处理节点为距离当前节点的步长为ki+1=ki+x mod n的节点,i为迭代次数;
步骤a7、在所述待处理节点对应的指令片段尾部添加标志指令后形成指令序列并写入代码基,所述待处理节点对应的副本数量减1,若当前副本数量为0,则从单链表中删除所述待处理节点,且单链表节点数n减1;
步骤a8、重复步骤a5至步骤a7,直至单链表为空表。
进一步地,所述翻译引擎模块具体包括:
指令片段读取单元,用于读取指令模板中的指令片段;
执行逻辑生成单元,用于对每个指令片段执行步骤b1至步骤b6,其中,所述步骤b1至步骤b6具体为:
步骤b1、生成随机数random_2;
步骤b2、设置计数器j=random_2+seed,seed为设定的随机因子;
步骤b3、在代码基当前位置查找目标指令序列;
步骤b4、若查找到目标指令序列,则更新计数器ji+1=ji-1,i为迭代次数;
步骤b5、若当前计数器j=0,则定位当前目标指令序列,输出执行逻辑;若当前计数器j>0,则查找下一个目标指令序列;
步骤b6、重复步骤b1至步骤b5,直至指令模板中的所有指令片段均处理完毕;
随机因子生成单元,用于生成随机数作为下一次运行时的随机因子seed。
本发明的有益效果:
本发明提供的一种基于代码复用编程防御SGX侧信道攻击的方法及装置,通过基于代码复用编程的编程思想构建SGX程序,SGX程序本身提供一个由若干可用指令片段组成的代码基,影响软件控制流的关键数据在每次软件运行时可重新设置。这样,使得SGX程序每次运行所产生的控制流都不一样。SGX程序每次运行时,动态调整影响软件运行逻辑的数据集,使得软件每次运行所产生的控制流都不相同(仅有极小的概率会相同,可以忽略不计),真正做到一次运行一种控制流图,从而干扰SGX侧信道攻击分析,使侧信道攻击难度大大增加。
附图说明
图1为本发明实施例提供的一种基于代码复用编程防御SGX侧信道攻击的方法的流程示意图;
图2为本发明实施例提供的一种基于代码复用编程防御SGX侧信道攻击的方法的原理图之一;
图3为本发明实施例提供的一种基于代码复用编程防御SGX侧信道攻击的方法的原理图之二;
图4为本发明实施例提供的一种基于代码复用编程防御SGX侧信道攻击的装置的结构示意图;
图5为本发明实施例提供的翻译引擎模块的结构示意图之一;
图6为本发明实施例提供的翻译引擎模块的结构示意图之二。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
SGX:是Software Guard Extensions的缩写,Intel处理器一种硬件特性,用于增强软件的安全性。SGX并不是识别和隔离平台上的所有恶意软件,而是将合法软件的安全操作封装在一个enclave中,保护其不受恶意软件的攻击,特权或者非特权的软件都无法访问enclave。也就是说,一旦软件和数据位于enclave中,即便操作系统或者和VMM(Hypervisor)也无法影响enclave里面的代码和数据。
代码复用编程:本发明专有名词。其核心思想是通过在软件中构造大的代码基,动态调整控制软件逻辑的数据集,从而在不改变SGX程序代码的前提下,也可以改变软件控制流。
代码基:本发明中,是指可供复用的指令序列的集合。
指令模板:是指按传统方式编程得到的指令流。
执行逻辑:是翻译引擎理解指令模板内容后,确定连接代码基内各指令序列的控制逻辑。它是可以改变软件控制流的数据集合。
翻译引擎:其作用是对指令模板内的内容进行翻译,理解程序实现者需要处理执行的指令流,构建代码基;以及依托代码基构建执行逻辑。
执行引擎:在翻译引擎生成的执行逻辑的控制下,从代码基中读取相应的指令序列,并将其连接起来,形成完成业务的指令流。
自修改程序:指能够自我修改的代码,使程序在运行时自我修改。
攻击者通过观测SGX程序执行过程,发现SGX程序数据流与控制流之间的关系,可以间接推断SGX程序数据。为了避免这种攻击,就必须打乱SGX程序数据流与控制流之间的关系。除了自修改程序,现有大多数程序一旦编译完成后,其指令就不允许修改。特别是SGX程序运行在一个不可信的操作系统之上,操作系统完全可以不允许其修改代码。如何在不修改SGX程序的前提下,仍然改变SGX程序的控制流,使SGX程序数据流与控制流不存在必然的联系,从而使上述侧信道攻击行为失效。
如图1所示,本发明实施例提供的一种基于代码复用编程防御SGX侧信道攻击的方法包括以下步骤:
S101、判断是否已构建代码基,若是则执行步骤2,若否则构建代码基;其中,所述代码基包含与指令模板对应的多个指令序列,所述指令模板表示按照传统方式编程得到的用于实现特定业务的指令流,每个所述指令序列尾部均附有用于与其他所述指令序列进行连接的标志指令;
S102、根据所述指令流和所述代码基生成各指令序列之间的执行逻辑,所述执行逻辑表示连接代码基内各指令序列以实现所述特定业务的控制逻辑;
S103、根据所述执行逻辑从代码基中读取相应的指令序列,并将各指令序列连接起来,以完成所述特定业务;
具体地,如图2所示,与传统程序不同的是,采用代码复用编程的程序包含代码基。代码基包含若干可以被后续利用的指令序列。程序开发者所关注的重点是数据。程序开发者通过编写特定的数据,可以影响从代码基选取的指令序列,并将这些指令序列“编织”在一起,形成有意义的程序体。由于SGX程序所驻留操作系统往往会限制代码页不具有写权限,从而使SGX程序代码部分不可更改。采用代码复用编程的SGX程序,其代码基仍然是不变的,但是可以通过每次运行时动态修改被编程的数据,来改变“程序体”,从而使攻击者无法窥探SGX程序控制流和数据流之间的关系。
结合图3所示,假设已经有一份指令模板,可以合理的将该指令模板划分为四个相对独立的指令片段。代码复用编程者可以通过基于代码复用编程防御SGX侧信道攻击的装置(下称防御装置)构造一个代码基,其中就包含与该指令模板对应的多个指令序列,作为一种可实施方式,具体流程如下:
S201、程序设计人员按照传统方式编写指令模板,并将该指令模板存储在该防御装置中,所述指令模板用于完成目标功能。例如,如图3所示的软件指令。
S202、该防御装置分析该指令模板所表示的指令流,将所述指令流分解为多个指令片段。例如,如图3所示的一个软件指令被分为指令片段A、B、C和D。
S203、该防御装置判断是否需要构造代码基,该代码基中的每个指令序列尾部均附有标志指令。指令序列是指令片段添加标志指令后(例如在尾部添加结束指令,该结束指令即为标志指令)形成的。例如,如图3所示的代码基中的4个指令序列尾部均附有ret指令。
在步骤S202和S203中,在分拆指令流和构造代码基时,必须注意其合理性。例如:当指令片段已经为ret指令结束时,在将该指令片段进入代码基时就不必再附设新的ret指令,同时要明确原ret指令的作用(比如说返回某个地址),以便正确拼接指令片段。另外一种较为特殊的是循环结构的指令流:可以将整个循环结构作为一个指令片段,也可以将其进一步分拆,但是必须保证拼接后的可还原性。一般来讲,分拆后的指令片段越小,后续被复用的概率越大,但是分拆的难度也越大。
S204、该防御装置在理解指令流的功能后根据构建的代码基生成执行逻辑。例如,收集需要的指令序列的地址,按逆序压入栈中。图3所示的栈中从上至下依次存储有指令序列A、B、C和D的地址A、B、C和D。
S205、该防御装置根据所述执行逻辑形成指令流以完成业务。例如,修改程序主函数,确保执行触发ret指令,并进而触发指令序列A及后续指令序列(B、C、D)的执行,形成与所述指令流(即图3中的软件指令)功能相当的指令流,以完成业务。
本实施例中,标志指令为ret指令,即假设依赖ret指令来拼接各指令序列。这些指令序列均分散在代码基内,并不如传统软件那样集中在一起。为了保证执行时,这些分散的指令序列仍然可以以统一实体完成,必须采用某种手段将其“编织”在一起。本实施例以ret指令作为“编织”手段,要求每个指令序列尾部均附有ret指令,并按指令序列的执行顺序,逆序将每个指令序列的地址压入栈。这样,一旦执行到ret指令,就会从栈项依次读取指令序列的地址,并跳转到该地址执行,从而实现“物理的分散、逻辑的统一”。
由上述内容可知,通过将SGX程序划分为若干片段,并将其植入代码基,最后收集这些指令序列的地址,作为关键数据由软件执行时使用。当代码基存在多个指令序列时,那么在利用指令序列编写程序体时可以存在多种组合选择,使得最终程序的控制流与之前呈不同形态,也就使得攻击者无法从控制流窥探到SGX程序内部数据。
需要说明的是,“编织”指令序列的方法并不是只有ret这一种。本发明实施例借鉴ROP代码复用攻击中,以ret指令连接不同指令序列的方法。在实际应用中,本发明并不限定ret指令这一种编织方式。还可以存在其它“编织”方法。例如,针对JOP代码复用攻击,本发明可以利用jmp指令来连接指令序列。另外需要说明的是,不同“编织”方式会导致被编程的数据形式不一样。图2所示是以栈为载体,不排除其它手段。例如,还可以使用函数指针数组,或者使用堆。
本发明的目的在于软件控制流能够随机化,能够使软件一次运行就产生一种控制流。要实现软件控制流随机化,必须存在两个条件。首先,代码基应足够庞大。所谓代码基足够庞大,并不是说代码基的规模一定要超过某个数量规模,而是说代码基内应该包含对应指令片段的多个副本,使得每次拼接所使用的指令序列尽可能不同。当代码基内的副本数量越多,每次拼接可选的组合情况就越多,对攻击者侧信道分析就越不利。其次,翻译引擎应尽可能随机化选择指令序列,以确保指令序列拼接的情况尽可能不重样,从而使得每次运行所产生的控制流呈不同形态。也就是说,在生成代码基时,应该科学规划指令片段的副本数量和地址,以提高最终控制流混乱程度。
在上述各实施例的基础上,本发明实施例中的构建代码基的具体流程如下:
步骤A、构建空单链表;
步骤B、从指令模板中读取需要进入所述代码基的当前指令片段,并执行步骤B.1至步骤B.4:其中,所述步骤B.1至步骤B.4具体为:
步骤B.1、遍历单链表,判断所述单链表是否包含当前指令片段,若不包含则执行步骤B.2;反之则读取下一个指令片段;
步骤B.2、生成随机数random_1作为当前指令片段的副本数量,其中,n_min<random_1<n_max,n_min表示指令片段的副本数最小值,n_max表示指令片段的副本数最大值;
步骤B.3、所述单链表增加一个节点,所述节点包括:当前指令片段和当前指令片段的副本数量;
步骤B.4、重复步骤B.1至步骤B.3,直至所有指令片段处理完毕,则执行步骤C;
步骤C、初始化单链表节点数量为n和计步器k=0,并执行步骤C.1至步骤C.4:其中,所述步骤C.1至步骤C.4具体为:
步骤C.1、生成随机数x;
步骤C.2、以当前节点为起点,顺序遍历单链表,遍历一个节点计步长为1,确定单链表下一个待处理节点,所述下一个待处理节点为距离当前节点的步长为ki+1=ki+x modn的节点,i为迭代次数;
步骤C.3、在所述待处理节点对应的指令片段尾部添加标志指令后形成指令序列并写入代码基,所述待处理节点对应的副本数量减1,若当前副本数量为0,则从单链表中删除所述待处理节点,且单链表节点数n减1;
步骤C.4、重复步骤C.1至步骤C.3,直至单链表为空表。
在本实施例中,可采用SGX程序内部的随机数发生器生成随机数。采用步骤A至步骤C所述方式生成代码基,会导致代码基内存在一定的冗余指令序列。根据参数设置,代码基内至少应该包括n_min个指令片段的副本。换言之,代码基的指令数量至少增加了n_min倍。不过,这种设计是必不可少的,是为了支持后续控制流随机化的关键。事实上,当代码基的指令片段的副本数量越多,防御装置将存在多种选择来生成执行逻辑,后续控制流随机化的效果也越好。
当指令模板内的指令序列越来越多时,软件的整体指令数量也可能反而会减低,因为代码基内指令序列的复用率得到了提高。防御装置在将某指令片段写入代码基时,会查询当前代码基是否包含目标指令序列,如果代码基已经存在同样的指令序列,那么防御装置就不会向代码基内添加该指令片段。如此可以使代码基内的指令序列多次被复用。随着指令模板内的指令片段越来越多时,代码基内指令序列的复用率也会得到提高,代码基的规模就不会随着指令模板的增加而扩大。在某种程度上讲,基于代码复用编程有可能减少软件的体积。
在上述各实施例的基础上,本发明实施例中的生成执行逻辑的具体流程如下:
步骤D、读取指令模板中的指令片段;
步骤E、对每个指令片段执行步骤E.1至步骤E.6,其中,所述步骤E.1至步骤E.6具体为:
步骤E.1、生成随机数random_2;
步骤E.2、设置计数器j=random_2+seed,seed为设定的随机因子;
步骤E.3、在代码基当前位置查找目标指令序列;作为一种可实施方式,如果从代码基当前位置查找到代码基结束尚未查找到,则返回代码基头部重新继续查找;
步骤E.4、若查找到目标指令序列,则更新计数器ji+1=ji-1,i为迭代次数;
步骤E.5、若当前计数器j=0,则定位当前目标指令序列,输出执行逻辑;若当前计数器j>0,则查找下一个目标指令序列;
步骤E.6、重复步骤E.1至步骤E.5,直至指令模板中的所有指令片段均处理完毕,则执行步骤F;
步骤F、生成随机数作为下一次运行时的随机因子seed。
本发明实施例采用软件每次运行时,随机选择代码基内可用的指令序列,使得每次运行所使用的执行逻辑与之前运行所使用的执行逻辑不同,从而使得软件运行所产生的控制流也不尽相同。存在一定概率,软件两次运行所使用的执行逻辑是一样的。假设软件每次运行使用n个指令片段,每个指令片段在代码基有m个副本,那么两次运行所使用的执行逻辑相同的概率是:(1/m)n。从这个公式可以发现:只要每次运行的指令片段足够多,而且代码基的副本足够多,那么执行逻辑类同的概率将十分小。举例而言,假设n=10,m=4,那么类同的概率约为0.0000001,基本可以视为不会类同。
在本实施例中,可采用SGX程序内部的随机数发生器生成随机数。需要说明的是,SGX程序内部随机数发生器必须具备环境无关性。所谓环境无关性是指:SGX程序内部随机数发生器,在生成随机数时不依赖不可信操作系统的环境因素。一旦SGX程序内部随机数发生器,依赖外部环境因素,那么攻击者可以完全还原SGX程序执行环境,就可以让SGX程序按上一次控制流图重新执行。关于SGX程序内部随机数发生器,可以利用现有技术,本发明不作具体说明。
如图4所示,本发明实施例提供一种基于代码复用编程防御SGX侧信道攻击的装置,该装置包括:指令模板模块401、翻译引擎模块402、代码基模块403、执行逻辑模块404和执行引擎模块405;其中:
所述指令模板模块401用于存储指令模板,所述指令模板表示按照传统方式编程得到的用于实现特定业务的指令流;所述翻译引擎模块402用于构建代码基,所述代码基包含与所述指令模板对应的多个指令序列,每个所述指令序列尾部均附有用于与其他所述指令序列进行连接的标志指令;以及根据所述指令流和所述代码基生成执行逻辑,所述执行逻辑表示连接代码基内各指令序列以实现所述特定业务的控制逻辑;所述代码基模块403用于存储翻译引擎模块构建的代码基;所述执行逻辑模块404用于存储翻译引擎模块生成的执行逻辑;所述执行引擎模块405用于根据所述执行逻辑从代码基中读取相应的指令序列,并将各指令序列连接起来,以完成所述特定业务。
具体地,操作系统定义了可执行文件格式,例如ELF格式。这些文件格式一般把软件划分为代码区、数据区等。本发明实施例并不是要重新定义可执行文件格式,而是对代码区和数据区等软件内容进一步定义。例如:在传统的代码区内直接存放软件指令,但是本发明实施例要求在代码区内还需要存放代码基、翻译引擎、执行引擎等实体,以实现代码复用的目的。本发明实施例提供的防御装置,也称为一种基于代码复用编程防御SGX侧信道攻击的软件结构,实质是在传统可执行文件格式基础上,对软件内容进一步细化。
代码基是指可供复用的指令序列集合。指令模板是指按传统方式编程得到的指令流。翻译引擎的作用是对指令模板内的内容进行翻译,理解程序实现者需要处理执行的指令集合,构建代码基;以及依托代码基构建执行逻辑。执行逻辑是翻译引擎理解指令模板内容后,确定连接代码基内指令片段的控制逻辑,它是可以改变软件控制流的数据集合。执行引擎根据执行逻辑的控制,从代码基中读取相应的指令序列,并将其连接起来,形成完成业务的指令流。
在使用基于代码复用编程构建的软件前,需要初始化软件代码基。软件编译完成后,软件内部代码基为空。其构建过程如下:当翻译引擎检测到代码基为空时,翻译引擎开启代码基构建业务,根据指令模板各个指令片段,随机向代码基写入若干可复用的指令片段。为了避免代码段内所有与地址相关的操作数发生变动,可以预先在软件代码段内植入一个包含大量空指令的代码基。这样,翻译引擎就可以采用覆盖的方式,将指令片段写入代码基,而不必改变代码基的大小,从而不会影响指令操作数。初始化软件代码基,或者后续更新代码基,必须在允许代码可执行的操作系统内完成。
当将基于代码复用编程构建的软件部署到操作系统内后,用户按传统方式启动软件的运行:首先运行的实体是翻译引擎,它将读取指令模板,并查询代码基,生成执行逻辑;其次执行引擎开始执行,它在执行逻辑的引导下,“编织”代码基若干有用指指令序列,从而完成指定业务。通过控制翻译引擎生成执行逻辑的策略,可以生成每次运行所独有的执行逻辑,从而达到软件“一次运行产生一种控制流”的目的。
需要说明的是,本发明实施例提供的一种基于代码复用编程防御SGX侧信道攻击的装置是为了实现上述方法实施例的,其功能具体可参考上述方法实施例,此处不再赘述。
在上述实施例的基础上,所述翻译引擎模块还用于:分析所述指令流,将所述指令流分解为多个指令片段。
具体地,对于程序设计和实现者而言,首先需要按照传统方法那样构建完成指定业务的指令模板;其次需要确定指定片段分拆原则,构建能够支持软件运行的代码基;再次需要构建翻译引擎,以便根据指令模板的需求以及代码基的实际情况,输出执行逻辑;最后需要构建执行引擎,以便按照执行逻辑执行指令。对于程序设计和实现者,关键是构建指令模板,以便计算机理解什么样的指令序列能够满足目的。代码基可以根据需求缺失进行添加和完善,翻译引擎和执行引擎则可以一次编写、反复利用。
进一步说明指令模板。更具体而言,指令模板就是传统的指令片段集合。为了完成某个业务,传统的程序实现者编写相应的程序,编译生成可执行的指令流。指令模板包含多个需要代码复用改造的指令片段。换言之,基于代码复用编程方法是在传统代码编程方法的基础上,通过在软件中引入翻译引擎等实体,来实现代码复用的目的。在基于代码复用编程实现的软件中,指令模板内指令流不再是处理器执行的指令,其作用仅仅是引导后续指令序列“编织”的目标。它可以采用文件内容存储,或者直接以字符变量形式存储。
进一步说明代码基。代码基包含大量可用的指令序列。在代码复用攻击里,代码基往往包含很大范围内的若干软件,例如整个计算机系统内软件。然而,在本发明实施例所述的代码基,是在软件本身内部。当然,也可以将代码基的范围外扩到整个计算机系统,但是这没有必要,而且计算效率也会受到影响。本发明实施例所述的代码基,可以是以动态链接库嵌入到软件地址空间,或者直接是软件里某个函数内包含大量指令序列。编程者可以根据需要动态调整代码基的内容。
进一步说明翻译引擎。翻译引擎的主要功能有两个:生成执行逻辑和维护代码基。基于代码复用编程的软件在完成编译,生成可执行文件后,还需要经过发布操作。在发布操作中,翻译引擎读取、分析和解剖指令模板内的指令流,将其分解为多个可以再接拼接的指令片段,并在代码基内植入这些指令片段。在初始情况下,代码基可以很小,其可能并不包含翻译引擎需要定位的指令序列。为此,翻译引擎会动态添加代码基,扩大其包含的内容,以支持新的指令序列拼接。在查询、定位、扩充的过程中,翻译引擎生成执行逻辑,以便于后续指令序列拼接。在C语言程序中,翻译引擎可以就是主函数内一部分指令。
进一步说明执行逻辑。最终由处理器执行的指令是代码基内的指令,而非指令模板内的指令。不过,代码基内的指令序列是混杂在一起,没有规律可言。为了将代码基内的指令序列连接在一起,必须存在一种向导性的指引。执行逻辑就是用于完成这一目的。假设代码基内的指令序列都是以ret指令为结束,那么执行逻辑将包含一系列指令序列的首地址。将这些指令序列连接起来,就可以还原原有的程序逻辑。需要说明的是,执行逻辑是数据集,而非指令。
进一步说明执行引擎。执行引擎将根据执行逻辑,到代码基内查询和定位指定的指令序列,并将其拼接起来,形成完整的指令流。在C语言程序中,执行引擎可以就是主函数内一部分指令。在以ret指令为结束的指令序列拼接过程中,执行引擎就是连续若干个ret指令,通过不断提取执行逻辑所含的地址,完成业务逻辑。
作为一种可实施方式,如图5所示,翻译引擎模块402包括:初始化单元4021、指令片段分析单元4022和代码基生成单元4023。该翻译引擎模块402按照如下流程生成代码基:
初始化单元4021用于构建空单链表;
指令片段分析单元4022用于从指令模板中读取需要进入所述代码基的指令片段,并执行步骤a1至步骤a4:其中,所述步骤a1至步骤a4具体为:
步骤a1、遍历单链表,判断所述单链表是否包含当前指令片段,若不包含则执行步骤a2;反之则读取下一个指令片段;
步骤a2、生成随机数random_1作为当前指令片段的副本数量,其中,n_min<random_1<n_max,n_min表示指令片段的副本数最小值,n_max表示指令片段的副本数最大值;
步骤a3、所述单链表增加一个节点,所述节点包括:当前指令片段和当前指令片段的副本数量;
步骤a4、重复步骤a1至步骤a3,直至所有指令片段处理完毕;
代码基生成单元4023用于初始化单链表节点数量为n和计步器k=0,并执行步骤a5至步骤a8:其中,所述步骤a5至步骤a8具体为:
步骤a5、生成随机数x;
步骤a6、以当前节点为起点,顺序遍历单链表,遍历一个节点计步长为1,确定单链表下一个待处理节点,所述下一个待处理节点为距离当前节点的步长为ki+1=ki+x mod n的节点,i为迭代次数;
步骤a7、在所述待处理节点对应的指令片段尾部添加标志指令后形成指令序列并写入代码基,所述待处理节点对应的副本数量减1,若当前副本数量为0,则从单链表中删除所述待处理节点,且单链表节点数n减1;
步骤a8、重复步骤a5至步骤a7,直至单链表为空表。
作为一种可实施方式,如图6所示,所述翻译引擎模块402还包括指令序列读取单元4024、执行逻辑生成单元4025和随机因子生成单元4026。该翻译引擎模块402按照如下流程生成执行逻辑:
指令片段读取单元4024用于读取指令模板中的指令片段;
执行逻辑生成单元4025用于对每个指令片段执行步骤b1至步骤b6,其中,所述步骤b1至步骤b6具体为:
步骤b1、生成随机数random_2;
步骤b2、设置计数器j=random_2+seed,seed为设定的随机因子;
步骤b3、在代码基当前位置查找目标指令序列;
步骤b4、若查找到目标指令序列,则更新计数器ji+1=ji-1,i为迭代次数;
步骤b5、若当前计数器j=0,则定位当前目标指令序列,输出执行逻辑;若当前计数器j>0,则查找下一个目标指令序列;
步骤b6、重复步骤b1至步骤b5,直至指令模板中的所有指令片段均处理完毕;
随机因子生成单元4026用于生成随机数作为下一次运行时的随机因子seed。
本发明提出代码复用编程思想,并基于该思想构建“一次一变形”的SGX程序,使侧信道攻击难度大大增加。所谓“一次一变形”是指:SGX程序每次运行,都会改变关键实现部分的控制流,使得SGX程序每次执行所产生的控制流都不会相同。之所以能够实现“一次一变形”,是因为SGX程序是基于代码复用编程思想构造,SGX程序本身提供一个由若干可用指令序列组成的代码基,影响软件控制流的关键数据在每次软件运行时可重新设置。这样,使得SGX程序每次运行所产生的控制流都不一样,从而使侧信道分析难度大大增加。
最后应说明的是:以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。
Claims (4)
1.一种基于代码复用编程防御SGX侧信道攻击的方法,其特征在于,包括:
步骤1、分析指令模板所表示的指令流,将所述指令流分解为多个指令片段,判断是否已构建代码基,若是则执行步骤2,若否则构建代码基;其中,所述代码基包含与指令模板对应的多个指令序列,所述指令模板表示按照传统方式编程得到的用于实现特定业务的指令流,每个所述指令序列尾部均附有用于与其他所述指令序列进行连接的标志指令;
步骤2、根据所述指令流和所述代码基生成执行逻辑,所述执行逻辑表示连接代码基内各指令序列以实现所述特定业务的控制逻辑;具体包括:
步骤2.1、读取指令模板中的指令片段;
步骤2.2、对每个指令片段执行步骤2.2.1至步骤2.2.6,其中,所述步骤2.2.1至步骤2.2.6具体为:
步骤2.2.1、生成随机数random_2;
步骤2.2.2、设置计数器j=random_2+seed,seed为设定的随机因子;
步骤2.2.3、在代码基当前位置查找目标指令序列;
步骤2.2.4、若查找到目标指令序列,则更新计数器ji+1=ji-1,i为迭代次数;
步骤2.2.5、若当前计数器j=0,则定位当前目标指令序列,输出执行逻辑;若当前计数器j>0,则查找下一个目标指令序列;
步骤2.2.6、重复步骤2.2.1至步骤2.2.5,直至指令模板中的所有指令片段均处理完毕,则执行步骤2.3;
步骤2.3、生成随机数作为下一次运行时的随机因子seed;
步骤3、根据所述执行逻辑从代码基中读取相应的指令序列,并将各指令序列连接起来,以完成所述特定业务。
2.根据权利要求1 所述的方法,其特征在于,步骤1中的所述构建代码基具体包括:
步骤1.1、构建空单链表;
步骤1.2、从指令模板中读取需要进入所述代码基的指令片段,并执行步骤1.2.1至步骤1.2.4:其中,所述步骤1.2.1至步骤1.2.4具体为:
步骤1.2.1、遍历单链表,判断所述单链表是否包含当前指令片段,若不包含则执行步骤1.2.2;反之则读取下一个指令片段;
步骤1.2.2、生成随机数random_1作为当前指令片段的副本数量,其中,n_min<random_1<n_max,n_min表示指令片段的副本数最小值,n_max表示指令片段的副本数最大值;
步骤1.2.3、所述单链表增加一个节点,所述节点包括:当前指令片段和当前指令片段的副本数量;
步骤1.2.4、重复步骤1.2.1至步骤1.2.3,直至所有指令片段处理完毕,则执行步骤1.3;
步骤1.3、初始化单链表节点数量为n和计步器k=0,并执行步骤1.3.1至步骤1.3.4:其中,所述步骤1.3.1至步骤1.3.4具体为:
步骤1.3.1、生成随机数x;
步骤1.3.2、以当前节点为起点,顺序遍历单链表,遍历一个节点计步长为1,确定单链表下一个待处理节点,所述下一个待处理节点为距离当前节点的步长为ki+1=ki+x mod n的节点,i为迭代次数;
步骤1.3.3、在所述待处理节点对应的指令片段尾部添加标志指令后形成指令序列并写入代码基,所述待处理节点对应的副本数量减1,若当前副本数量为0,则从单链表中删除所述待处理节点,且单链表节点数n减1;
步骤1.3.4、重复步骤1.3.1至步骤1.3.3,直至单链表为空表。
3.一种基于代码复用编程防御SGX侧信道攻击的装置,其特征在于,包括:指令模板模块、翻译引擎模块、代码基模块、执行逻辑模块和执行引擎模块;
所述指令模板模块,用于存储指令模板,所述指令模板表示按照传统方式编程得到的用于实现特定业务的指令流;
所述翻译引擎模块,用于构建代码基,所述代码基包含与所述指令模板对应的多个指令序列,每个所述指令序列尾部均附有用于与其他所述指令序列进行连接的标志指令;以及根据所述指令流和所述代码基生成执行逻辑,所述执行逻辑表示连接代码基内各指令序列以实现所述特定业务的控制逻辑;还用于分析所述指令模板所表示的指令流,将所述指令流分解为多个指令片段;
所述翻译引擎模块,具体包括:
指令片段读取单元,用于读取指令模板中的指令片段;
执行逻辑生成单元,用于对每个指令片段执行步骤b1至步骤b6,其中,所述步骤b1至步骤b6具体为:
步骤b1、生成随机数random_2;
步骤b2、设置计数器j=random_2+seed,seed为设定的随机因子;
步骤b3、在代码基当前位置查找目标指令序列;
步骤b4、若查找到目标指令序列,则更新计数器ji+1=ji-1,i为迭代次数;
步骤b5、若当前计数器j=0,则定位当前目标指令序列,输出执行逻辑;若当前计数器j>0,则查找下一个目标指令序列;
步骤b6、重复步骤b1至步骤b5,直至指令模板中的所有指令片段均处理完毕;
随机因子生成单元,用于生成随机数作为下一次运行时的随机因子seed;
所述代码基模块,用于存储翻译引擎模块构建的代码基;
所述执行逻辑模块,用于存储翻译引擎模块生成的执行逻辑;
所述执行引擎模块,用于根据所述执行逻辑从代码基中读取相应的指令序列,并将各指令序列连接起来,以完成所述特定业务。
4.根据权利要求3所述的装置,其特征在于,所述翻译引擎模块具体包括:
初始化单元,用于构建空单链表;
指令片段分析单元,用于从指令模板中读取需要进入所述代码基的指令片段,并执行步骤a1至步骤a4:其中,所述步骤a1至步骤a4具体为:
步骤a1、遍历单链表,判断所述单链表是否包含当前指令片段,若不包含则执行步骤a2;反之则读取下一个指令片段;
步骤a2、生成随机数random_1作为当前指令片段的副本数量,其中,n_min<random_1<n_max,n_min表示指令片段的副本数最小值,n_max表示指令片段的副本数最大值;
步骤a3、所述单链表增加一个节点,所述节点包括:当前指令片段和当前指令片段的副本数量;
步骤a4、重复步骤a1至步骤a3,直至所有指令片段处理完毕;
代码基生成单元,用于初始化单链表节点数量为n和计步器k=0,并执行步骤a5至步骤a8:其中,所述步骤a5至步骤a8具体为:
步骤a5、生成随机数x;
步骤a6、以当前节点为起点,顺序遍历单链表,遍历一个节点计步长为1,确定单链表下一个待处理节点,所述下一个待处理节点为距离当前节点的步长为ki+1=ki+x mod n的节点,i为迭代次数;
步骤a7、在所述待处理节点对应的指令片段尾部添加标志指令后形成指令序列并写入代码基,所述待处理节点对应的副本数量减1,若当前副本数量为0,则从单链表中删除所述待处理节点,且单链表节点数n减1;
步骤a8、重复步骤a5至步骤a7,直至单链表为空表。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910152138.6A CN109829313B (zh) | 2019-02-28 | 2019-02-28 | 一种基于代码复用编程防御sgx侧信道攻击的方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910152138.6A CN109829313B (zh) | 2019-02-28 | 2019-02-28 | 一种基于代码复用编程防御sgx侧信道攻击的方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109829313A CN109829313A (zh) | 2019-05-31 |
CN109829313B true CN109829313B (zh) | 2020-11-24 |
Family
ID=66864977
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910152138.6A Active CN109829313B (zh) | 2019-02-28 | 2019-02-28 | 一种基于代码复用编程防御sgx侧信道攻击的方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109829313B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2021046811A1 (zh) * | 2019-09-12 | 2021-03-18 | 奇安信安全技术(珠海)有限公司 | 一种攻击行为的判定方法、装置及计算机存储介质 |
CN111865909B (zh) * | 2020-06-08 | 2021-05-28 | 西安电子科技大学 | Sgx侧信道攻击防御方法、系统、介质、程序及应用 |
CN112559045B (zh) * | 2020-12-23 | 2022-09-16 | 中国电子科技集团公司第五十八研究所 | 一种基于riscv的随机指令生成平台及方法 |
CN112989397B (zh) * | 2021-05-17 | 2021-07-30 | 支付宝(杭州)信息技术有限公司 | 一种抗侧信道攻击的数据处理方法和装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101359351A (zh) * | 2008-09-25 | 2009-02-04 | 中国人民解放军信息工程大学 | 针对恶意行为的多层语义标注及检测方法 |
CN102663312A (zh) * | 2012-03-20 | 2012-09-12 | 中国科学院信息工程研究所 | 一种基于虚拟机的rop攻击检测方法及系统 |
CN107209815A (zh) * | 2015-02-06 | 2017-09-26 | 华为国际有限公司 | 用于使用返回导向编程的代码混淆的方法 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103903043B (zh) * | 2012-12-24 | 2017-07-18 | 北京握奇数据系统有限公司 | 一种智能卡三位一体抗侧信道攻击防护方法和系统 |
JP2019505871A (ja) * | 2015-12-02 | 2019-02-28 | パワー フィンガープリンティング インコーポレイテッド | 符号解析においてサイドチャネル情報を用いて電子装置のサプライチェーンを検証する方法および機器 |
US10270586B2 (en) * | 2017-04-25 | 2019-04-23 | Seagate Technology Llc | Random time generated interrupts in a cryptographic hardware pipeline circuit |
CN109359487B (zh) * | 2018-10-09 | 2022-02-18 | 湖北文理学院 | 一种基于硬件隔离的可扩展安全影子存储及标签管理方法 |
-
2019
- 2019-02-28 CN CN201910152138.6A patent/CN109829313B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101359351A (zh) * | 2008-09-25 | 2009-02-04 | 中国人民解放军信息工程大学 | 针对恶意行为的多层语义标注及检测方法 |
CN102663312A (zh) * | 2012-03-20 | 2012-09-12 | 中国科学院信息工程研究所 | 一种基于虚拟机的rop攻击检测方法及系统 |
CN107209815A (zh) * | 2015-02-06 | 2017-09-26 | 华为国际有限公司 | 用于使用返回导向编程的代码混淆的方法 |
Non-Patent Citations (1)
Title |
---|
SGX技术的分析和研究;王娟等;《软件学报》;20180421;第29卷(第9期);第2779-2793页 * |
Also Published As
Publication number | Publication date |
---|---|
CN109829313A (zh) | 2019-05-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109829313B (zh) | 一种基于代码复用编程防御sgx侧信道攻击的方法及装置 | |
US11507671B1 (en) | Detection and healing of vulnerabilities in computer code | |
CN111770113B (zh) | 一种执行智能合约的方法、区块链节点和节点设备 | |
US10698668B1 (en) | Custom code transformations during compilation process | |
CN104111848B (zh) | 一种基于异步检查点的多线程软件动态升级方法 | |
US8769511B2 (en) | Dynamic incremental compiler and method | |
US9250937B1 (en) | Code randomization for just-in-time compilers | |
US8510723B2 (en) | Binary rewriting without relocation information | |
US8015558B1 (en) | System, method and computer program product for on-the-fly patching of executable code | |
US8341602B2 (en) | Automated verification of a type-safe operating system | |
Abadi et al. | A theory of secure control flow | |
US20110138373A1 (en) | Method and apparatus for globally optimizing instruction code | |
KR101740604B1 (ko) | 멀웨어 검출을 위한 애플리케이션들의 제네릭 언패킹 | |
US8141035B2 (en) | Method for accessing internal states of objects in object oriented programming | |
WO2011097901A1 (zh) | 在线补丁的激活方法、装置及系统 | |
KR20060069364A (ko) | 다중 예외 처리 모델에 대한 중간 표현 | |
CN107480476B (zh) | 一种基于ELF感染的Android本地层指令编译虚拟化加壳方法 | |
US7757224B2 (en) | Software support for dynamically extensible processors | |
US6931638B2 (en) | Method and apparatus to facilitate sharing optimized instruction code in a multitasking virtual machine | |
Aspinall et al. | Heap-bounded assembly language | |
Mendis et al. | Revec: program rejuvenation through revectorization | |
CN111782334B (zh) | 一种动态链接库文件虚拟化方法、存储介质及终端设备 | |
Aslam et al. | Optimized java binary and virtual machine for tiny motes | |
CN111768183A (zh) | 一种执行智能合约的方法、区块链节点和存储介质 | |
Thimbleby | A critique of Java |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |