1.本说明书一个或多个实施例涉及虚拟机和安全容器领域,尤其涉及一种程序调用宿主机函数的方法和一种程序运行系统。
背景技术:2.如前所述,目前很多行业中利用云计算进行业务和生产活动。在云计算场景中,常常会通过在虚拟机或容器中运行应用来向用户提供服务。但是,虚拟机或容器中的第三方应用对于主机计算资源的直接访问,常常会给主机带来的系统性的安全风险。目前,一些不同的云计算服务商采用了不同的技术方案来克服上述的系统安全风险。
技术实现要素:3.本说明书中的实施例旨在提供一种程序调用宿主机函数的方法、以及一种程序运行系统。通过该方法大大减少应用程序对于宿主机操作系统的系统调用,降低应用运行过程中的系统安全风险。并且,无需拦截应用的系统调用,没有因拦截系统调用带来的性能消耗,解决现有技术中的不足。
4.根据第一方面,提供了一种程序调用宿主机函数的方法,包括:获取并执行第一程序,所述第一程序包括对于程序虚拟机的第一函数接口的调用;其中,所述程序虚拟机中设有第一接口集合,其中包括多个接口,所述多个接口分别对应于预先设定的宿主机api函数子集中的宿主机api函数,所述第一函数接口属于所述第一接口集合;在所述第一函数接口被调用后,所述程序虚拟机将所述第一函数接口对应的宿主机api函数的访问,发送到运行于宿主机用户态的第一os内核,所述第一os内核预设有第一函数集合;所述第一os内核确定第一函数集合中是否包括所述宿主机api函数对应的第二函数;若确定结果为否,将所述访问转发到运行于宿主机内核态的第二os内核。
5.在一种可能的实施方式中,所述方法还包括:若确定结果为是,所述第一os内核根据所述访问,执行第二函数。
6.在一种可能的实施方式中,所述第一程序根据预先获取的源代码,通过预设的第一编译器,基于程序虚拟机的虚拟指令集生成。
7.在一种可能的实施方式中,所述第一程序经由所述第一编译器的编译,而被施加有预设的内存访问限制。
8.在一种可能的实施方式中,所述内存访问限制包括禁止第一程序访问所述程序虚拟机和所述第一os内核的运行空间。
9.在一种可能的实施方式中,所述内存访问限制包括禁止访问宿主机的内核空间。
10.在一种可能的实施方式中,所述程序虚拟机为字节码虚拟机。
11.根据第二方面,提供一种虚拟机程序运行系统,包括:
程序虚拟机,所述程序虚拟机中设有第一接口集合,所述第一接口集合中包括多个接口,所述多个接口分别对应于预先设定的宿主机api函数子集中的宿主机api函数,所述第一接口集合包括所述第一函数接口;第一os内核,所述第一os内核运行于宿主机用户态,并预设有第一函数集合;所述程序虚拟机,还用于在第一程序调用第一函数接口后,将所述第一函数接口对应的宿主机api函数的访问,发送到所述第一os内核;所述第一os内核,还用于确定第一函数集合中是否包括所述宿主机api函数对应的第二函数;若确定结果为否,将所述访问转发到运行于宿主机内核态的第二os内核。
12.在一种可能的实施方式中,所述第一os内核,还用于若确定结果为否,根据所述访问,执行第二函数。
13.在一种可能的实施方式中,所述第一程序根据预先获取的源代码,通过预设的第一编译器,基于第一程序虚拟机的虚拟指令集生成。
14.在一种可能的实施方式中,所述第一程序经由所述第一编译器的编译,而被施加有预设的内存访问限制。
15.在一种可能的实施方式中,所述内存访问限制包括禁止第一程序访问所述程序虚拟机和所述第一os内核的运行空间。
16.在一种可能的实施方式中,所述内存访问限制包括禁止访问宿主机的内核空间。
17.在一种可能的实施方式中,所述程序虚拟机为字节码虚拟机。
18.根据第三方面,提供了一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行第一方面所述的方法。
19.根据第四方面,提供了一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现第一方面所述的方法。
20.利用以上各个方面中的方法、装置、计算设备、存储介质中的一个或多个,可以降低应用运行过程中的系统安全风险以及性能消耗。
附图说明
21.为了更清楚说明本发明实施例的技术方案,下面将对实施例描述中所需使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
22.图1示出一种程序进行系统调用的方法的示意图;图2示出另一种程序进行系统调用的方法的示意图;图3示出根据本说明书实施例的一种程序调用宿主机函数的方法的原理示意图;图4示出根据本说明书实施例的一种程序调用宿主机函数的方法的流程图;图5示出根据本说明书实施例的一种程序运行系统的结构图。
具体实施方式
23.下面将结合附图,对本发明书提供的方案进行描述。
24.如前所述,目前很多行业中利用云计算服务进行业务和生产活动。在云计算服务中,常常通过将一个规模较大的应用拆成多个函数级别的服务,通过服务之间的相互调用,
在实现应用功能的同时提供更好的服务弹性。其中,每个服务的实例可以运行在一个容器实例里面,可以更加快速的扩容或者缩减,从而提供用户高性能和按需使用的服务方式。在一种技术方案中,被拆分出来的服务运行在容器里面,其中第三方的函数可以直接访问主机资源。其存在的问题是,对于主机资源的直接访问,给云计算服务的提供商带来了很大的系统安全风险。所以,云计算服务提供者或运营者需要避免第三方应用直接访问其主机资源,避免应用的恶意操作对整个系统带来的安全风险。其中,用户程序通常通过系统调用来调用操作系统的内核功能,作为操作系统内核暴露给用户的接口,系统调用被使用的数量越多、种类越广,应用程序攻击系统的机会就越高,给主机系统带来危害的可能性就越大。
25.为了减少通过系统调用带来的风险,一些云计算服务运营者采用了新的技术方案。图1示出一种程序进行系统调用的方法的示意图。图1中所示的方案,主要通过基于硬件虚拟化技术实现的虚拟机,实现虚拟机中应用对于主机硬件资源访问的隔离。并将虚拟机中(也可以是在一个虚拟机中支持的若干容器中)的应用(app)发起的系统调用,在虚拟机中全部拦截,然后转发给虚拟机中的客户端操作系统内核进行处理,而不是被发送到物理机的操作系统内核处理。通过这种方法,可以阻断虚拟机中应用对于物理主机系统的系统调用,防止其对主机系统带来危害。
26.图2示出另一种程序进行系统调用的方法的示意图。与图1中所示的方案不同的是,该方案并不通过虚拟机来进行主机硬件资源的隔离。其主要思想是,拦截应用程序的所有系统调用,然后发往一个运行在宿主机上的用户态的操作系统(os)内核,该用户态内核可以执行其中大部分的系统调用,并将其余的系统调用,发送到宿主机本身的操作系统内核(运行在宿主机内核态的os内核)进行处理。通过这种方法,可以减少宿主机内核处理的系统调用的数量和种类,降低应用程序攻击系统的机会,进而降低应用程序给系统带来危害的可能性。
27.但是,以上的两种方案中均存在的问题在于,它们都需要在不同系统级别,例如在虚拟机中或在宿主机上,截获应用的所有系统调用并转发到不同目标组件进行处理,而大量系统调用的拦截和转发会带来的较大的性能消耗。
28.为了在保证主机系统的安全性的同时,减少应用的系统调用过程中的性能消耗,本说明书实施例提供了一种程序调用宿主机函数的方法。图3示出根据本说明书实施例的一种程序调用宿主机函数的方法的原理示意图。如图3所示,首先,获取应用程序的源代码。在不同的实施例中,程序源代码可以使用不同的编程语言编写,本说明书对此不作限制。通过预设的编译器,将源代码编译为一种中间表示ir(intermediate representation)形式的应用(app),该app可以运行于一种预设的程序虚拟机之上(或者说,该app的运行依赖于这种程序虚拟机)。该程序虚拟机可以提供一部分操作系统api(application programming interface,应用程序编程接口)函数对应的接口,以供依赖于该程序虚拟机运行的app调用。当app在执行过程中调用上述的接口时,程序虚拟机可以将该调用转发给一个预先运行在宿主机用户态的操作系统内核(为方便描述,本说明书也称该用户态内核为第一os内核)。第一os内核中可以具有第一函数集合,如果被调用的api函数在第一函数集合中具有对应的函数,则该用户态内核直接执行该对应函数。如果app的调用的api函数在第一函数集合中没有对应的函数,则该内核将该api函数的调用发送给宿主机本身的操作系统内核(及运行在宿主机内核态的操作系统内核,为方便描述,本说明书也称之为第二os内核),并
由该第二os内核执行该api函数。
29.该方法具有如下优点:一方面,现有的云计算方案中,app通常由二进制机器码构成,其可以通过访问系统api函数,直接进行系统调用。因此,为了防止应用直接系统调用带来的危险,提高系统安全性,无论是图1所示中基于虚拟机的进行系统调用的方案或图2所示中基于用户态内核进行系统调用的方案,均拦截了app的全部的直接系统调用并转发处理,但是,大量拦截系统调用并进行转发会带来大量的性能消耗。而本说明书实施例提供的程序调用宿主机函数的方案中,由于中间表示ir形式的app本质上是由程序虚拟机的虚拟指令构成,它本身不具有直接访问系统api函数的能力,而只能通过调用程序虚拟机提供的接口来间接访问系统的api函数,也就不需要拦截app的直接系统调用以及进行转发。因此,采用这种方法不存在拦截系统调用、以及进行系统调用转发的性能消耗。第二方面,由于应用需要通过虚拟机接口才能间接进行系统调用,换言之,应用只能在虚拟机提供的对应接口范围内进行系统调用,虚拟机提供多少种类的系统调用的接口,应用只能间接的进行多少种类的系统调用。因此,可以通过限制虚拟机接口对应的系统调用的种类,降低app可以进行的间接系统调用的范围,减少对于os内核的最终系统调用的数量,减少由此带来的系统风险。第三方面,由于虚拟机首先将api函数的调用发往用户态内核,在用户态内核可以执行该函数调用时直接通过用户态内核执行函数,只有在用户态内核不能执行该调用时才将调用转发真正的宿主机内核执行,降低对于真正的宿主机内核的系统调用的数量,减少了由此带来的系统风险。在此基础上,可以对于用户态内核可以执行的api函数的种类进行调整,进一步降低对于真正的宿主机内核的系统调用的数量。
30.下面进一步阐述该方法的详细过程。图4示出根据本说明书实施例的一种程序调用宿主机函数的方法的流程图。如图4所述,该方法至少包括如下步骤:步骤21,获取并执行第一程序,所述第一程序包括对于程序虚拟机的第一函数接口的调用;其中,所述程序虚拟机中设有第一接口集合,其中包括多个接口,所述多个接口分别对应于预先设定的宿主机api函数子集中的宿主机api函数,所述第一函数接口属于所述第一接口集合;步骤22,在所述第一函数接口被调用后,所述程序虚拟机将所述第一函数接口对应的宿主机api函数的访问,发送到运行于宿主机用户态的第一os内核,所述第一os内核预设有第一函数集合;步骤23,所述第一os内核确定第一函数集合中是否包括所述宿主机api函数对应的第二函数;若确定结果为否,将所述访问转发到运行于宿主机内核态的第二os内核。
31.首先,在步骤21,获取并执行第一程序。
32.第一程序是由程序虚拟机的虚拟指令构成的、依赖于程序虚拟机运行的中间语言(ir形式)程序。第一程序中,可以包括对于程序虚拟机中的函数接口(例如第一函数接口)的调用。在一个实施例中,所述第一程序可以根据预先获取的源代码,通过预设的第一编译器,基于程序虚拟机的虚拟指令集生成。在不同的实施例中,第一程序可以是用于不同具体业务目的的、不同的具体程序,本说明书对此不做限定。
33.虚拟机(virtual machine),通常是指一种通过软件模拟的仿真计算机系统。一般而言,虚拟机可以分为系统虚拟机和程序虚拟机。系统虚拟机,通常是指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统,在该计算机系统
中支持执行完整的操作系统(os)。典型的系统虚拟机例如包括visual box、vmware,它们可以是对物理计算机的仿真,提供了一个可运行完整操作系统的软件平台。此外,例如图1所示方案中的虚拟机即为系统虚拟机,系统虚拟机通常通过硬件虚拟化功能实现。程序虚拟机,或称为编程语言层虚拟机,其目的是提供独立于平台的编程环境,该环境抽象出底层硬件或操作系统的详细信息,并允许程序在任何平台上以相同的方式,通过解释或即时编译技术(just-in-time,jit)来运行语言虚拟机指令,从而实现应用的跨平台特性。程序虚拟机的典型代表例如包括java虚拟机,它专门为执行单个计算机程序而设计,并不提供完整的操作系统(os)功能支持。该步骤中,第一程序赖以运行的为程序虚拟机,在不同的实施例中,其可以是不同的具体的程序虚拟机,本说明书对此不做限制。在一个实施例中,该程序虚拟机可以为字节码虚拟机。通常,程序虚拟机或系统虚拟机可以安装于主机之上,该主机也称之为宿主机。在不同的实施例中,可以采用不同具体类型的宿主机。在一个实施例中,宿主机可以是物理机、云主机或云服务器中的一种。
34.该程序虚拟机中,可以设有第一接口集合,其中包括多个接口,所述多个接口分别对应于预先设定的宿主机api函数子集中的宿主机api函数,上述的第一函数接口属于所述第一接口集合。如上所述,第一程序本身不具有直接访问系统api的能力,而只能通过调用程序虚拟机提供的接口来间接访问系统api,因此,可以通过限制程序虚拟机提供的接口,限制第一程序能够间接访问的系统api的种类。在不同的实施例中,程序虚拟机中的第一接口集合,可以对应于不同的宿主机api函数子集,本说明书对此不做限制。在一个实施例中,可以根据确定出宿主机所有api函数的安全等级,然后根据各个api函数的安全等级,确定是否在程序虚拟机中提供api函数的对应接口。在不同的具体实施例中,可以根据不同的具体方式,确定api函数的安全等级,本说明书对此不做限制。
35.为了进一步提高第一程序的安全性,可以在将源代码编译为第一程序过程中,对于源代码中的内存访问逻辑进行检查,并基于检查结果,防止生成的第一程序的访问不安全的内存区域。因此,在一个实施例中,第一程序可以经由所述第一编译器的编译,而被施加有预设的内存访问限制。在一个具体的实施例中,所述内存访问限制可以包括禁止第一程序访问所述程序虚拟机和所述第一os内核的运行空间。在另一个具体的实施例中,所述内存访问限制可以包括禁止访问宿主机的内核空间。
36.在第一函数接口被调用后,在步骤22,程序虚拟机将所述第一函数接口对应的宿主机api函数的访问,发送到运行于宿主机用户态的第一os内核。
37.该步骤中,当执行第一程序的过程中调用第一函数接口后,程序虚拟机将所述第一函数接口对应的宿主机api函数的访问,发送到宿主机用户态的第一os内核。
38.os内核,通常是指一个操作系统的核心,是基于硬件的首层软件扩充,提供操作系统的最基本的功能,一般而言,它例如负责管理系统的进程、内存、设备驱动程序、文件和网络系统等。通常,os内核运行于宿主机cpu的内核态(kernel mode),或简称,运行于宿主机内核态。普通应用程序则运行于宿主机cpu的用户态(user mode),或简称,运行于宿主机用户态。与此不同的是,第一os内核,并不是运行于宿主机内核态的、宿主机操作系统本身的内核,而是一个运行在宿主机用户态的、且不依赖于硬件虚拟化技术的操作系统内核,该内核不一定实现宿主机本身内核的全部功能,可以只实现宿主机本身内核的部分功能。
39.如前所述,现有的基于用户态内核的程序进行系统调用的方案,通常是拦截应用
对于操作系统的所有系统调用,并转交给用户态内核来进行,用户态内核对于这些系统调用中的一部分,可以由其本身来完成,并将其余的部分发送给宿主机的操作系统内核(宿主机内核态)来完成。与此不同的是,本说明书实施例提供的程序进行系统调用的方案中,应用不会直接发起对于操作系统内核的系统调用,所以无需拦截对于操作系统的直接调用再转发给第一os内核,程序虚拟机可以将应用通过其虚拟机接口发送的系统调用,发送给第一os内核。这大大减少了由于拦截所有系统调用以及转发带来的性能消耗。
40.此后,在步骤43,第一os内核确定第一函数集合中是否包括,所述宿主机api函数对应的第二函数;若确定结果为否,将所述访问转发到运行于宿主机内核态的第二os内核。
41.如上所述,第一os内核是运行在宿主机用户态的os内核,其可以实现宿主机内核的部分功能,因此,第一os内核中可以预设有第一函数集合,第一函数集合中的函数可以分别具有对应的宿主机api函数(即宿主机操作系统的api函数)。或者说,第一函数集合本质上是运行于宿主机内核态的宿主机操作系统的一部分api函数在第一os内核中的对应函数的集合。
42.该步骤中,第一os内核可以确定第一函数集合中,是否具有与第一函数接口对应的宿主机api函数对应的第二函数。具体的,第二函数可以是第一os内核中实现该宿主机api函数相同功能的函数。如果第一函数集合中没有与该第二函数,则第一os内核将对于该宿主机api函数的访问,转发到第二os内核。
43.第二os内核,是运行于宿主机内核态的os内核,也就是真正意义上宿主机本身的操作系统内核。如前所述,第一os内核只是运行在宿主机用户态,且可以仅实现部分内核功能。因此,当第一os内核确定其不能执行被调用的宿主机api函数时,可以将对于该宿主机api函数的调用转发到第二os内核执行。
44.在一个实施例中,第二os内核可以通过seccomp(安全计算模式,secure computing mode)对于第一os内核转发的、对于所述宿主机api函数的系统调用进行安全检测,并在检测通过后,执行该api函数,本说明书对于采用何种具体方式配置seccomp,不做限定。
45.如果第一os内核实现了被调用的api函数的功能,其也可以直接执行第一os内核中该api函数的对应函数。因此,在一个实施例中,若上述确定结果为是,即第一函数集合中包括所述第二函数,则第一os内核可以根据对于所述宿主机api函数的访问,执行第二函数。在一个具体的实施例中,可以根据该访问的具体参数,执行第二函数,并将执行结果返回程序虚拟机。
46.根据又一方面的实施例,还提供一种虚拟机程序运行系统。图5示出根据本说明书实施例的一种虚拟机程序运行系统的结构图,如图5所示,该装置500包括:程序虚拟机51,所述程序虚拟机中设有第一接口集合,所述第一接口集合中包括多个接口,所述多个接口分别对应于预先设定的宿主机api函数子集中的宿主机api函数,所述第一接口集合包括所述第一函数接口;第一os内核52,所述第一os内核运行于宿主机用户态,并预设有第一函数集合;所述程序虚拟机,还用于在第一程序调用第一函数接口后,将所述第一函数接口对应的宿主机api函数的访问,发送到所述第一os内核;所述第一os内核,还用于确定第一函数集合中是否包括所述宿主机api函数对应
的第二函数;若确定结果为否,将所述访问转发到运行于宿主机内核态的第二os内核。
47.在一个实施例中,所述第一os内核,还可以用于若确定结果为否,根据所述访问,执行第二函数。
48.在一个实施例中,第一程序可以根据预先获取的源代码,通过预设的第一编译器,基于第一程序虚拟机的虚拟指令集生成。
49.在一个实施例中,第一程序可以经由所述第一编译器的编译,而被施加有预设的内存访问限制。
50.在一个实施例中,所述内存访问限制可以包括禁止第一程序访问所述程序虚拟机和所述第一os内核的运行空间。
51.在一个实施例中,所述内存访问限制可以包括禁止访问宿主机的内核空间。
52.在一个实施例中,所述程序虚拟机可以为字节码虚拟机。
53.本说明书又一方面提供一种计算机可读存储介质,其上存储有计算机程序,当所述计算机程序在计算机中执行时,令计算机执行上述任一项方法。
54.本说明书再一方面提供一种计算设备,包括存储器和处理器,所述存储器中存储有可执行代码,所述处理器执行所述可执行代码时,实现上述任一项方法。
55.需要理解,本文中的“第一”,“第二”等描述,仅仅为了描述的简单而对相似概念进行区分,并不具有其他限定作用。
56.本领域技术人员应该可以意识到,在上述一个或多个示例中,本发明所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读介质中或者作为计算机可读介质上的一个或多个指令或代码进行传输。
57.以上所述的具体实施方式,对本发明的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上所述仅为本发明的具体实施方式而已,并不用于限定本发明的保护范围,凡在本发明的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本发明的保护范围之内。