一种内存页共享方法
技术领域
本发明涉及内存页共享方法,尤其是涉及一种基于Intel SGX中enclave的内存页共享方法。
背景技术
随着计算机和互联网的发展和普及,越来越多人的人将重要数据存储在计算机上或者远程云端,或者通过互联网支付、转账等。其中最担心的问题是信息泄露和黑客攻击。针对开放式平台使用的信息安全解决方案,Intel提出了SGX(Software GuardExtensions)方案。该方案使用一组新的指令,增加内存访问权限,将特定的程序和数据置于受保护的安全容器enclave中,从而达到隔离保护的目的。
对于一个enclave,只有该enclave本身可以访问其中的程序和数据,而其它的enclave、基本输入输出系统BIOS、操作系统OS、直接内存存取DMA、显卡等软硬件没有访问权限。要访问enclave中的程序和数据,首先要经过权限验证进入enclave模式,再经过一系列的合法检查,才能运行enclave中的程序和访问其中的数据。运行完成enclave中的程序之后,回到应用程序。
这种设计有几个显著的缺点:1)enclave之间不能共享程序代码,对于相同的程序代码,每个enclave都要复制一份,这将导致enclave中程序代码重复,体积变大;2)一个enclave不能调用另一个enclave的程序,也不能直接访问另一个enclave的数据;3)enclave之间不能共享数据,也不能直接交换数据。两个enclave之间要交换数据,必须先将数据从一个enclave中复制到内存,再从内存复制到另一个enclave中。4)enclave之间不能直接通信。
发明内容
本发明主要针对enclave之间由于相互隔离导致的上述不足之处,本发明设计出一种enclave之间共享内存的方法,从而解决了:1、enclave之间共享EPC页,重复利用PIC程序(Position Independent Code),减小程序代码对EPC(Enclave Page Cache)的开销。2、实现跨越enclave函数调用;3、多个enclave之间可以通过共享内存高效传输数据。4、为enclave之间通信提供了一种同步通信机制。
为实现上述目的,本发明提供了一种内存页共享方法,方法包括:第一安全容器enclave发出请求,请求共享其有权访问的某个安全内存页EPC;或者收到第二安全容器enclave共享属于第一安全容器enclave某个EPC页的请求;第一安全容器enclave验证第二安全容器的合法性;如果验证通过,则获取第二安全容器的安全容器身份标签和安全内存页在第二安全容器所属的进程空间中映射的虚拟地址;在安全内存页对应的安全内存页属性表(EPCM)中插入一个条目,该条目记录第二安全容器的安全容器身份标签和所述虚拟地址;上述条目形成安全容器身份标签表;通知操作系统建立安全内存页在第二安全容器所属的进程空间中的映射页表项。
优选的,安全容器身份标签表中包含至少一个条目,每个条目记录允许访问该安全内存页的安全容器的安全容器身份标签,以及该安全内存页在在该安全容器所属进程空间中映射的虚拟地址。
优选的,在安全容器身份标签表中插入一个条目由处理器完成。
优选的,在安全容器身份标签表中插入一个条目包括,向系统中添加一条用于实现共享安全内存页的指令。
优选的,所述方法还包括:释放所述安全内存页。
优选的,释放安全内存页具体包括:如果安全容器身份标签表中只记录有当前进程中的安全容器,则当前进程中安全容器enclave退出时,释放安全容器身份标签表;否则,从安全容器身份标签表中移除当前安全容器enclave的对应项。
本发明通过扩展EPCM,实现多个enclave共享EPC,同一个EPC页在不同的enclave中有自己的虚拟地址,enclave访问共享EPC如同访问属于自身的EPC一样。使用共享EPC,1)enclave之间可以共享代码,一些PIC程序共享EPC,减少代码对EPC的开销;2)实现跨越enclave的函数调用,一个enclave直接调用另一个enclave的函数,实现自身功能和访问对方数据;3)enclave之间共享数据,避免内存复制和进入、退出enclave的开销;4)为enclave之间提供了一种同步通信机制,使得enclave之间的同步操作变得容易。
附图说明
图1为本发明实施例提供的一种内存页共享方法流程图;
图2为根据本发明一个实施例实现一种内存页共享方法的示意图。
具体实施方式
下面通过附图和实施例,对本发明的技术方案做进一步的详细描述。
如图1所示,为本发明实施例提供的一种内存页共享方法流程图。
本发明实施例提供了一种内存页共享方法,方法包括:首先,第一安全容器enclave发出请求,请求共享其有权访问的某个安全内存页EPC;或者收到第二安全容器enclave共享属于第一安全容器enclave某个EPC页的请求;接着所述第一安全容器enclave验证第二安全容器的合法性。在一个实施例中,上述验证步骤通过硬件验证实现。如果验证失败,则拒绝共享;如果验证通过,则获取第二安全容器的安全容器身份标签和要共享的安全内存页在第二安全容器所属的进程空间中映射的虚拟地址;然后,在该安全内存页对应的安全内存页属性表EPCM中建立安全容器身份标签表;在安全容器身份标签表中插入一个条目,该条目记录第二安全容器的安全容器身份标签和上述映射得到的虚拟地址;通知操作系统建立安全内存页在第二安全容器所属的进程空间中的映射页表项。在一个实施例之后,在安全容器身份标签表中插入一个条目由处理器完成。
下面具体描述在安全内存页属性表EPCM中建立安全容器身份标签表,并在该标签表中插入条目的过程。
SGX中,EPC页是受保护的内存页,我们在此称之为安全内存页。每个EPC页都有唯一的安全内存属性表EPCM(EPC Map)与之对应,EPCM记录了EPC的一些属性,如EPC页是否有效、EPC所属安全容器enclave的安全容器身份标签SECS_ID(SGX enclave controlstructure ID)、EPC页的类型、虚拟地址、读写权限以及是否可以被访问等。在现有技术中,每一个EPC最多只能被一个enclave所有,通过EPCM中的SECS_ID项标识。
针对每个EPC页最多只能被一个enclave访问的不足之处,我们对安全内存属性表EPCM进行扩展,在其中添加多组{SECS_ID,虚拟地址}项条目,上述条目形成一个安全容器身份标签表,即SECS_ID表,从而使得该表对应的EPC能够被所添加的多个SECS_ID对应的多个安全容器所访问。
该表的大小根据实际需求自定义。在一个实施例之后,扩展后的EPCM结构如下表所示。
表中,SECS_ID为enclave的SECS(SGX enclave control structure)身份标识,enclave只有被验证通过才能得到它的SECS_ID。虚拟地址为EPC页在所属enclave所在进程空间中虚拟地址。
共享EPC页,可以通过添加一条共享EPC页的指令,由硬件实现。
如图2所示,为根据本发明一个实施例实现一种内存页共享方法的示意图。
虚线箭头为不同enclave访问自己的安全内存页EPC过程,相互隔离,无法互相访问。实线箭头为不同enclave访问共享的安全内存页EPC过程。在各自进程中,如进程1中的安全容器1发出一个访问请求。请求中包含的虚拟地址通过查询内核空间中的页表,得到转换后的物理地址,根据物理地址找到相应的安全内存页EPC。对应的EPC页中处理器检查EPCM时查看其中的SECS_ID表,只要发现其中存在一项,其SECS_ID和当前enclave的SECS_ID一致,那么检查通过,允许访问EPC,否则触发错误信号。
一个enclave进程退出时,处理器检查该enclave使用的所有EPC页,读取EPC页对应的EPCM,如果EPC页只被当前enclave所有,体现在扩展后的EPCM中,即EPCM中建立的安全容器身份标签表中如果只记录有当前安全容器,那么该EPC页将被释放。否则,从EPC页对应的EPCM中的SECS_ID表中移除该enclave的对应项。一个共享的EPC页只能被最后一个引用该EPC页的enclave释放。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的精神和原则之内,所做的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。