在线刊号(2320-9801)印刷刊号(2320-9798)
Ankit Tyagi, Abhishek Anand, Archana Bharti, Rashi Kohli
|
有关文章载于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女士一直以来的支持和指导,没有她,这项工作就不会有光明。 |
参考文献 |
|