Login| Sign Up| Help| Contact|

Patent Searching and Data


Title:
METHOD FOR SAFELY RUNNING THIRD-PARTY CODE IN JAVA VIRTUAL MACHINE
Document Type and Number:
WIPO Patent Application WO/2014/044165
Kind Code:
A1
Abstract:
Disclosed is a method for implementing safe running of an uncontrollable third-party code by using a custom class loader technology provided by JVM. By controlling a local module and class capable of being used in the third-party code, the access of the third-party code to the external resource can be effectively restricted, and moreover, multiple third-party codes running at the same time can be separated. The present invention also provides a method for transparently accessing the local resource in a controllable manner in the third-party code.

Inventors:
SUN JIPING (CN)
HAN YONG (CN)
Application Number:
PCT/CN2013/083638
Publication Date:
March 27, 2014
Filing Date:
September 17, 2013
Export Citation:
Click for automatic bibliography generation   Help
Assignee:
BEIJING SENSELOCK SOFTWARE TECHNOLOGY CO LTD (CN)
International Classes:
G06F21/51; G06F9/445; G06F9/455
Foreign References:
CN101105757A2008-01-16
CN101763271A2010-06-30
CN101923485A2010-12-22
US20110145794A12011-06-16
CN102902911A2013-01-30
Attorney, Agent or Firm:
BEIJING ZWZX PATENT & TRADEMARK AGENCY (CN)
北京中伟智信专利商标代理事务所 (CN)
Download PDF:
Claims:
权 利 要 求 书

1、 一种在 Java虚拟机中安全运行第三方类的方法, 其特征在于, 该方 法包括:

创建自定义加载器, 所述自定义加载器的父加载器为 Java虚拟机当前 线程的类加载器;

通过所述自定义加载器来加载第三方类,由所述自定义加载器判断是否 允许所述第三方类加载特定的系统类;

如果允许, 则所述自定义加载器委托其父加载器加载所述系统类; 若不允许, 则抛出异常, 从而控制所述第三方类中所能使用的类。

2、 根据权利要求 1所述的方法, 其特征在于, 根据需要, 能够同时创 建多个所述自定义加载器以执行多份所述第三方类。

3、 根据权利要求 1所述的方法, 其特征在于, 关于所述第三方类所允 许访问的类和 /或所不允许访问的类的信息存放在所述自定义类加载器能够 找到的存放位置。

4、 根据权利要求 3所述的方法, 其特征在于, 所述信息存放在特定文 件中, 或所述信息存放在数据库中, 或所述信息直接写入在程序代码中。

5、 根据权利要求 2所述的方法, 其特征在于, 所述自定义类加载器加 载所述第三方类时, 确定所述第三方类可使用和 /或不可使用的类。

6、 根据权利要求 1-5所述的方法, 其特征在于, 如果所述自定义加载 器判断出所述第三方类加载不允许加载的类时, 抛出异常。

7、 根据权利要求 2所述的方法, 其特征在于, 分别采用不同的加载器 来分别加载所述第三方类以防止恶意访问。

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

本发明涉及信息安全领域,特别涉及一种安全 运行不可控的第三方代码 的方法。 背景技术

软件或服务器往往需要允许用户执行自定义的 代码以实现高度的可定 制性或安全性。但是由于第三方编写的代码的 不可控性, 限制其运行环境以 保护服务器资源或上层软件的正常运行就成了 一个很重要的问题。

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虚拟机当前 线程的类加载器;

通过所述自定义加载器来加载第三方类,由所 述自定义加载器判断是否 允许所述第三方类加载特定的系统类;

如果允许, 则所述自定义加载器委托其父加载器加载所述 系统类; 若不允许, 则抛出异常, 从而控制所述第三方类中所能使用的类。 根据本发明的一个方面, 根据需要, 能够同时创建多个所述自定义加载 器以执行多份所述第三方类。

根据本发明的一个方面, 关于所述第三方类所允许访问的类和 /或所不 允许访问的类的信息存放在所述自定义类加载 器能够找到的存放位置。

根据本发明的一个方面, 所述信息存放在特定文件中, 或所述信息存放 在数据库中, 或所述信息直接写入在程序代码中。

根据本发明的一个方面, 所述自定义类加载器加载所述第三方类时, 确 定所述第三方类可使用和 /或不可使用的类。

根据本发明的一个方面,如果所述自定义加载 器判断出所述第三方类加 载不允许加载的类时, 抛出异常。 根据本发明的一个方面,分别采用不同的加载 器来分别加载所述第三方 类以防止恶意访问。 附图说明 图 1为按照本发明的一种在 JVM上安全运行第三方代码的方法的一优 选实施例的流程示意图。

图 2为图 1所示实施例中结构框图。 具体实施方式 当 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 类的 findClass 和 loadClass方法即可实现, 此为 Java中的标准方法, 本发明中不再赘述。 为使本发明的目的、技术方案及优点更加清楚 明白, 以下结合附图描述 本发明的优选实施例, 对本发明进一歩详细说明。

如图 1所示,本发明中自定义类加载器加载一个类 括如下歩骤:其中, 在该类的实例创建时已经获得了哪些类可加载 而哪些类不可加载的信息,在 图 1中已经略去) :

歩骤 1 : 开始执行;

歩骤 2 : 判断是否允许加载该类; 如果允许加载该类, 则进入歩骤 3, 否则抛出 ClassNotFound异常;

歩骤 3 : 判断加载的类是否是要限制使用的第三方类, 如果是, 则进入 歩骤 4; 如果不是, 则进入歩骤 5 ;

歩骤 4: 从字节码直接加载第三方类;

歩骤 5 : 委托父加载器加载第三方类;

歩骤 6: 结束加载过程。

图 2给出了实现本发明的结构示意图。

图 2虚线框中为第三方代码运行环境, 该环境运行在 JVM中。其中包括 第三方类代码本身和访问外部资源的业务逻辑 封装类。

第三方类代码需要通过自定义类加载器才能被 系统类加载器所加载,而 访问外部资源的业务逻辑封装类则直接由系统 类加载器加载。

其中, 第三方类代码在未加载到 JVM前是文本形式的代码, 而加载到 JVM中之后是一个类。 。 实施例 1

该实施例中需要加载的第三方类是 ThirdExampl e。 第三方类 ThirdExampl e的字节码存在 ThirdExample. class文件中, 只允许直接使用 java. lang. String类禾口默认的 java. lang. Object类。 而 ThirdExampl e类 只 允 许 直 接 使 用 java. lang. String 类 的 信 息 则 存 放 在 ThirdExampl eAccess. txt这个文本文件中。 在 ThirdExample类中需要访问 夕卜部资源 /tmp/example.db文件。 该功會通过类 example. Fi leAccessWrapper 提供 的 公 共 方法 (read 和 write , 即 读 写 功 能) 实现 , 而 exampl e. Fi l eAccessWrapper是系统提供者提供的访问外部资源 封装类, 该封装类根据系统的安全需求以及业务逻辑编 写。 在本例中 exampl e. Fi l eAccessWrapper通过使用 java. io. *等在 ThirdExample中不會 ^ 使用的类来实现文件操作, 同时该类只能访问 /tmp/example. db文件, 从而 防止了 ThirdExample对其它资源的访问。

其中 ThirdExampl eAccess. txt文件的内容描述相应第三方代码可以加 载的类, 形式可以根据需求进行选择, 如其中记录可以加载的类, 或只记录 不可以加载的类, 或两者都记录等等。

通过 ThirdExample. c lass可以确定其对应的权限文件的位置, 如本例 中可以通过文件名来找到 ThirdExampl eAccess. txt文件。

ThirdExampl e类由自定义的类加载器 MyClassLoader加载, 本例中 MyClassLoader的工作流程如下:

1、 创建 MyClassLoader , 以当前线程的加载器作为其父加载器;

2、 若力口载 ThirdExampl e类, 贝 lj从 ThirdExampl e. class中读耳又类字节 码, 然后加载; 同时读取对应的 ThirdExampleAccess. txt, 确定 ThirdExampl e可使用类的列表 (或不可加载类的列表) ; 3、 加载 (都 是从类 ThirdExample中 )其它类时, 若 ThirdExampleAccess. txt中允 许加载, 则委托其父加载器加载, 否则抛出 ClassNotFound异常;

本例中只有 java. lang. String禾口 example. Fi leAccessWrapper可 以加载, 在 ThirdExampl e 所有加载其它类的操作均会抛出 ClassNotFound异常, 从而使得 ThridExampl e没有途径直接访问外部 资源, examp 1 e . F i 1 eAc c e s sWrapper提供了访问外部资源途径的同时也 隐藏了相关细节。

4、 当 ThirdExampl e类执行完毕后, MyClassLoader便不再使用 (可被 回收) 。 此外, 根据本实施例, 可以根据需要同时创建多个 MyClassLoader 以执行多份 ThirdExample代码, 这些 MyClassLoader之间的执行过程互不 影响。 实施例 2

同上例, 只是控制第三方类中可访问的资源不同。 第三方类代码 ThirdExample. class (存在文件中) 允许直接使用除 java. net. *以外 的所有类, 此信息放在 ThirdExampleAccess.txt这个文本文件。 外部需 要 通 过 网 络 访 问 TCP 的 80 端 口 。 该 功 能 通 过 类 example .NetAccessWrapper提供的公共方法 (open、 send、recieve和 close, 即打开、 发送、 接收和关闭功能)实现, example.NetAccessWrapper隐藏 为网络访问的细节 (如协议、 端口和底层实现等) 。 example. NetAccessWrapper是系统提供者提供的访问外部资 的封装类,根据系 统 的 安全需求 以及业务逻辑编 写 。 在本例 中 example. NetAccessWrapper通过使用 java. net. *等在 ThirdExample中不會 使用 的类来实现文件操作, 同时该类只能访问 TCP的 80端口, 从而防止了 Th i r dExamp 1 e对其它网络资源的访问。

自定义的类加载器 MyClassLoader工作流程如下:

1、 创建 MyClassLoader, 以当前线程的加载器作为其父加载器;

2、 若力口载 ThirdExampl e类, 贝 lj从 ThirdExample. class中读耳又类字 节码, 然后加载; 同时读取对应的 ThirdExampleAccess. txt, 确 定 ThirdExampl e可使用类的列表 (或不可加载类的列表) ;

3、 加载 (都是从类 ThirdExample 中加载) 其它类时, 若 ThirdExampl eAccess. txt中允许加载, 则委托其父加载器加载, 否则抛出 ClassNotFound异常; 本例中除 java. net. *以外的所有 类都可以加载, 在 ThirdExample所有加载任何 java. net. *类的 操作均会抛出 ClassNotFound异常,从而使得 ThridExampl e没有 途径直接访问网络, example. NetAccessWrapper提供了访问夕卜部 资源途径的同时也隐藏了相关细节。

4、 当 ThirdExample类执行完毕后, MyClassLoader便不再使用 (可被 回收)。此外,根据本实施例,可以根据需要 同时创建多个 MyClassLoader 以执行多份 ThirdExample代码, 这些 MyClassLoader之间的执行过程 互不影响。 实施例 3

此外, 根据本发明的一个具体实施方式, 除了上述两个具体实施例中通 过读耳又 ThirdExampleAccess. txt , 从而确定 ThirdExample可使用类的歹 Ll表 (或不可加载类的列表) 的方式之外, 本领域的技术人员完全可以采用其它 的方式来确定所述第三方类所允许访问的类和 /或所不允许访问的类的信 息, 其中一种具体的方式就是将所述信息存放在数 据库中, 或所述信息直接 写入在程序代码中。这种变化对于本领域技术 人员而言是容易实现的, 其相 应的后续歩骤与上述实施例 1、 2的后续歩骤类似, 不再赘述。 以上所述仅为本发明的较佳实施例而已,并非 用于限定本发明的保护范 围。凡在本发明的精神和原则之内,所作的任 何修改、等同替换以及改进等, 均应包含在本发明的保护范围之内。




 
Previous Patent: CONTENT RECORDING METHOD AND DEVICE

Next Patent: DISPLAY SCREEN