CN112685101B - 面向可信执行环境的系统调用处理方法及装置 - Google Patents
面向可信执行环境的系统调用处理方法及装置 Download PDFInfo
- Publication number
- CN112685101B CN112685101B CN202011638265.6A CN202011638265A CN112685101B CN 112685101 B CN112685101 B CN 112685101B CN 202011638265 A CN202011638265 A CN 202011638265A CN 112685101 B CN112685101 B CN 112685101B
- Authority
- CN
- China
- Prior art keywords
- system call
- execution environment
- trusted execution
- vdso
- trusted
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/445—Program loading or initiating
- G06F9/44589—Program code verification, e.g. Java bytecode verification, proof-carrying code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
Abstract
本说明书实施例中提供了一种面向可信执行环境的系统调用处理方法及装置。该方法可以包括:接收运行在可信执行环境中的应用程序发起的IO类系统调用请求。接着向可信执行环境外的共享内存区域写入该系统调用请求,并且向可信执行环境外的IO请求队列写入IO请求事件,其中该IO请求事件包括系统调用请求在共享内存区域中的第一地址以及共享内存区域中用于存储业务数据的第二地址。如此,系统内核可以根据该IO请求事件处理该系统调用请求,并且向可信执行环境外的IO完成队列写入IO完成事件,该IO完成事件包括系统内核对IO请求的处理结果。最后,至少向可信执行环境中的应用程序返回该IO完成事件中的处理结果。
Description
技术领域
本说明书一个或多个实施例涉及计算机领域,尤其涉及面向可信执行环境的系统调用处理方法及装置。
背景技术
软件保护扩展(software guard extensions,SGX)是英特尔(Intel)芯片架构下的一种安全扩展。SGX允许应用程序运行在被称为Enclave的可信执行环境(trustedexecution environment,TEE)中。Enclave是一块可信内存区域,Enclave中的内容全部经过加密,只有在中央处理器(central processing unit,CPU)内部才能对Enclave中的内容进行解密,从而提供机密性。此外,还会对Enclave中的内容进行完整性度量,从而提供完整性。基于SGX提供的完整性和机密性,可以为应用程序提供进行安全敏感计算的TEE。
运行在Enclave中的计算机程序被称为可信代码(trusted code),运行在Enclave外的计算机程序被称为不可信代码(untrusted code)。可信代码和不可信代码之间可以相互调用,从而在保证机密计算的情况下实现程序功能。可信代码调用不可信代码通常被称为OCall。由于Enclave是用户态的,运行在Enclave中的应用程序经常需要调用外部系统来实现程序功能,即需要通过不可信代码来实现程序功能。当Enclave中的应用程序进行系统调用时,则需要进行OCall,将调用参数复制到Enclave外,通过EEXIT指令退出Enclave,然后通过不可信代码执行系统调用,执行完毕后恢复到Enclave,将调用结果复制到Enclave内,并将Enclave内的调用结果提供给应用程序。
进行一次OCall通常需要大约8300-14100个CPU周期,进行一次典型的系统调用大约需要150个CPU周期,因此在可信执行环境中通过进行OCall来处理运行在可信执行环境中的应用程序发起的系统调用请求,需要浪费极大的处理时间。然而,运行在Enclave中的应用程序却往往需要进行高频次的系统调用,因此通过OCall实现系统调用会对运行在Enclave中的应用程序的整体性能造成较大的负面影响。
希望有一种新的技术方案,以期减少运行在Enclave中的应用程序进行系统调用时的OCall,进而提高运行在Enclave中的应用程序的整体性能。
发明内容
本说明书一个或多个实施例中提供了一种面向可信执行环境的系统调用处理方法及装置。
第一方面,提供了一种面向可信执行环境的系统调用处理方法。该方法可以由部署在可信执行环境中的系统调用处理装置执行。该方法包括:首先接收运行在可信执行环境中的应用程序发起的系统调用请求,其中该统调用请求用于请求向目标文件写入业务数据,或者用于请求从目标文件中读取业务数据。接着向可信执行环境外的共享内存区域写入该系统调用请求,并且向存储在可信执行环境外的IO请求队列写入IO请求事件,其中该IO请求事件包括系统调用请求在共享内存区域中的第一地址以及共享内存区域中用于存储业务数据的第二地址。如此,系统内核可以根据该IO请求事件处理该系统调用请求,并向存储在可信执行环境外的IO完成队列写入IO完成事件,该IO完成事件包括系统内核对IO请求的处理结果。最后,至少向可信执行环境中的应用程序返回该IO完成事件中的处理结果。
在一种可能的实施方式中,所述系统调用请求用于请求向目标文件写入业务数据时,所述方法还包括:根据所述系统调用请求向所述共享内存区域的所述第二地址写入业务数据;其中,所述系统内核具体用于根据所述IO请求事件从所述共享内存区域的所述第一地址读取所述系统调用请求,以及从所述第二地址读取所述业务数据,并根据所述系统调用请求向目标文件写入所述业务数据。
在一种可能的实施方式中,所述系统调用请求用于请求从目标文件中读取业务数据时,所述系统内核具体用于根据所述IO请求事件从所述共享内存区域的所述第一地址读取所述系统调用请求,根据所述系统调用请求从目标文件中读取业务数据,并根据所述第二地址向所述共享内存区域中写入所述业务数据;
所述方法还包括:向所述应用程序提供所述共享内存区域中的所述业务数据。
在一种可能的实施方式中,该方法还包括:生成所述系统调用请求的唯一标识,其中所述IO请求事件和所述IO完成事件还包括所述唯一标识;根据所述唯一标识在所述IO完成队列中轮询所述IO完成事件。
在一种可能的实施方式中,接收运行在可信执行环境中的应用程序发起的系统调用请求之前,还包括:通过运行在可信执行环境外的业务程序,初始化所述IO请求队列、所述IO完成队列以及所述共享内存区域,并触发系统内核启动用于轮询所述IO请求队列的轮询线程。
在一种可能的实施方式中,该方法还包括:通过运行在可信执行环境外的业务程序,获取用于访问所述IO请求队列、所述IO完成队列以及所述共享内存区域的配置信息。
在一种可能的实施方式中,所述向存储在可信执行环境外的IO请求队列写入IO请求事件,具体包括:获取用于访问存储在可信执行环境外的IO请求队列的线程锁,通过该线程锁向所述IO请求队列写入所述IO请求事件。
在一种可能的实施方式中,所述系统调用请求的类型以下各种类型中的任意一种:read、write、readv、writev、fsync、poll、send_msg、recv_msg、openat、close、accept、connect、epoll_ctl、send以及recv。
第二方面,提供了一种面向可信执行环境的系统调用处理装置,该装置可以部署在可信执行环境中。该装置至少包括:请求接收单元,用于接收运行在可信执行环境中的应用程序发起的系统调用请求;其中,所述系统调用请求用于请求向目标文件写入业务数据,或者用于请求从目标文件中读取业务数据。数据写入单元,用于向可信执行环境外的共享内存区域写入所述系统调用请求,以及向存储在可信执行环境外的IO请求队列写入IO请求事件;其中,所述IO请求事件包括所述系统调用请求在所述共享内存区域中的第一地址以及所述共享内存区域中用于存储业务数据的第二地址,使系统内核根据所述IO请求事件处理所述系统调用请求,并向存储在可信执行环境外的IO完成队列写入IO完成事件,所述IO完成事件包括系统内核对所述IO请求的处理结果。数据提供单元,用于至少向所述应用程序提供所述IO完成事件中的所述处理结果。
在一种可能的实施方式中,所述系统调用请求用于请求向目标文件写入业务数据时,所述数据写入单元还用于根据所述系统调用请求向所述共享内存区域写入业务数据;其中,所述系统内核具体用于根据所述IO请求事件从所述共享内存区域中读取所述系统调用请求和所述业务数据,并根据所述系统调用请求向目标文件写入所述业务数据。
在一种可能的实施方式中,所述系统调用请求用于请求从目标文件中读取业务数据时,所述系统内核具体用于根据所述IO请求事件从所述共享内存区域中读取所述系统调用请求,根据所述系统调用请求从目标文件中读取业务数据,并根据所述第二地址向所述共享内存区域中写入所述业务数据;
所述数据提供单元还用于向所述应用程序提供所述共享内存区域中的所述业务数据。
在一种可能的实施方式中,该装置还包括:标识管理单元,用于生成所述系统调用请求的唯一标识;其中,所述IO请求事件和所述IO完成事件还包括所述唯一标识。队列轮询单元,用于根据所述唯一标识在所述IO完成队列中轮询所述IO完成事件。
在一种可能的实施方式中,该装置还包括:初始化配置单元,用于通过运行在可信执行环境外的业务程序,初始化所述IO请求队列、所述IO完成队列以及所述共享内存区域,触发系统内核启动用于轮询所述IO请求队列的轮询线程。
在一种可能的实施方式中,所述初始化配置单元,还用于通过运行在可信执行环境外的业务程序,获取用于访问所述IO请求队列、所述IO完成队列以及所述共享内存区域的配置信息。
在一种可能的实施方式中,所述数据写入单元具体用于获取用于访问存储在可信执行环境外的IO请求队列的线程锁,通过该线程锁向所述IO请求队列写入所述IO请求事件。
在一种可能的实施方式中,所述系统调用请求的类型以下各种类型中的任意一种:read、write、readv、writev、fsync、poll、send_msg、recv_msg、openat、close、accept、connect、epoll_ctl、send以及recv。
第三方面,提供了一种面向可信执行环境的系统调用处理方法,该方法可以由部署在可信执行环境中的系统调用处理装置执行。该方法至少包括:获取可信执行环境外的内存区域中的虚拟动态共享对象(virtual dynamic shared object,VDSO)的第一地址,其中该内存区域中还包括用于存储若干时间数据的数据段,VDSO包括若干用于访问所述数据段的系统调用函数;接着根据该第一地址在可信执行环境中加载VDSO,并根据该第一地址以及可信执行环境中的VDSO的第二地址,修改可信执行环境中的VDSO对数据段的寻址方式;最后,通过修改后的VDSO接收可信执行环境中的应用程序发起的系统调用请求,根据该系统调用请求从数据段存储的若干时间数据中读取当前时间数据,并且向可信执行环境中的应用程序提供其读取的当前时间数据。
在一种可能的实施方式中,修改可信执行环境中的VDSO之前,还包括:确定可信执行环境中的VDSO是否可信。
在一种可能的实施方式中,确定可信执行环境中的VDSO是否可信,具体包括:对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编,以获取所述若干系统调用函数各自对应的指令集;其中,对所述若干系统调用函数中的任一当前系统调用函数递归地进行反汇编的过程中,在当前时刻获取的当前指令满足至少一项预设条件中的任一项时,确定可信执行环境中的VDSO不可信。
在一种可能的实施方式中,所述至少一项预设条件包括以下各项预设条件中的一项或多项:所述当前指令为RET指令以外的控制转移指令、所述当前指令的寻址方式为直接寻址、所述当前指令为未允许的指令、对所述当前指令的反汇编存在错误。
在一种可能的实施方式中,确定可信执行环境中的VDSO是否可信,还包括:遍历各个所述指令集中的任一当前指令集,利用所述当前指令集包括的指令构建以基本块为节点、以控制转移为边的控制流图;其中,所述基本块是具有一个入口并且具有一个出口的一组连续指令。通过预定算法遍历处理所述控制流图,以确定所述当前指令集对应的系统调用函数是否为可信函数;当不存在不可信函数时,确定可信执行环境中的VDSO可信。
在一种可能的实施方式中,通过预定算法遍历处理所述控制流图,以确定所述当前指令集对应的系统调用函数是否为可信函数,具体包括:通过预定算法遍历处理所述控制流图的过程中,对于所述控制流图中的任一当前节点,如果所述当前节点的若干前驱节点的输出状态的栈结构不完全相同,确定所述当前指令集对应的系统调用函数为不可信函数。
在一种可能的实施方式中,通过预定算法遍历处理所述控制流图,以确定所述当前指令集对应的系统调用函数是否为可信函数,具体包括:通过预定算法遍历处理所述控制流图的过程中,对于所述控制流图中的任一当前节点,如果所述当前节点的内存访问不合法,确定所述当前指令集对应的系统调用函数为不可信函数。
在一种可能的实施方式中,对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编,具体包括:根据可信执行环境中的VDSO所包括的若干系统调用函数各自对应的地址信息,对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编。
在一种可能的实施方式中,根据所述第一地址以及可信执行环境中的VDSO的第二地址,修改可信执行环境中的VDSO对所述数据段的寻址方式,具体包括:确定所述第一地址和所述第二地址的地址偏移量;将所述地址偏移量写入FS段寄存器和/或GS段寄存器;将可信执行环境中的VDSO对所述数据段的寻址方式,修改为通过所述FS段寄存器或者GS段寄存器进行寻址。
在一种可能的实施方式中,所述系统调用请求的类型包括clock_gettime、gettimeofday、time。
第四方面,提供了一种面向可信执行环境的系统调用处理装置,该装置部署在可信执行环境中。该装置至少包括:信息获取单元,用于获取可信执行环境外的内存区域中的VDSO的第一地址;其中,所述内存区域中还包括用于存储若干时间数据的数据段,VDSO包括若干用于访问所述数据段的系统调用函数。加载处理单元,用于根据所述第一地址在可信执行环境中加载VDSO。修改处理单元,用于根据所述第一地址以及可信执行环境中的VDSO的第二地址,修改可信执行环境中的VDSO;其中,修改后的VDSO具体用于接收可信执行环境中的应用程序发起的系统调用请求,根据所述系统调用请求从所述数据段存储的若干时间数据中读取当前时间数据,并向所述应用程序提供其读取的当前时间数据。
在一种可能的实施方式中,还包括:可信验证单元,用于确定可信执行环境中的VDSO是否可信。
在一种可能的实施方式中,所述可信验证单元,具体用于:对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编,以获取所述若干系统调用函数各自对应的指令集;其中,对所述若干系统调用函数中的任一当前系统调用函数递归地进行反汇编的过程中,在当前时刻获取的当前指令满足至少一项预设条件中的任一项时,确定可信执行环境中的VDSO不可信。
在一种可能的实施方式中,所述至少一项预设条件包括以下各项预设条件中的一项或多项:所述当前指令为RET指令以外的控制转移指令、所述当前指令的寻址方式为直接寻址、所述当前指令为未允许的指令、对所述当前指令的反汇编存在错误。
在一种可能的实施方式中,所述可信验证单元,具体用于遍历各个所述指令集中的任一当前指令集,利用所述当前指令集包括的指令构建以基本块为节点、以控制转移为边的控制流图,所述基本块是具有一个入口并且具有一个出口的一组连续指令;通过预定算法遍历处理所述控制流图,以确定所述当前指令集对应的系统调用函数是否为可信函数;当不存在不可信函数时,确定可信执行环境中的VDSO可信。
在一种可能的实施方式中,所述可信验证单元,具体用于在通过预定算法遍历处理所述控制流图的过程中,对于所述控制流图中的任一当前节点,如果所述当前节点的若干前驱节点的输出状态的栈结构不完全相同,确定所述当前指令集对应的系统调用函数为不可信函数。
在一种可能的实施方式中,所述可信验证单元,具体用于在通过预定算法遍历处理所述控制流图的过程中,对于所述控制流图中的任一当前节点,如果所述当前节点的内存访问不合法,确定所述当前指令集对应的系统调用函数为不可信函数。
在一种可能的实施方式中,所述可信验证单元具体用于根据可信执行环境中的VDSO所包括的若干系统调用函数各自对应的地址信息,对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编。
在一种可能的实施方式中,所述修改处理单元,具体用于确定所述第一地址和所述第二地址的地址偏移量;将所述地址偏移量写入FS段寄存器和/或GS段寄存器;将可信执行环境中的VDSO对所述数据段的寻址方式,修改为通过所述FS段寄存器或者GS段寄存器进行寻址。
在一种可能的实施方式中,所述系统调用请求的类型包括clock_gettime、gettimeofday、time。
第五方面,提供了一种计算机可读存储介质,其上存储有计算机程序/指令,当所述计算机程序/指令在计算设备中执行时,计算设备执行如第一方面或第三方面中任一项所述的方法。
第六方面,提供了一种计算设备,包括存储器和处理器,所述存储器中存储有计算机程序/指令,所述处理器执行所述可计算机程序/指令,实现如第一方面或第三方面中任一项所述的方法。
通过本说明书一个或多个实施例中提供的方法及装置,一方面,运行在可信执行环境中的应用程序发起IO类系统调用请求和时间类系统调用请求时,即,运行在可信执行环境中的应用程序发起用于请求向目标文件中写入业务数据或者用于请求从目标文件中读取业务数据的系统调用请求,以及发起用于请求读取时间数据的系统调用请求时,无需进行OCALL即可更为快速的完成该系统调用请求期望实现的程序功能,有利于提高运行在可信执行环境中的应用程序的性能。
附图说明
为了更清楚地说明本说明书实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其它的附图。
图1为本说明书实施例中提供的技术方案的系统框架之一;
图2为本说明书实施例中提供的一种面向可信执行环境的系统调用处理方法的流程示意图;
图3为本说明书实施例中提供的另一种面向可信执行环境的系统调用处理方法的流程示意图;
图4为本说明书实施例中提供的一种面向可信执行环境的系统调用处理装置的结构示意图;
图5为本说明书实施例中提供的技术方案的系统框架之二;
图6为本说明书实施例中提供的另一种面向可信执行环境的系统调用处理方法的流程示意图;
图7为本说明书实施例中提供的另一种面向可信执行环境的系统调用处理方法的流程示意图;
图8为本说明书实施例中修改可信执行环境中的VDSO的过程示意图;
图9为本说明书实施例中提供的另一种面向可信执行环境的系统调用处理装置的结构示意图。
具体实施方式
下面结合附图,对本说明书所提供的各个非限制性实施例进行详细描述。
图1为本说明书实施例中提供的技术方案的系统框架图之一。如图1所示,为了提高计算设备或者虚拟计算节点所采用操作系统的系统内核(kernel)的安全性,通常需要由操作系统将内存资源划分为内核空间和用户空间两部分。系统内核独立于运行在用户空间的普通用计算机程序,其可以访问受保护的内核空间,同时具有访问底层硬件设备的所有权限,比如读/写存储于非易失性存储器中的目标文件,或者读/写内存资源上的临时的目标文件。其中,可信执行环境是用户空间中的一块可信内存区域,为了描述上的方便通常将除可信执行环境以外的用户空间称为进程空间。
运行在可信执行环境中的应用程序可以向系统内核发起系统调用请求,请求系统内核提供需要更高权限来运行的服务。该系统调用请求可以包括但不限于IO类系统调用请求和时间类系统调用请求。其中,IO类系统调用请求是指用于请求系统内核进行网络读写、磁盘读写的各种系统调用请求,比如请求向目标文件中写入业务数据或者从目标文件中读取业务数据,该目标文件可以是存储于磁盘/非易失性存储器上的本地文件,也可以是内存资源上的临时/网络文件。时间类系统调用请求是指用于请求读取时间数据以及其相关信息的系统调用请求。
如前所述,运行在可信执行环境中的应用程序通过OCall实现系统调用时,由于OCall需要消耗较长的时间,而运行在可信执行环境中的应用程序往往需要进行高频次的系统调用,这对运行在可信执行环境中的应用程序的整体性能影响较大。
在一种可能的技术方案中,可以在可信执行环境外配置共享内存区域,并且在可信执行环境外运行若干个工作线程。当可信执行环境内的应用程序需要进行系统调用时,可以将系统调用请求写入该共享内存区域,并不断检查共享内存区域中系统调用请求的执行情况;可信执行环境外的工作线程会不断检查共享内存区域中是否有系统调用请求,如发现系统调用请求则对已发现的系统调用请求进行处理,并将处理结果写入共享内存区域。可信执行环境内的应用程序检查到系统调用请求被成功处理后,从共享内存区域中读出处理结果以完成一次系统调用。
该技术方案中,工作线程和可信执行环境内的应用程序均会轮询共享内存区域。然而,该方案实质上难以决定工作线程的数量,工作线程过少会导致系统调用请求无法被快速执行,将会导致应用程序的整体性能发生下降;工作线程过多则会浪费计算资源,也可能导致应用程序的整体性能发生下降。
考虑到以上问题,本说明书实施例中至少提供了一种面向可信执行环境的系统调用处理方法及装置。
图2为本说明书实施例中提供的一种面向可信执行环境的系统调用处理方法的流程图。该方法可以由部署在可信执行环境中的系统调用处理装置来执行。
如图2所示,该方法可以包括:步骤201,接收运行在可信执行环境中的应用程序发起的系统调用请求;其中,系统调用请求用于请求向目标文件写入业务数据,或者用于请求从目标文件中读取业务数据。步骤202,向可信执行环境外的共享内存区域写入系统调用请求,以及向存储在可信执行环境外的IO请求队列写入IO请求事件,其中IO请求事件包括系统调用请求在共享内存区域中的第一地址以及共享内存区域中用于存储业务数据的第二地址,使系统内核根据IO请求事件处理系统调用请求,并向存储在可信执行环境外的IO完成队列写入IO完成事件,IO完成事件包括系统内核对IO请求的处理结果。步骤203,至少向应用程序提供IO完成事件中的处理结果。
通过本说明书实施例中提供的技术方案,运行在可信执行环境中的应用程序发起IO类系统调用请求时,即发起用于请求向目标文件中写入业务数据或者用于请求从目标文件中读取业务数据的系统调用请求时,无需进行OCALL即可更为快速的完成该系统调用请求期望实现的程序功能,有利于提高运行在可信执行环境中的应用程序的性能。
下面结合图1所示的系统框架,示例性描述面向可信执行环境的系统调用处理方法。其中,如图1所示,可信执行环境中部署了系统调用处理装置,与系统调用处理装置相协作的业务程序运行在可信执行环境外的进程空间。
图3为本说明书实施例中提供的另一种面向可信执行环境的系统处理方法的流程示意图。该方法可以包括如图3所示步骤3011至步骤3112中的部分或全部。
首先,在步骤3011,系统调用处理装置向运行在进程空间的业务程序发送调用请求。
接着,业务程序响应于接收的调用请求,执行步骤3012至3014:步骤3012,在进程空间中初始化共享内存区域、IO请求队列和IO完成队列;步骤3013,触发系统内核启动用于轮询IO请求队列的轮询线程;步骤3014,向系统调用处理装置发送共享内存区域、IO请求队列和IO完成队列的配置信息。
共享内存区域也可称为数据缓冲区,在后续过程中将会用于存储可信执行环境中的应用程序向系统调用处理装置发起的系统调用请求(或者说系统调用请求的数据结构)、系统调用请求期望写入目标文件的业务数据、系统调用请求期望读取的业务数据。共享内存区域中的内存地址的使用情况,将由系统调用处理装置来管理。
业务程序可以利用系统内核的现有接口装置,实现初始化IO完成队列和IO请求队列,并触发系统内核启动用于轮询IO请求队列的轮询线程。或者,可以在系统内核中扩展相应的接口装置,业务程序利用扩展的接口装置实现初始化IO完成队列和IO请求队列,并触发系统内核启动用于轮询IO请求队列的轮询线程。
举例来说,计算设备或者虚拟计算节点所采用操作系统的系统内核是Linux系统内核。Linux系统内核提供了异步IO接口装置io_uring。业务程序完成初始化共享内存区域后,可以按照io_uring的工作机制初始化io_uring,通过io_uring在进程空间维护IO请求队列和IO完成队列。接着将io_uring的工作模式配置为IORING_SETUP_SQPOLL模式,工作模式被配置为IORING_SETUP_SQPOLL模式的io_uring将会请求系统内核启动用于轮询IO请求队列的内核线程(即轮询线程)。
系统内核处理装置接收到共享内存区域、IO请求队列和IO完成队列的配置信息时,可以配置共享内存区域、IO请求队列和IO完成队列的数据结构,以便后续通过已配置的数据结构访问和管理共享内存区域、IO请求队列和IO完成队列。需要说明的是,通过io_uring初始化IO请求队列和IO完成队列时,IO请求队列和IO完成队列的配置信息为io_uring的配置信息,IO请求队列和IO完成队列的数据结构是io_uring的数据结构。
系统调用处理装置可以工作在单线程模式或者多线程模式。当系统调用处理装置工作在多线程模式时,还可以对IO请求队列、IO完成队列以及共享内存区域分别配置线程锁。其中,线程锁是用于访问其对应的业务对象(IO请求队列、IO完成队列或者共享内存区域)的代码块,同一时刻仅允许获得该线程锁的单个线程来访问其对应的业务对象。
完成前述步骤3011至3014的相关处理过程之后,运行在可信执行环境中的应用程序即可向系统调用处理装置发起系统调用请求。与之对应的是,在步骤302,系统调用处理装置接收运行在可信执行环境中的应用程序发起的系统调用请求。
来自应用程序的系统调用请求,包括期望实现完成网络读写、磁盘读写等程序功能的IO类系统调用请求,其具体用于请求向目标文件写入业务数据或者从目标文件读取业务数据。该目标文件可以是存储于磁盘等非易失性存储器上的本地文件,也可以是内存资源上的临时文件。
具体地说,该系统调用请求的类型可以包括:read、write、readv、writev、fsync、poll、send_msg、recv_msg、openat、close、accept、connect、epoll_ctl、send或者recv。
接着,在步骤3031,系统调用处理装置向共享内存区域写入其接收的系统调用请求。
具体地,系统调用处理装置可以在共享内存区域中,分配出用于存储该系统调用请求的第一地址,以及分配出用于存储业务数据的第二地址。然后才向分配的第一地址写入该系统调用请求。
当系统调用请求用于请求从目标文件读取业务数据时,系统调用处理装置在完成执行步骤3031之后,直接执行步骤304或步骤305。
当系统调用请求用于请求向目标文件写入业务数据时,系统调用处理装置还可以执行步骤3032,完成执行步骤3032之后执行步骤304或步骤305。
在步骤3032,系统调用处理装置向共享内存区域写入业务数据。
系统调用处理装置可根据系统调用请求的指示,将可信执行环境中的业务数据,写入共享内存区域中用于存储业务数据的第二地址。
在步骤304,系统调用处理装置生成该系统调用请求的唯一标识。
接着,在步骤305,系统调用处理装置向IO请求队列写入对应于该系统调用请求的IO请求事件。
IO请求事件包括该系统调用请求在共享内存区域中的第一地址,以及包括共享内存区域中用于存储业务数据的第二地址,可选地包括该系统调用请求的唯一标识。
以通过io_uring初始化IO请求队列为例。系统调用处理装置可以根据io_uring所要求的数据结构,组成包含第一地址和第二地址的IO请求事件,并且在IO请求事件的用户数据域(user_data)中记录该系统调用请求(或者说该IO请求事件)的唯一标识,最后再将IO请求事件提交到由io_uring初始化的IO请求队列中。
需要说明的是,系统调用处理装置工作在多线程模式时,接收IO完成事件的线程可以先获取用于访问IO请求队列的线程锁,通过该线程锁向IO请求队列写入IO请求事件。
需要说明的是,系统调用请求所包含的部分或全部信息,可以包含于IO请求事件中。例如,系统调用请求的请求类型和/或用于访问目标文件的文件描述符可以包含于IO请求事件中。
需要说明的是,对于某些特定内核版本的io_uring,如果应用程序首次请求访问目标文件,还需要将该目标文件注册到io_uring允许的文件集合中。
由于系统内核已经启动用于轮询IO请求队列的轮询线程,因此系统内核可以通过轮询线程发现系统调用装置写入IO请求队列的IO请求事件。相应的,系统内核通过轮询线程发现IO请求队列中的IO请求事件时,可以执行步骤306,从IO请求队列中读取IO请求事件。
接着,在步骤3071,系统内核根据其读取的IO请求事件中的第一地址,从共享内存区域中读取系统调用请求。
该系统调用请求用于请求从目标文件中读取业务数据时,系统内核可以在完成执行步骤3071后,直接执行步骤308。
该系统调用请求用于请求向目标文件写入业务数据,系统内核完成执行步骤3071后,还可以执行步骤3072,完成执行步骤3072之后执行步骤308。
在步骤3072,根据其读取的IO请求事件中的第二地址,从共享内存区域读取业务数据。
在步骤308,系统内核处理其读取的系统调用请求,并获得处理结果。
具体地,该系统调用请求用于请求向目标文件写入业务数据时,系统内核可以根据该系统调用请求将其从共享内存区域读取的业务数据写入目标文件,获得该系统调用请求的处理结果。该系统调用请求用于请求从目标文件读取业务数据时,系统内核可根据该系统调用请求从目标文件读取业务数据,获得该系统调用请求的处理结果。
处理结果用于指示系统内核对系统调用请求的处理情况,比如用于指示系统内核成功读取/写入的业务数据的字节数。
接着,在步骤3091,系统内核向IO完成队列写入IO完成事件。
IO完成事件包括该系统调用请求的处理结果,可选地还包括该系统调用请求的唯一标识。
该系统调用请求用于请求从目标文件中读取业务数据时,系统内核还可以执行步骤3092,根据其读取的IO请求事件中的第二地址,向共享内存区域写入其读取的业务数据。
接着,在步骤3101,系统调用处理装置从IO完成队列读取IO完成事件。
具体地,系统调用处理装置在完成向IO请求队列写入IO请求事件后,轮询IO完成队列。其中,系统调用处理装置工作在单线程模式时,系统调用处理装置每次只向IO请求队列提交一个IO请求事件,接着就开始轮询IO完成队列等待系统调用被系统内核处理,IO完成队列中至多只有一个IO完成事件,系统调用处理装置必定会读取到在先提交的IO请求事件/系统调用请求所对应的IO完成事件。系统调用处理装置工作在多线程模式时,IO请求队列中可能包括多个IO请求事件,IO完成队列中可能包括多个IO完成事件,且多个IO请求事件的排列顺序与多个IO完成事件的排列顺序可能并不一致,此时需要设置用于访问IO完成队列的线程锁;系统调用处理装置所对应多个线程中的任一当前线程,可以在获取用于访问IO完成队列的线程锁之后,根据相应系统调用请求的唯一标识,通过获取的线程锁从IO请求队列中读取相应的IO完成事件。
该系统调用请求用于请求向目标文件写入业务数据,系统调用处理装置完成读取IO完成事件之后,可以继续执行步骤3111,完成处理系统调用请求。此外还可以释放共享内存区域中的第一地址和第二地址。
该系统调用请求用于请求从目标文件中读取业务数据时,系统内核可以执行步骤3102,然后执行步骤3111和步骤3112,完成处理系统调用请求。此外还可以释放共享内存区域中的第一地址和第二地址。
在步骤3102,系统调用处理装置根据第二地址从共享内存区域中读取业务数据。
在步骤3111,系统调用处理装置向应用程序提供处理结果。
在步骤3112,系统调用处理装置向应用程序提供其读取的业务数据。
需要说明的是,步骤3111和步骤3112可以合并为一个步骤,由系统调用处理装置向应用程序提供系统调用结果。其中,该系统调用请求用于请求从目标文件读取业务数据时,系统调用结果可以包括处理结果,以及系统调用处理装置读取的业务数据或者该业务数据在可信执行环境中的地址信息。该系统调用请求用于请求向目标文件写入业务数据时,系统调用结果可以包括处理结果。
需要说明的是,可信执行环境中的应用程序运行完毕后,系统调用处理装置还可以通过业务程序释放共享内存区域、IO请求队列和IO完成队列。比如通过业务程序关闭io_uring并释放共享内存区域。
基于图2和图3所示的实施例中,通过io_uring初始化IO请求队列和IO完成队列时,由于io_uring内部提供了自适应工作负载机制,能够在提高效率的同时节约计算资源。
基于图2和图3所示的实施例中,通过io_uring初始化IO请求队列和IO完成队列时,由于io_uring将复杂机制隐藏在其内部,无需开发者自己实现复杂机制,只需使用io_uring的规范接口即可,技术方案易于实现。
基于图2和图3所示的实施例中,通过io_uring初始化IO请求队列和IO完成队列时,io_uring本身是Linux系统内核的异步IO机制,在处理异步IO模式下的IO类系统调用时,基于io_uring的技术方案在性能上明显优于同步IO方案或其他异步IO方案,尤其在单核、多设备、4KB随机读取情况下,基于io_uring的技术方案性能优势显著。
与图2和图3所示方法实施例基于相同的构思,本说明书实施例中还提供了一种面向可信执行环境的系统调用处理装置,系统调用处理装置部署在可信执行环境中。如图4所示,该装置包括:请求接收单元401,用于接收运行在可信执行环境中的应用程序发起的系统调用请求;其中,所述系统调用请求用于请求向目标文件写入业务数据,或者用于请求从目标文件中读取业务数据。数据写入单元402,用于向可信执行环境外的共享内存区域写入所述系统调用请求,以及向存储在可信执行环境外的IO请求队列写入IO请求事件;其中,所述IO请求事件包括所述系统调用请求在所述共享内存区域中的第一地址以及所述共享内存区域中用于存储业务数据的第二地址,使系统内核根据所述IO请求事件处理所述系统调用请求,并向存储在可信执行环境外的IO完成队列写入IO完成事件,所述IO完成事件包括系统内核对所述IO请求的处理结果。数据提供单元403,用于向所述应用程序提供所述IO完成事件中的所述处理结果。
在一种可能的实施方式中,所述系统调用请求用于请求向目标文件写入业务数据时,所述数据写入单元402,还用于根据所述系统调用请求向所述共享内存区域的所述第二地址写入业务数据;其中,所述系统内核具体用于根据所述IO请求事件从所述共享内存区域的所述第一地址读取所述系统调用请求,以及根据所述第二地址读取所述业务数据,并根据所述系统调用请求向目标文件写入所述业务数据。
在一种可能的实施方式中,所述系统调用请求用于请求从目标文件中读取业务数据时,所述系统内核具体用于根据所述IO请求事件从所述共享内存区域中的所述第一地址读取所述系统调用请求,根据所述系统调用请求从目标文件中读取业务数据,并根据所述第二地址向所述共享内存区域中写入所述业务数据。所述数据提供单元403,还用于向所述应用程序提供所述共享内存区域中的所述业务数据。
在一种可能的实施方式中,该装置还包括:标识管理单元404,用于生成所述系统调用请求的唯一标识;其中,所述IO请求事件和所述IO完成事件还包括所述唯一标识。队列轮询单元405,用于根据所述唯一标识在所述IO完成队列中轮询所述IO完成事件。
在一种可能的实施方式中,该装置还包括:初始化配置单元406,用于通过运行在可信执行环境外的业务程序,初始化所述IO请求队列、所述IO完成队列和所述共享内存区域,触发系统内核启动用于轮询所述IO请求队列的轮询线程。
在一种可能的实施方式中,所述初始化配置单元406,还用于通过运行在可信执行环境外的业务程序,获取用于访问所述IO请求队列、所述IO完成队列以及所述共享内存区域的配置信息。
在一种可能的实施方式中,所述数据写入单元402,具体用于获取用于访问存储在可信执行环境外的IO请求队列的线程锁,通过该线程锁向所述IO请求队列写入所述IO请求事件。
在一种可能的实施方式中,所述系统调用请求的类型以下各种类型中的任意一种:read、write、readv、writev、fsync、poll、send_msg、recv_msg、openat、close、accept、connect、epoll_ctl、send以及recv。
图5为本说明书实施例中提供的技术方案的系统框架图之二。如图5所示,为了提高计算设备或者虚拟计算节点所采用操作系统的系统内核(kernel)的安全性,通常需要由操作系统将内存资源划分为内核空间和用户空间两部分。系统内核独立于运行在用户空间的普通计算机程序,其可以访问受保护的内核空间,同时具有访问底层硬件设备的所有权限,比如读/写存储于非易失性存储器中的目标文件,或者读/写内存资源上的临时的目标文件。其中,可信执行环境是用户空间中的一块可信内存区域,为了描述上的方便通常将除可信执行环境以外的用户空间称为进程空间。
计算设备或虚拟计算节点运行时,可以在进程空间运行虚拟动态共享对象(virtual dynamic shared object,VDSO),进程空间中还包括VDSO的数据段,该数据段用于存储若干时间数据。系统内核可以对数据段中存储的若干时间数据进行更新。
如前所述,运行在可信执行环境中的应用程序通过OCall实现系统调用时,由于OCall需要消耗较长的时间,而运行在可信执行环境中的应用程序往往需要进行高频次的系统调用,这对运行在可信执行环境中的应用程序的整体性能影响较大。
在一种可能的技术方案中,可以将系统内核支持的VDSO直接移植到可信执行环境中,同时在可信执行环境外的内存资源上维护VDSO的数据段,数据段中存储了若干时间数据,由系统内核负责对数据段中的时间数据进行实时更新。可信执行环境中的VDSO可以接收运行在可信执行环境中的应用程序所发起的时间类系统调用请求,并根据其接收的系统调用请求从可信执行环境外的数据段读取时间数据,并返回给应用程序以完成一次系统调用。
该技术方案中,VDSO原本是系统内核的组成部分,会随着系统内核版本的变化而变化。直接向可信执行环境中移植VDSO,需要根据计算设备或者虚拟计算节点所采用系统内核的版本,移植不同版本的VDSO,并且需要不断针对新版本的系统内核更新移植到可信执行环境中的VDSO,可维护性极差。
考虑到以上问题,本说明书实施例中提供了一种面向可信执行环境的系统调用处理方法及装置。
图6为本说明书实施例中提供的另一种面向可信执行环境的系统调用处理方法的流程图。该方法可以由可信执行环境中的系统调用处理装置执行。
如图6所示,该方法包括:步骤601,获取可信执行环境外的内存区域中的VDSO的第一地址;其中,所述内存区域中还包括用于存储若干时间数据的数据段,VDSO包括若干用于访问所述数据段的系统调用函数。步骤602,根据所述第一地址在可信执行环境中加载VDSO。步骤603,根据所述第一地址以及可信执行环境中的VDSO的第二地址,修改可信执行环境中的VDSO对所述数据段的寻址方式。步骤604,通过修改后的VDSO接收可信执行环境中的应用程序发起的系统调用请求,根据所述系统调用请求从所述数据段存储的若干时间数据中读取当前时间数据,并向所述应用程序提供其读取的当前时间数据。
通过本说明书实施例中提供的技术方案,运行在可信执行环境中的应用程序发起时间类系统调用请求时,即发起用于请求读取时间数据的系统调用请求时,无需进行OCALL即可更为快速的完成该系统调用请求期望实现的程序功能,有利于提高运行在可信执行环境中的应用程序的性能。
下面结合图5所示的系统框架,示例性描述面向可信执行环境的系统调用处理方法。其中,如图5所示,可信执行环境中部署了系统调用处理装置,与系统调用处理装置相协作的业务程序运行在可信执行环境外的进程空间,系统内核可以更新运行在进程空间中的VDSO的数据段,具体地说是系统内核可以更新进程空间中的数据段中所存储的若干时间数据。
图7为本说明书实施例中提供的另一种面向可信执行环境的系统处理方法的流程示意图。该方法可以包括如图7所示步骤701至步骤7065中的部分或全部。
首先,在步骤701,系统调用处理装置向运行在进程空间中的业务程序发送调用请求。
接着,业务程序响应于接收的调用请求,执行步骤702,向系统调用处理装置发送进程空间中的VDSO的第一地址。
进程空间中还包括用于存储若干时间数据的数据段。
VDSO包括用于访问该数据段的若干系统调用函数。其中,若干系统调用函数可以包括如下各个系统调用函数中的一个或多个:vdso_clock_gettime、vdso_gettimeofday()、vdso_time()。
接着,在步骤703,系统调用处理装置根据第一地址在可信执行环境中加载VDSO,并获取可信执行环境中的VDSO所包括的若干系统调用函数各自对应的地址信息。
具体地,VDSO通常是ELF格式的,可以根据ELF格式信息以及VDSO在进程空间中的第一地址,在可信执行环境中加载VDSO。此外,还可以从ELF动态链接库中获取“.dynsym”符号表(Symbol table),然后从“.dynsym”符号表提取可信执行环境中的VDSO所包括的若干系统调用函数各自对应的地址信息,地址信息可以是相应系统调用函数在可信执行环境中的起始地址和地址长度。
接着,在步骤704,系统调用处理装置确定可信执行环境中的VDSO是否可信。如果可信执行环境中的VDSO可信,则执行步骤7051。
换而言之,需要确保可信执行环境中的VDSO并非可能会对可信执行环境带来安全风险的恶意计算机程序,当确定出可信执行环境中的VDSO并非恶意计算机程序时,确定可信执行环境中的VDSO可信。
经发明人对大量版本的VDSO进行分析,发现可信的VDSO对应的汇编指令需要满足如下条件:指令较为简单,通常仅包含部分指令和部分指令模式;除了RET指令外不包含其他间接控制转移指令;不会使用直接内存地址进行内存访问,通常仅包含三种模式的内存访问:读取或写入函数参数、读取VDSO的数据段,以及读取/写入合法的栈;循环或内部函数调用可以在循环内部或函数内部修改栈指针,但是栈指针被修改后必须在内部恢复;不包含对栈的缓冲区访问(buffer access),否则运行VDSO时可能存在缓冲区溢出或者栈溢出。
基于以上发现,可以针对VDSO的汇编指令,配置若干用于判断VDSO是否可信的至少一项预设条件。相应的,如图8所示,步骤704至少可以包括步骤7041:对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编,以获取若干系统调用函数各自对应的指令集。步骤7042,对若干系统调用函数中的任一当前系统调用函数递归地进行反汇编的过程中,在当前时刻获取的当前指令满足至少一项预设条件中的任一项时,确定可信执行环境中的VDSO不可信。
在一个示例中,具体可以根据可信执行环境中的VDSO所包括的若干系统调用函数各自对应的地址信息,对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编。
在一个示例中,至少一项预设条件包括以下各项预设条件中的一项或多项:当前指令为RET指令以外的控制转移指令、当前指令的寻址方式为直接寻址(即当前指令使用直接内存地址访问内存)、所述当前指令为未允许的指令/指令模式(即前述分析过程中所发现的VDSO并不包含的指令或指令模式)、对所述当前指令的反汇编存在错误(例如程序控制流跳转到已进行反汇编的指令)。
当成功获取若干系统调用函数各自对应的指令集,且VDSO并未被确定为不可信的情况下,还可以对若干系统调用函数各自对应的指令集进行进一步分析,以确定VDSO是否可信。具体地,参考图8,步骤704还可以包括:
步骤7043,遍历各个指令集中的任一当前指令集,利用当前指令集包括的指令构建以基本块(Basic Block)为节点、以控制转移为边(Edge)的控制流图(Control FlowGraph,CFG)。
基本块是具有一个入口并且具有一个出口的一组连续指令。
当前指令集中所有可能的基本块的入口可以包括:函数起始地址、直接控制转移指令的目标指令、条件控制转移指令的目标指令、条件控制转移指令的下一条指令以及函数调用指令。
当前指令集中所有可能的基本块的出口可以包括:基本块的入口的上一条指令、控制转移指令、函数调用指令以及程序返回指令。
基于以上描述的基本块的特点,步骤7043中具体可以通过对当前指令集进行一次或多次遍历来完成构建控制流图。举例来说,首先对当前指令集进行第一次遍历,标记所有可能的基本块的入口;然后对当前指令集进行第二次遍历,标记所有可能的基本块的出口;接着进行第三次遍历,根据控制转移信息对所有可能的基本块进行连边;最后,将入口基本块Entry与当前指令集的起始指令(即当前指令集对应的系统调用函数的起始指令)所在的基本块进行连边,将出口基本块Exit与当前指令集中的函数返回指令所在的基本块进行连边。
步骤7044,通过预定算法遍历处理控制流图,以确定当前指令集对应的系统调用函数是否为可信函数。
对于控制流图中作为节点的每个基本块,该基本块有一个输入状态IN和输出状态OUT,输入状态IN是进入基本块时的状态,输出状态OUT是退出基本块时的状态。输入状态和输出状态中包括各个寄存器的状态以及栈的状态,寄存器的状态是可能的值和类型的集合,栈的状态是栈内各个位置可能的值和类型的集合。初始状态时,初始化入口基本块Entry的输出状态OUT,将寄存器状态初始化为各个寄存器的初始值,将栈的状态初始化为空;初始状态时,寄存器和栈的状态是安全的,因为此时的状态是由可信执行环境中的计算机程序调用VDSO所包含的系统调用函数时所提供的。
在一个较为具体的示例中,预定算法可以包括改进的工作列表算法(Work listAlgorithm)。即步骤7044中可以通过改进的工作列表算法对当前指令集的控制流图进行数据流分析,从而实现检测出当前指令集对应的系统调用函数是否为可信函数。其中,改进的工作列表算法的算法流程如下:
Worklist Algorithm:{
OUT[Entry]=函数入口初始状态;
For(除了Entry基本块以外的每个基本块BB)
OUT[BB]=;
Worklist←所有基本块;
While(Worklist非空)
从Worklist中选择一个基本块BB;
old_OUT=OUT[BB];
IN[BB]=UBB的全部前驱节点P OUT[P];
模拟执行基本块BB,得到OUT[BB];
If(OUT[BB]≠old_OUT[BB])
将BB的所有后继节点添加到Worklist中
}.
参考前述的算法流程可知,改进的工作列表算法的每次循环中,需要检查基本块BB的所有前驱节点的输出状态OUT的栈的状态,确保其所有前驱节点的输出状态OUT的栈结构是一致的,不一致则验证失败,可以确定当前指令集对应的系统调用函数是不可信函数。换而言之,对于控制流图中的任一当前节点,如果当前节点的若干前驱节点的输出状态的栈结构不完全相同,则可确定当前指令集对应的系统调用函数为不可信函数。
在模拟执行基本块时,需要根据寄存器状态信息和栈状态信息检查内存访问是否合法,如果不合法则验证失败,可以确定当前指令集对应的系统调用函数是不可信函数。换而言之,通过预定算法遍历处理控制流图的过程中,对于控制流图中的任一当前节点,如果当前节点的内存访问不合法,则可确定当前指令集对应的系统调用函数为不可信函数。
需要说明的是,检查当前节点时可能无法得到内存是否合法的直接结论,此时说明内存访问可能不合法。如果内存访问可能不合法,则由寄存器状态信息和栈状态信息推测出内存访问类型(读取或写入函数参数、读取VDSO数据段,或者读取/写入合法的栈),并对当前节点进行记录,以便后续改写VDSO时对当前节点进行插桩,加入对内存地址范围的检查指令。
如果改进的工作列表算法成功运行结束,则检查出口基本块Exit的状态,以确定当前指令集对应的系统调用函数是否正确返回。如果是,可确定当前指令集对应的系统调用函数是可信函数,否则确定当前指令集对应的系统调用函数是不可信函数。
步骤7045,当不存在不可信函数时,确定可信执行环境中的VDSO可信。
换而言之,如果可信执行环境中的VSDO所包含的每个系统调用函数均未被确定为不可信函数,则可确定可信执行环境中的VDSO可信。
当确定可信执行环境中的VDSO可信时,回到图7,在步骤7051,确定第一地址和可信执行环境中的VDSO的第二地址的地址偏移量。在步骤7052,将地址偏移量写入FS段寄存器和/或GS段寄存器。在步骤7053,将可信执行环境中的VDSO对数据段的寻址方式,修改为通过FS段寄存器或者GS段寄存器进行寻址。
通过前述步骤7051至步骤7053,即完成了根据进程空间中的VDSO的第一地址以及可信执行环境中VDSO的第二地址,改写进程空间中的VDSO。
具体而言,VDSO被加载到可信执行环境之后,可信执行环境中的VDSO所包含的每个系统调用函数与进程空间中的数据段之间的地址偏移量发生了改变。将FS段寄存器和/或GS段寄存器设置为可信执行环境中的VDSO和进程空间中的VDSO的地址差值/地址偏移量,并将对可信执行环境中的VDSO对数据段的寻址方式修改为通过FS段寄存器或者GS段寄存器寻址,可以确保修改后的VDSO所包含的每个系统调用函数均能够正常的访问进程空间中的数据段。
需要说明的是,如果前述步骤7044中标记了可能存在内存访问不合法的情况,则修改VDSO时还可以对被标记的基本块(节点)所对应的代码段/指令段进行插桩,在该代码段进行内存访问之前检查要访问的内存地址是否在合法范围之内,确保要访问的内存地址在合法范围内的情况下才能进行后续处理,否则结束当前业务流程。
需要说明的是,改写可信执行环境中的VDSO(比如改写可信执行环境中的VDSO的寻址方式)可能改变了VDSO所包括的各个系统调用函数的大小。因此,还可以继续修改改写后的VDSO的ELF结构信息,比如在ELF结构信息中更新可信执行环境中的VDSO所包含的每个系统调用函数的大小。
需要说明的是,由于可信执行环境中的应用程序通常是基于操作系统提供的系统库(例如C标准库)开发的,因此可以配置改写后的VDSO的调用方式,使运行在可信执行环境中的应用程序能够通过系统库,向改写后的VDSO发起时间类系统调用请求。
在一些实施例中,可信执行环境中的应用程序也可通过系统调用处理装置直接调用改写后的VDSO。具体地,请继续参考图7。
在步骤7061,系统调用处理装置接收运行在可信执行环境中的应用程序发起的系统调用请求。
系统调用请求用于请求读取时间数据。
在步骤7062,系统调用处理装置向改写后的VDSO发送系统调用请求。
在步骤7063,改写后的VDSO根据系统调用请求从数据段存储的若干时间数据中读取当前时间数据。
在步骤7064,改写后的VDSO向系统调用处理装置返回当前时间数据。
在步骤7065,系统调用处理装置向应用程序提供当前时间数据。
基于图6和图7所示的实施例中,在可信执行环境中自适应的修改系统内核支持的VDSO,无需根据系统内核的版本来不断的更新计算机程序,兼容已发布的或者未来进行更新后得到的系统内核,技术方案的可维护性极好。
基于图6和图7所示的实施例中,改写后的VDSO是可信的,可以在可信执行环境中正常运行,且不会为可信执行环境带来安全风险。
与图6和图7所示方法实施例基于相同的构思,本说明书实施例中还提供了一种面向可信执行环境的系统调用处理装置,系统调用处理装置部署在可信执行环境中。如图9所示,该装置包括:信息获取单元901,用于获取可信执行环境外的内存区域中的VDSO的第一地址;其中,所述内存区域中还包括用于存储若干时间数据的数据段,VDSO包括若干用于访问所述数据段的系统调用函数。加载处理单元902,用于根据所述第一地址在可信执行环境中加载VDSO。修改处理单元903,用于根据所述第一地址以及可信执行环境中的VDSO的第二地址,修改可信执行环境中的VDSO对所述数据段的寻址方式;其中,修改后的VDSO具体用于接收可信执行环境中的应用程序发起的系统调用请求,根据所述系统调用请求从所述数据段存储的若干时间数据中读取当前时间数据,并向所述应用程序提供其读取的当前时间数据。
在一种可能的实施方式中,还包括:可信验证单元904,用于确定可信执行环境中的VDSO是否可信。
在一种可能的实施方式中,所述可信验证单元904,具体用于:对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编,以获取所述若干系统调用函数各自对应的指令集;其中,对所述若干系统调用函数中的任一当前系统调用函数递归地进行反汇编的过程中,在当前时刻获取的当前指令满足至少一项预设条件中的任一项时,确定可信执行环境中的VDSO不可信。
在一种可能的实施方式中,所述至少一项预设条件包括以下各项预设条件中的一项或多项:所述当前指令为RET指令以外的控制转移指令、所述当前指令的寻址方式为直接寻址、所述当前指令为未允许的指令、对所述当前指令的反汇编存在错误。
在一种可能的实施方式中,所述可信验证单元904,还用于遍历各个所述指令集中的任一当前指令集,利用所述当前指令集包括的指令构建以基本块为节点、以控制转移为边的控制流图,所述基本块是具有一个入口并且具有一个出口的一组连续指令;通过预定算法遍历处理所述控制流图,以确定所述当前指令集对应的系统调用函数是否为可信函数;当不存在不可信函数时,确定可信执行环境中的VDSO可信。
在一种可能的实施方式中,所述可信验证单元904,具体用于通过预定算法遍历处理所述控制流图的过程中,对于所述控制流图中的任一当前节点,如果所述当前节点的若干前驱节点的输出状态的栈结构不完全相同,确定所述当前指令集对应的系统调用函数为不可信函数。
在一种可能的实施方式中,所述可信验证单元904,具体用于在通过预定算法遍历处理所述控制流图的过程中,对于所述控制流图中的任一当前节点,如果所述当前节点的内存访问不合法,确定所述当前指令集对应的系统调用函数为不可信函数。
在一种可能的实施方式中,所述可信验证单元904,具体用于根据可信执行环境中的VDSO所包括的若干系统调用函数各自对应的地址信息,对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编。
在一种可能的实施方式中,所述修改处理单元903,具体用于确定所述第一地址和所述第二地址的地址偏移量;将所述地址偏移量写入FS段寄存器和/或GS段寄存器;将可信执行环境中的VDSO对所述数据段的寻址方式,修改为通过所述FS段寄存器或者GS段寄存器进行寻址。
在一种可能的实施方式中,所述系统调用请求的类型包括clock_gettime、gettimeofday、time。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本说明书所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能所对应的计算机程序存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令/代码进行传输,以便这些功能所对应的计算机程序被计算机执行时,通过计算机实现本说明书任意一个实施例中所述的方法。
本说明书实施例中还提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算设备中执行时,计算设备执行本说明书任意一个实施例中提供的面向可信执行环境的系统调用处理方法。
本说明书实施例中还提供了一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现本说明书任意一个实施例中提供的面向可信执行环境的系统调用处理方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例中相同、相似的部分互相参见即可,每个实施例中重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。
Claims (20)
1.一种面向可信执行环境的系统调用处理方法,包括:
获取可信执行环境外的内存区域中的虚拟动态共享对象VDSO的第一地址;其中,所述内存区域中还包括用于存储若干时间数据的数据段,VDSO包括若干用于访问所述数据段的系统调用函数;
根据所述第一地址在可信执行环境中加载VDSO;
根据所述第一地址以及可信执行环境中的VDSO的第二地址,修改可信执行环境中的VDSO对所述数据段的寻址方式;
通过修改后的VDSO接收可信执行环境中的应用程序发起的系统调用请求,根据所述系统调用请求从所述数据段存储的若干时间数据中读取当前时间数据,并向所述应用程序提供其读取的当前时间数据。
2.根据权利要求1所述的方法,其中,修改可信执行环境中的VDSO之前,还包括:确定可信执行环境中的VDSO是否可信。
3.根据权利要求2所述的方法,其中,确定可信执行环境中的VDSO是否可信,具体包括:对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编,以获取所述若干系统调用函数各自对应的指令集;其中,对所述若干系统调用函数中的任一当前系统调用函数递归地进行反汇编的过程中,在当前时刻获取的当前指令满足至少一项预设条件中的任一项时,确定可信执行环境中的VDSO不可信。
4.根据权利要求3所述的方法,其中,所述至少一项预设条件包括以下各项预设条件中的一项或多项:所述当前指令为RET指令以外的控制转移指令、所述当前指令的寻址方式为直接寻址、所述当前指令为未允许的指令、对所述当前指令的反汇编存在错误。
5.根据权利要求3所述的方法,其中,确定可信执行环境中的VDSO是否可信,还包括:
遍历各个所述指令集中的任一当前指令集,利用所述当前指令集包括的指令构建以基本块为节点、以控制转移为边的控制流图;其中,所述基本块是具有一个入口并且具有一个出口的一组连续指令;
通过预定算法遍历处理所述控制流图,以确定所述当前指令集对应的系统调用函数是否为可信函数;
当不存在不可信函数时,确定可信执行环境中的VDSO可信。
6.根据权利要求5所述的方法,其中,通过预定算法遍历处理所述控制流图,以确定所述当前指令集对应的系统调用函数是否为可信函数,具体包括:
通过预定算法遍历处理所述控制流图的过程中,对于所述控制流图中的任一当前节点,如果所述当前节点的若干前驱节点的输出状态的栈结构不完全相同,确定所述当前指令集对应的系统调用函数为不可信函数;
和/或,
通过预定算法遍历处理所述控制流图的过程中,对于所述控制流图中的任一当前节点,如果所述当前节点的内存访问不合法,确定所述当前指令集对应的系统调用函数为不可信函数。
7.根据权利要求3所述的方法,其中,对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编,具体包括:根据可信执行环境中的VDSO所包括的若干系统调用函数各自对应的地址信息,对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编。
8.根据权利要求1所述的方法,其中,根据所述第一地址以及可信执行环境中的VDSO的第二地址,修改可信执行环境中的VDSO对所述数据段的寻址方式,具体包括:
确定所述第一地址和所述第二地址的地址偏移量;
将所述地址偏移量写入FS段寄存器和/或GS段寄存器;
将可信执行环境中的VDSO对所述数据段的寻址方式,修改为通过所述FS段寄存器或者GS段寄存器进行寻址。
9.根据权利要求1至8中任一项所述的方法,其中,所述系统调用请求的类型包括clock_gettime、gettimeofday、time。
10.一种面向可信执行环境的系统调用处理装置,包括:
信息获取单元,用于获取可信执行环境外的内存区域中的虚拟动态共享对象VDSO的第一地址;其中,所述内存区域中还包括用于存储若干时间数据的数据段,VDSO包括若干用于访问所述数据段的系统调用函数;
加载处理单元,用于根据所述第一地址在可信执行环境中加载VDSO;
修改处理单元,用于根据所述第一地址以及可信执行环境中的VDSO的第二地址,修改可信执行环境中的VDSO对所述数据段的寻址方式;其中,修改后的VDSO具体用于接收可信执行环境中的应用程序发起的系统调用请求,根据所述系统调用请求从所述数据段存储的若干时间数据中读取当前时间数据,并向所述应用程序提供其读取的当前时间数据。
11.根据权利要求10所述的装置,其中,还包括:可信验证单元,用于确定可信执行环境中的VDSO是否可信。
12.根据权利要求11所述的装置,其中,所述可信验证单元具体用于:对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编,以获取所述若干系统调用函数各自对应的指令集;其中,对所述若干系统调用函数中的任一当前系统调用函数递归地进行反汇编的过程中,在当前时刻获取的当前指令满足至少一项预设条件中的任一项时,确定可信执行环境中的VDSO不可信。
13.根据权利要求12所述的装置,其中,所述至少一项预设条件包括以下各项预设条件中的一项或多项:所述当前指令为RET指令以外的控制转移指令、所述当前指令的寻址方式为直接寻址、所述当前指令为未允许的指令、对所述当前指令的反汇编存在错误。
14.根据权利要求12所述的装置,其中,所述可信验证单元具体用于遍历各个所述指令集中的任一当前指令集,利用所述当前指令集包括的指令构建以基本块为节点、以控制转移为边的控制流图,所述基本块是具有一个入口并且具有一个出口的一组连续指令;通过预定算法遍历处理所述控制流图,以确定所述当前指令集对应的系统调用函数是否为可信函数;当不存在不可信函数时,确定可信执行环境中的VDSO可信。
15.根据权利要求14所述的装置,其中,
所述可信验证单元,具体用于在通过预定算法遍历处理所述控制流图的过程中,对于所述控制流图中的任一当前节点,如果所述当前节点的若干前驱节点的输出状态的栈结构不完全相同,确定所述当前指令集对应的系统调用函数为不可信函数;
和/或,
所述可信验证单元,具体用于在通过预定算法遍历处理所述控制流图的过程中,对于所述控制流图中的任一当前节点,如果所述当前节点的内存访问不合法,确定所述当前指令集对应的系统调用函数为不可信函数。
16.根据权利要求12所述的装置,其中,所述可信验证单元,具体用于根据可信执行环境中的VDSO所包括的若干系统调用函数各自对应的地址信息,对可信执行环境中的VDSO所包括的若干系统调用函数递归地进行反汇编。
17.根据权利要求10所述的装置,其中,所述修改处理单元,具体用于确定所述第一地址和所述第二地址的地址偏移量;将所述地址偏移量写入FS段寄存器和/或GS段寄存器;将可信执行环境中的VDSO对所述数据段的寻址方式,修改为通过所述FS段寄存器或者GS段寄存器进行寻址。
18.根据权利要求10至17中任一项所述的装置,其中,所述系统调用请求的类型包括clock_gettime、gettimeofday、time。
19.一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算设备中执行时,计算设备执行权利要求1-9中任一项所述的方法。
20.一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现权利要求1-9中任一项所述的方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210396789.1A CN114661380A (zh) | 2020-12-31 | 2020-12-31 | 面向可信执行环境的系统调用处理方法及装置 |
CN202011638265.6A CN112685101B (zh) | 2020-12-31 | 2020-12-31 | 面向可信执行环境的系统调用处理方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011638265.6A CN112685101B (zh) | 2020-12-31 | 2020-12-31 | 面向可信执行环境的系统调用处理方法及装置 |
Related Child Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210396789.1A Division CN114661380A (zh) | 2020-12-31 | 2020-12-31 | 面向可信执行环境的系统调用处理方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112685101A CN112685101A (zh) | 2021-04-20 |
CN112685101B true CN112685101B (zh) | 2022-04-12 |
Family
ID=75456639
Family Applications (2)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011638265.6A Active CN112685101B (zh) | 2020-12-31 | 2020-12-31 | 面向可信执行环境的系统调用处理方法及装置 |
CN202210396789.1A Pending CN114661380A (zh) | 2020-12-31 | 2020-12-31 | 面向可信执行环境的系统调用处理方法及装置 |
Family Applications After (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210396789.1A Pending CN114661380A (zh) | 2020-12-31 | 2020-12-31 | 面向可信执行环境的系统调用处理方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (2) | CN112685101B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113239329B (zh) * | 2021-04-19 | 2024-03-19 | 南京大学 | 一种用于移动端应用程序的可信执行环境的实现系统 |
CN118034615A (zh) * | 2024-04-12 | 2024-05-14 | 阿里云计算有限公司 | 数据访问方法以及装置 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111506915A (zh) * | 2019-01-31 | 2020-08-07 | 阿里巴巴集团控股有限公司 | 授权访问的控制方法、装置和系统 |
WO2020161622A1 (en) * | 2019-02-05 | 2020-08-13 | Rezilion Ltd | Automatic mitigation of corrupted or compromised compute resources |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB2568527B (en) * | 2017-11-20 | 2020-04-15 | Trustonic Ltd | Address layout varying process |
-
2020
- 2020-12-31 CN CN202011638265.6A patent/CN112685101B/zh active Active
- 2020-12-31 CN CN202210396789.1A patent/CN114661380A/zh active Pending
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111506915A (zh) * | 2019-01-31 | 2020-08-07 | 阿里巴巴集团控股有限公司 | 授权访问的控制方法、装置和系统 |
WO2020161622A1 (en) * | 2019-02-05 | 2020-08-13 | Rezilion Ltd | Automatic mitigation of corrupted or compromised compute resources |
Also Published As
Publication number | Publication date |
---|---|
CN114661380A (zh) | 2022-06-24 |
CN112685101A (zh) | 2021-04-20 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Balasubramanian et al. | System programming in rust: Beyond safety | |
KR102255767B1 (ko) | 가상 머신 감사를 위한 시스템 및 방법들 | |
US11301375B2 (en) | Reducing synchronization reliance in marking | |
CN109918919B (zh) | 认证变量的管理 | |
Williams et al. | Device Driver Safety Through a Reference Validation Mechanism. | |
JP6083097B2 (ja) | ハードウェア保護アプリケーションのシステム・サービス要求相互作用を容易化する方法 | |
Volckaert et al. | Cloning your gadgets: Complete ROP attack immunity with multi-variant execution | |
Zimmer et al. | Beyond BIOS: developing with the unified extensible firmware interface | |
US9098300B2 (en) | Providing silicon integrated code for a system | |
BRPI0618027A2 (pt) | configuração de extensões isoladas e acionadores de dispositivo | |
BR112014031354B1 (pt) | Controle seletivo de execução de instrução em processamento transacional | |
US9208292B2 (en) | Entering a secured computing environment using multiple authenticated code modules | |
BR112014031435B1 (pt) | Teste randomizado dentro de execução transacional | |
CN112685101B (zh) | 面向可信执行环境的系统调用处理方法及装置 | |
US9111096B2 (en) | System and method for preserving and subsequently restoring emulator state | |
US11972777B2 (en) | Reader bias based locking technique enabling high read concurrency for read-mostly workloads | |
US20120222051A1 (en) | Shared resource access verification | |
JP2011508308A (ja) | オンチップデバイス管理のためのノウングットコード | |
US10223163B2 (en) | Workflow-based object destruction | |
US10540193B2 (en) | Software-defined microservices | |
JP6769999B2 (ja) | セキュア計算環境 | |
TWI603199B (zh) | 基於能力的裝置驅動程式架構 | |
US12001870B2 (en) | Injection and execution of workloads into virtual machines | |
WO2023045744A1 (zh) | 加固方法、注册方法、运行方法、电子设备和存储介质 | |
Kotovsky | How to Develop Embedded Software Using the QEMU Machine Emulator |
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 |