一种在Java虚拟机中安全运行第三方代码的方法技术

技术编号:8271636 阅读:181 留言:0更新日期:2013-01-31 03:57
本发明专利技术公开了一种利用JVM提供的自定义类加载器的技术实现安全运行不可控的第三方代码的方法。通过控制第三方代码中可以使用的本地模块和类,可以有效限制其对外部资源的访问,同时也可以隔离多个同时运行的第三方代码。本发明专利技术也提供了在第三方代码中以可控的方式透明访问本地资源的方法。

【技术实现步骤摘要】
本专利技术涉及信息安全领域,特别涉及一种安全运行不可控的第三方代码的方法。
技术介绍
软件或服务器往往需要允许用户执行自定义的代码以实现高度的可定制性或安全性。但是由于第三方编写的代码的不可控性,限制其运行环境以保护服务器资源或上层软件的正常运行就成了一个很重要的问题。JVM是Java Virtual Machine (Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码·时,实际上最终还是把字节码解释成具体平台上的机器指令执行。在JVM中使用一个类时,该类的加载过程是唯一可以在外部进行干预的,这可以通过JVM提供的自定义类加载器来实现。通常JVM中引入自定义类加载器的主要目的是实现代码的热部署,如OSGi系统等。OSGi (Open Service Gateway Initiative)技术是面向Java的动态模型系统。OSGi服务平台向Java提供服务,这些服务使Java成为软件集成和软件开发的首选环境。OSGi技术提供允许应用程序使用精炼、可重用和可协作的组件构建的标准化原语。这些组件能够组装进一个应用和部署中。JVM虚拟机提供的安全性主要通过虚拟机的安全策略文件实现,通过安全策略文件控制JVM中类对资源的访问(如文件系统和网络资源等)。但是在实际应用中,往往需要控制第三方代码本身不能直接访问一些外部资源(如文件、网络和一些本地模块的加载等),但是可以通过调用本地提供的方法来访问,而且JVM同时运行多个不同的第三方代码时还要实现代码间的相互隔离,这时只通过在JVM启动时静态地提供一个安全策略文件很难实现。
技术实现思路
有鉴于此,本专利技术提供了一种在JVM上安全运行第三方代码的方法,利用JVM提供的自定义类加载器的技术来控制第三方代码的本地模块和类的加载,只允许第三方代码加载和使用系统提供的已封装好业务逻辑的类,第三方代码对外部资源的访问只能通过上述系统提供的已封装好的业务逻辑类的接口执行,第三方代码本身不能直接访问外部资源,从而实现安全访问外部资源。根据本专利技术,提供一种在Java虚拟机中安全运行第三方类的方法,该方法包括 创建自定义加载器,所述自定义加载器的父加载器为Java虚拟机当前线程的类加载器; 通过所述自定义加载器来加载第三方类,由所述自定义加载器判断是否允许所述第三方类加载特定的系统类;如果允许,则所述自定义加载器委托其父加载器加载所述系统类; 若不允许,则抛出异常,从而控制所述第三方类中所能使用的类。根据本专利技术的一个方面,根据需要,能够同时创建多个所述自定义加载器以执行多份所述第三方类。根据本专利技术的一个方面 ,关于所述第三方类所允许访问的类和/或所不允许访问的类的信息存放在所述自定义类加载器能够找到的存放位置。根据本专利技术的一个方面,所述信息存放在特定文件中,或所述信息存放在数据库中,或所述信息直接写入在程序代码中。根据本专利技术的一个方面,所述自定义类加载器加载所述第三方类时,确定所述第三方类可使用和/或不可使用的类。根据本专利技术的一个方面,如果所述自定义加载器判断出所述第三方类加载不允许加载的类时,抛出异常。根据本专利技术的一个方面,分别采用不同的加载器来分别加载所述第三方类以防止恶意访问。附图说明图I为按照本专利技术的一种在JVM上安全运行第三方代码的方法的一优选实施例的流程示意图。图2为图I所示实施例中结构框图。具体实施例方式当JVM需要加载第三方代码时,创建一个自定义的类加载器,其父加载器设置为JVM当前线程的默认类加载器(根据本专利技术的一个实施例,通常就是SystemClassLoader),通过自定义类加载器的一个实例来加载第三方代码。在自定义类加载器中通过一个可使用类的列表(或不可使用类的列表)来控制第三方代码中外部类的使用,自定义类加载器的功能如下 1、对于允许使用的本地模块中的类(如java.lang. String等,所有的java类都要继承java. lang. Object类,下面不再赘述),直接委托其父加载器(SystemClassLoader)执行,这也是JVM类加载器的默认行为,由此第三方代码可以正常使用这些类; 2、对于不允许使用的本地模块中的类(如java.net. *和java. io. *等),自定义类加载器将直接抛出ClassNotFound异常; 3、需要访问外部资源的业务逻辑封装于单独的功能类中(下文称为Function类),自定义类加载器将直接由其父加载器加载Function类,由此Function类中再加载使用其它类时(如java. net. *等限制第三方代码使用的类)将直接使用父加载器,从而安全地绕过自定义类加载器的限制。如此便可以实现第三方代码本身只能使用允许的类,可以轻易地断绝其访问外部资源(此处指所有不允许访问的资源包含虚拟机自身内存等)的途径,同时可以通过Function类提供的高级接口以可控的方式访问外部资源。通常JVM提供的非访问外部资源的类可以由第三方代码安全调用,如java. lang.String以及java. math模块中的等大部分的类都是如此。对待这些类的加载,根据本专利技术的一个是实施例,自定义的类加载器MyClassLoader的行为即是JVM类加载器的默认行为,即双亲代理模式(即,优先委托自己的父加载器加载,父加载器不能加载时才自己加载。)。而对于java. io、java. net以及java. thread等模块中的类,自定义类加载器将会打破JVM的默认行为,从而拒绝加载这些类;自定义类加载器正常(委托其父加载器)加载Function类后,Function类便属于自定义类加载器的父加载器,所以Function类中的类加载将由自定义类加载器的父加载器负责,从而可以在Function中实现访问外部资源实现业务逻辑,Function代码由功能提供者实现,是可控的,而第三方代码只能通过这一条途径来访问外部资源,因此也是可控的。自定义类加载器中的允许或不允许加载的类列表可以是预置的,所有的第三方类代码使用相同的配置;也可以是加载不同的第三方类代码时现读取的,每个类有不同的权限,由此在JVM中实现动态的代码权限控制。在JVM中,通过类加载器和类名才能确定一个类,对于不同的第三方代码,都创建一个新的自定义类加载器实例来加载。由于第三方代码加载时需要不同的类加载器,所以第三方代码之间无法相互访问,从而实现了不同第三方代码之间的隔离。当所执行的第三方代码之间不需要隔离时(如是同一个用户的代码),则可以使用同一个类加载器加载,从而节省系统资源。 上述自定义类加载器通常可以通过重载ClassLoader类的f indClass和IoadClass方法即可实现,此为Java中的标准方法,本专利技术中不再赘述。 为使本专利技术的目的、技术方案及优点更加清楚明白,以下结合附图描述本专利技术的优选实施例,对本专利技术进一步详细说明。如图I所示,本专利技术中自定义类加载器加载一个类包括如下步骤其中,在该类的实例创建时本文档来自技高网
...

【技术保护点】
一种在Java虚拟机中安全运行第三方类的方法,其特征在于,该方法包括:创建自定义加载器,所述自定义加载器的父加载器为Java虚拟机当前线程的类加载器;通过所述自定义加载器来加载第三方类,由所述自定义加载器判断是否允许所述第三方类加载特定的系统类;如果允许,则所述自定义加载器委托其父加载器加载所述系统类;若不允许,则抛出异常,从而控制所述第三方类中所能使用的类。

【技术特征摘要】
1.一种在Java虚拟机中安全运行第三方类的方法,其特征在于,该方法包括 创建自定义加载器,所述自定义加载器的父加载器为Java虚拟机当前线程的类加载器; 通过所述自定义加载器来加载第三方类,由所述自定义加载器判断是否允许所述第三方类加载特定的系统类; 如果允许,则所述自定义加载器委托其父加载器加载所述系统类; 若不允许,则抛出异常,从而控制所述第三方类中所能使用的类。2.根据权利要求I所述的方法,其特征在于,根据需要,能够同时创建多个所述自定义加载器以执行多份所述第三方类。3.根据权利要求I所述的方法,其特征在于,关于所述第三方类所...

【专利技术属性】
技术研发人员:不公告发明人
申请(专利权)人:北京深思洛克软件技术股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1