所有提交的EM系统将被重定向到网上投稿系统。作者被要求将文章直接提交给网上投稿系统各自的日志。

Java字节码的安全体系结构与验证

Ankit Tyagi, Abhishek Anand, Archana Bharti, Rashi Kohli
  1. 印度大诺伊达阿米提大学计算机科学与工程系学者
  2. 印度大诺伊达阿米提大学计算机科学与工程系讲师
有关文章载于Pubmed谷歌学者

更多相关文章请访问国际计算机与通信工程创新研究杂志

摘要

字节码是一个基于栈的java虚拟机指令集,包含202条指令,它不仅提供了与java的体系结构独立性,而且还确保了代码的安全性和可移植性。对于工业组织和学术机构来说,它已经广泛发展成为一个高度重要的话题。业界之所以对字节码感兴趣,是因为字节码专门用于网站和移动设备应用程序,即:手机、地铁卡、信用卡、网上银行等,在这些应用程序中,安全性是至关重要的。此外,它允许动态加载类,这将导致那些包含形式方法的应用程序的额外大胆。此外,代码的糟糕结构和操作数堆栈普遍存在,导致字节码分析面临进一步的挑战。本文回顾了Java字节雷竞技苹果下载码的分析、转换、验证和安全等方面的理论,介绍了现有的Java字节码验证方法,并提出了一些优化方案。

关键字

JVM,字节码,JVML, ClassLoader, SecurityManager, JRE。

介绍

现在,用java和其他面向对象语言编写的动态语言应用程序都带有高级的中间字节代码。与其他直接生成机器代码的程序相比,该程序有两个明显的优势。首先,它提供了平台独立性,其次,我们可以在目标系统上使用不同的本地指令集来执行特定的任务,而不使用太多的系统资源。这个独特的属性为字节码提供了跨目标平台移植的能力。由于对频繁执行的代码区域的解释效率很低,因此动态编译字节码程序,将字节码程序的不同部分转换为能够在本地主机上执行的代码。这个字节码在执行之前也要验证,要记住代码使用者在执行之前就已经设定好的某些边界条件。根据java虚拟机语言(JVML)规范,代码接收者的职责是判断代码是否类型良好,是否适合在java虚拟机上运行。此验证步骤确保所编写的代码是安全的,并且可以在不违反安全性的情况下运行,而不违反安全性可能导致缓冲区溢出。字节码验证器的另一个主要问题是防止病毒进入系统并进行可疑的系统调用,以破坏系统。这些病毒通常是由外部字节码程序引入的,内置的java字节码分析器对这些程序进行了安全性分析。 This bytecode analyzer performs a check on the bytecode before it is executed on the system. Prior studies have been done and experiments been performed by taking certain test cases in order to check the dynamic compilation and verification of Byte code to ensure the safety and correctness of this verification step and how well does the compilation produces local machine code for a particular bytecode fragment.

相关工作

Java虚拟机(JVM)基于规范堆栈格式。在堆栈中,大多数指令从堆栈中弹出操作符和操作数,计算并将结果推入堆栈。此外,它提供了一组也称为局部变量的寄存器,可以使用“load”和“store”指令来处理,这些指令将给定寄存器的值推入堆栈或将堆栈顶部存储在当前寄存器中。大多数Java编译器需要寄存器来保存源级局部变量和函数参数的值,并且还使用临时堆栈来保存表达式的求值结果,而体系结构不支持这种功能。堆栈和寄存器通过方法调用保持,是激活记录的一部分。寄存器的数量和内存中的堆栈空间都由方法使用,特别是在开始点指定的方法,因此在方法进入时,分配合适大小的激活记录。为了使JVM正常工作,代码应该满足以下条件
正确性视角:指令要求的参数类型满足指令的期望。
无堆栈下溢或溢出:在堆栈下溢中,没有参数可以从空的堆栈中弹出,在堆栈溢出中,没有参数可以推入已满的堆栈中,即声明的堆栈大小和堆栈中的参数相等。
代码包含:在方法中,指令计数器应该永远指向最初的起始指令代码,它既不应该指向方法代码的末尾,也不应该指向方法代码的中间。
寄存器的初始化:任何方法参数都不能从未初始化的寄存器中加载,因此从寄存器中至少有一个加载应该永远跟随该寄存器中的至少一个存储;我们也可以说,在方法入口时,与方法参数不对应的寄存器没有初始化。
初始化对象:当设计类a的对象时,类a的任何一个初始化方法都应该在该类对象可以使用之前执行。
源Java代码:
图像
图像

JVM验证流程

程序员编写的Java源程序最初被编译并转换为相应的字节码(.class文件)表示形式。如果程序是使用不同的编译器编译的,而不是java中存储的编译器,JRE将此类代码声明为“敌对”含义,则代码应该在执行前由字节码验证器进行验证。这一步确保从第三方编译器编译的每个程序都不违反JVM设置的安全条件。因此,实际上JVM甚至不会看到代码,直到它通过由字节码验证器执行的一系列测试。字节码验证器只是一个小型定理验证器,它验证语言基本规则是否得到尊重。
它通过以下步骤检查代码:
图像
通过遵循上面提到的步骤,Java字节码验证器可以确保传递给解释器的代码处于合适的状态,以便在不违反安全性的情况下执行。

Java安全体系结构

Java安全模型已通过图3说明,观察Java中的字节码,即本地字节码和不可靠字节码(applet)都必须通过验证器。稍后,类装入器的调用将确定applet何时以及以何种方式装入类。除此之外,类装入器还为命名空间创建分区,并确保剩余的运行时环境不受单个applet的影响。最后由Security Manager执行运行时验证,检查所有定义新类装入器或寻求I/O权限或网络访问权限等(危险方法)的方法。
图像
Java类装入器
一个名为ClassLoader的抽象类用java编程语言定义了类装入器。将java类加载到运行时环境中的策略可以通过使用Class Loader作为接口来实现。
类装入器的总体使用情况如下:
类装入器动态地将java类装入java虚拟机,因为类装入器是java运行时环境的一部分。
类加载器以简单的方式创建类主体的平面命名空间,并通过字符串的名称引用。
类装入器定位库,读取库的内容,然后装入库中包含的类
父类装入器避免applet调用方法,方法是其他类装入器的一部分。运行中的JVM(即。,the java Runtime environment(JRE) in execution),allows more than one Class Loaders with their own namespace, to get activated at one time, and then JVM groups the classes(e.g. local or global) on the basis of their origin by the allowance of the namespace. This figures out that what are the divisions of Java Runtime Environment (JRE),that can be accessed or can be changed by the applet. Moreover by restricting the namespace the unreliable applets can be prevented from getting access of additional machine resources (e.g. topical files)
Java安全管理器
SecurityManager(Java安全模型的基本部分)中的方法被调用来检查不同代码执行的各种操作,以区分可靠代码和不可靠代码,然后SecurityManager禁止不可靠代码请求的大部分任务。举例说明所需的安全策略的工作可以通过使用SecurityManager的子类完成
SecurityManager提供了一个非常灵活和强大的机制,有条件地允许对资源的访问。SecurityManager的职责包括:
所有Socket转换都由SecurityManager管理。
保护受保护的资源(例如文件、个人资料等)不被未经授权的方式访问
阻止安装新的类装入器。
维护线程的完整性。
控制对类组的访问,即java包。
在执行任何类型的危险操作之前,作为基本Java库一部分的所有方法(即Oracle公司给出的方法)都要咨询安全管理器以确保合规性。
安全管理器还监视对JVM下面的本机操作系统的潜在可疑调用。图4说明了Java Security Manager的这一特性。
图像

提出了Java字节码验证算法

结合现有的java虚拟机字节码验证算法,我们提出了以下算法,试图解决现有算法面临的性能问题。
图像
图像
该算法包含了许多优化,以减少迭代次数,从而减少了java字节码验证过程所需的时间。

结论及未来工作

虽然在Java字节码验证技术中存在大量先前的工作,但本文所调查的大部分工作都引导我们确切地了解什么是字节码及其验证,以及如何执行它来遏制安全漏洞。通过对算法的分析,我们发现,对于较短的程序,总体努力似乎是最快的,而对于一般情况下的程序,这种努力似乎增加了一点,但对于较大的程序规模,这种努力似乎需要最长的时间。这个观察结果清楚地表明,验证时间与java程序的大小成正比。在仔细分析了观察结果和特征行为后,我们强调了一个悬而未决的问题,即字节码验证是否可以超越基本的类型安全和初始化属性,并静态地建立applet的更高级属性,例如资源使用和反应性(可以定义为applet与环境的两次交互之间的运行时间),以此来结束本文。

ACKNOWLDGEMENT

我们要特别感谢我们的导游Rashi Kohli女士一直以来的支持和指导,没有她,这项工作就不会有光明。

参考文献

  1. Mart´Ã ±n Abadi, Anindya Banerjee, Nevin Heintze,和Jon G. Riecke。依赖关系的核心计算。第26届研讨会《编程语言原理》147-160页。ACM出版社,1999年。
  2. 大卫·帕姆斯,斯特凡·弗里德里希和马立克·高考斯基。通过模型检查进行字节码验证。
  3. 自动推理杂志。字节码验证的特别问题(本期)。
  4. 伊夫Bertot。在定理证明程序中形式化初始化JVML验证器。《计算机辅助验证程序》(CAV’01),《计算机科学课堂讲稿》第2102卷,第14-24页。斯普林格出版社,2001年版。
  5. 帕斯卡Brisset。Vers un v´erifieur de bytecode Java证书。1998年10月2日,在巴黎高等师范学院举行的研讨会。
  6. 克劳斯Brunnstein。演示了恶意ActiveX控制。风险论坛,18(82),1997年2月。
  7. Zhiqun陈。智能卡的Java卡技术:体系结构和程序员指南
  8. Gennady Chugunov, Lars Ë (Ake Fredlund),和Dilian Gurov。模型检查多applet Java卡应用程序。在智能卡研究与先进应用会议(CARDIS ' 02)上,2002。
  9. 亚历山德罗Coglio。复杂Java字节码子例程的简单验证技术。第4届ECOOP类java程序形式化技术研讨会,2002年。扩展版本可用作红隼研究所技术报告。
  10. 亚历山德罗Coglio。改进Java字节码验证的官方规范。并行性与计算:实践与经验,15(2):155-179,2003。
  11. 理查德·科恩。防御性Java虚拟机规范。技术报告,计算逻辑公司,1997年。
  12. 斯蒂芬·n·弗洛伊德和约翰·c·米切尔。Java字节码语言和验证器的类型系统。自动推理杂志。字节码验证的特别问题(本期)。
  13. 斯蒂芬·n·弗洛伊德和约翰·c·米切尔。java字节码语言和验证器的正式框架。面向对象程序设计系统,语言和应用1999,147-166页。ACM出版社,1999年。
  14. Koushal Kumar, Ashwani Kumar虚拟机中的字节码验证,ijacss,第3卷,第3期,127-130页,2013年3月。
  15. Xavier Leroy Java字节码验证:算法和形式化,《自动推理期刊》,关于字节码验证的特刊(本期)。
  16. 执行概要。Java的安全计算:现在和未来,1998。
  17. 巩俐。Java安全:现状与未来,电子工程学报,17(3):14-19,1997年5 / 6月。
  18. 林霍尔姆和耶林。Java虚拟机规范,Addison-Wesley, 1996
全球科技峰会