`

深入理解Java虚拟机读书笔记之:第3章 安全(1)

阅读更多

    为了解决由网络引起的安全问题,Java体系结构采用了一个扩展的内置安全模型,这个模型随着Java平台的主要版本而不断发展。

 
为什么需要安全性
    Java的安全模型是其多个重要结构特点之一,它使Java成为适于网络环境的技术。因为网络提供了一条攻击连入的计算机的潜在途径 ,因此安全性是非常重要的。
    Java安全模型侧重于保护终端用户免受从网络下载的、来自不可靠来源的、恶意程序(以及善意程序中的bug)的侵犯。为了达到这个目的,Java提供了一个用户可配置的“沙箱”,在沙箱中可以放置不可靠的Java程序。沙箱对不可靠程序的活动进行了限制,程序可以在沙箱的安全边界内做任何事,但是不能进行任何跨越这些边界的举动。
 
基本沙箱
    沙箱安全模型使得工作变得容易,即使某个软件来自你不能完全信任的地方。沙箱模型使你可以接收来自任何来源的代码,而不是要求用户避免将来自不信任站点的代码下载到机器上。但是当来自不可靠来源的代码运行时,沙箱限制它进行可能破坏系统的任何动作。不必指出哪些代码可以信任,哪些代码不可以信任,也不必扫描查找病毒,沙箱本身限制了下载的任何病毒或其他恶意的、有漏洞的代码,使得它们不能对计算机进行破坏。
    组成Java沙箱的基本组件如下
    1)类装载器结构
    2)class文件检验器
    3)内置于Java虚拟机(及语言)的安全特性
    4)安全管理器及Java API
 
    Java的沙箱安全模型,最重要的优点之一就是这些组件中的类装载器和安全管理器是可以由用户定制的。通过定制这些组件,可以为Java程序创建个性化的安全策略。
 
类装载器体系结构
    在Java沙箱中,类装载器体系结构是第一道防线。毕竟,是由类装载器将代码——这个代码可能是恶意的或是有漏洞的——装入Java虚拟机中。
    类装载器体系结构在三个方面对Java的沙箱起作用:
    1)它防止恶意代码去干涉善意的代码
    2)它守护了被信任的类库的边界
    3)它将代码归入某类(称为保护域),该类确定了代码可以进行哪些操作
 
    类装载器体系结构可以防止恶意的代码去干涉善意的代码,这是通过为由不同的类装载器装入的类提供不同的命名空间来实现的。
    在Java虚拟机中,在同一命名空间内的类可以直接进行交互,而不同的命名空间中的类甚至不能察觉彼此的存在,除非显示的提供了允许它们进行交互的机制。


 
    在版本1.2中,类装载器请求另一个类装载器来装载类型的过程被形式化,称为双亲委派模式。从版本1.2开始,除启动类装载器以外的每一个类装载器,都有一个“双亲”类装载器,在某个特定的类装载器试图以常用方式装载类型以前,它会先默认地将这个任务“委派 ”给它的双亲——请求它的双亲来装载这个类型。这个双亲再依次请求它自己的双亲来装载这个类型。这个委派的过程一直向上继续,直到达到启动类装载器,通常启动类装载器是委派链中的最后一个类装载器。如果一个类装载器的双亲类装载器有能力来装载这个类型,则这个类装载器返回这个类型。否则,这个类装载器试图自己来装载这个类型。
    因为核心Java API的class文件是用于“启动”Java虚拟机的class文件,所以,启动类装载器的名字也则得。


 
    在使用双亲-孩子委派链的方法中,启动类装载器会在最可信的类库——核心Java API——中首先检查每个被装载的类型,然后,才依次到标准扩展、类路径上的本地类文件中检查。
 
    运行时包这个名词,是在Java虚拟机第2版规范中第一次出现的,它指由同一个类装载器装载的、属于同一个包的、多个类型的集合。在允许两个类型之间对包内可见的成员(声明为受保护的或包访问的成员)进行访问前,虚拟机不但要确定两个类型属于同一个包,还必须确认它们属于同一个运行时包——它们必须是由同一个类装载器装载的。
 
class文件检验器
    和类装载器一起,class文件检验器保证装载的class文件内容有正确的内部结构,并且这些class文件相互间协调一致。如果class文件检验器在class文件中发现了问题,它将抛出异常。
    因为一个class文件实质上是一个字节序列,所以虚拟机无法分辨特定的class文件是由正常的Java编译器产生的,还是由黑客特制的(黑客可能威胁虚拟机的完整性)。所以,所有的Java虚拟机的实现必须有一个class文件检验器,文件检验器可以调用class文件以确保这些定义的类型可以安全地使用。    
    class文件检验器实现的安全目标之一就是程序的健壮性。
    
    class文件检验器要进行四趟独立的扫描来完成它的操作。
    1)第一趟:class文件的结构检查
    第一趟扫描是在类被装载时进行的,主要目的就是保证这个字节序列正确地定义了一个新类型,它必须遵从Java的class文件的固定格式,这样它才能被编译成在方法区中的(基于实现的)内部数据结构。
 
    2)第二趟:类型数据的语义检查
    在这趟扫描中,检验器查看每个组成部分,确认它们是否是其所属类型的实例,它们的结构是否正确。例如,方法描述符(它的返回类型,以及参数的类型和个数)在class文件中被存储为一个字符串,这个字符串必须符合特定的上下文无关文法。检验器对每个组成部分进行检查的目的之一是,为了确认每个方法描述符都是符合特定语法的、格式正确的字符串。
    另外,class文件检验器检查这个类本身是否符合特定的条件,它们是由Java编程语言规定的。也就是说,class文件检验器在运行时检查了一些Java语言应该在编译时遵守的强制规则。(如,除Object类之外的所有类都必须有一个超类,final类没有被子类化,final方法没有被覆盖等)
    
    3)第三趟:字节码验证
    在这趟扫描中,Java虚拟机对字节流进行数据流分析,这些字节流代表的是类的方法。为了理解字节码检验器,必须对字节码和栈帧有一定的了解。
    字节码流代表了Java的方法,它是由被称为操作码的单字节指令组成的序列,每一个操作码后都跟着一个或多个操作数。操作数用于在Java虚拟机执行操作码指令时提供所需的额外的数据。执行字节码时,依次执行每个操作码,这就在Java虚拟机内构成了执行的线程。每一个线程被授予自己的Java栈,这个栈是由不同的栈帧构成的。每一个方法调用将获得一个自己的栈帧——栈帧其实就是一个内存片断,其中存储着局部变量和计算的中间结果。在栈帧中,用于存储方法的中间结果的部分被称为该方法的操作数栈。
    
    4)第四趟:符号引用的验证
    在动态连接的过程中,如果包含在一个class文件中的符号引用被解析时,class文件检验器将进行第四趟检查。在这趟检查中,Java虚拟机将追踪那些引用——从被验证的class文件到被引用的class文件,以确保这个引用是正确的。因为第四趟扫描必须检查被检测的class文件以外的其他类,所以这次扫描可能需要装载新的类。大多数Java虚拟机的实现采用延迟装载类的策略,直到类真正地被程序使用时才装载。
    class文件检验器的第四趟扫描仅仅是动态连接过程的一部分。
 
    动态连接是一个将符号引用解析为直接引用的过程。
 
二进制兼容
    正因为Java程序是动态连接的,所以class文件检验器在第四次扫描中,必须检查相互引用的类之间是否兼容。如果你修改了一个类,Java编译器常会重新编译这些类,从而在编译时检测是否有任何的不兼容性。
    Java语言规范中列出了用户可以做的多种改动,这些改动称为二进制兼容性规则。
 
Java虚拟机中内置的安全特性
    1)类型安全的引用转换
    2)结构化的内存访问(无指针算法)
    3)自动垃圾收集(不必显式地释放被分配的内存)
    4)数组边界检查
    5)空引用检查
 
安全管理器和Java API
    Java安全模型的前三个组成部分——类装载器体系结构、class文件检验器以及Java中内置的安全特性——一起达到一个共同的目的:保持Java虚拟机的实例和它正在运行的应用程序的内部完整性,使得它们不被下载的恶意或有漏洞的代码侵犯。相反,这个安全模型的第四个组成部分是安全管理器,它主要用于保护虚拟机的外部资源不被虚拟机内运行的恶意或有漏洞的代码侵犯。这个安全管理器是一个单独的对象,在运行的Java虚拟机中,它在访问控制——对于外部资源的访问控制——中起中枢作用。
    安全管理器定义了沙箱的外部边界。因为它是可定制的,所以它允许为程序建立自定义的安全策略。当Java API进行任何可能不安全的操作时,它都会向安全管理器请求许可,从而强制执行自定义的安全策略。要向安全管理器请求许可,Java API将调用安全管理器对象的“check”方法。
    当Java应用程序启动时,它还没有安全管理器,但是,应用程序通过将一个指向java.lang.SecurityManager或是其子类的实例传给setSecurityManager(),以此来安装安全管理器,这个动作是可选的。
    当一个Java API即将进行一个潜在不安全的动作时,它将遵循以下两个步骤。首先,Java API的代码检查有没有安装安全管理器,如果没有安装,则跳过第二步直接继续这个潜在不安全的动作。否则,在第二步中,它将调用安全管理器中的合适的“check”方法。
    安全管理器负责两个方面的工作:说明一个安全策略以及执行这个安全策略。
 
(转载请注明来源:http://zhanjia.iteye.com/blog/1842144)
  • 大小: 14.9 KB
  • 大小: 7.9 KB
4
1
分享到:
评论
1 楼 aliahhqcheng 2013-04-05  
赞,good job
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    深入理解Java虚拟机读书笔记之:第3章 安全(3)

    《深入理解Java虚拟机》是Java开发者必读的经典之作,其中第三章主要探讨了Java安全方面的内容。在Java中,安全是一个至关重要的概念,因为Java的设计目标之一就是提供一种可以在不同环境中安全运行的代码机制。本章...

    深入理解Java虚拟机读书笔记之:第3章 安全(2)

    总的来说,"深入理解Java虚拟机读书笔记之:第3章 安全(2)"主要涵盖了Java安全体系的核心概念,包括类加载器、权限模型、安全管理器以及相关工具的使用。理解这些内容对于任何希望构建安全、可靠的Java应用程序的...

    深入理解Java虚拟机学习笔记借鉴.pdf

    第三步,内存空间初始化;第四步,必要的设置。对象的内存布局在 HotSpot 虚拟机中,对象在内存中存储的布局分为三块:对象头、实例数据和对齐填充。对象头包括两部分信息, 一部分用于存储对象自身的运行时数据,如...

    学习深入理解Java虚拟机的前几章笔记

    ### 学习深入理解Java虚拟机的前几章笔记 #### JVM内存模型 Java虚拟机(JVM)的内存模型主要分为两大类:线程共享区和线程私有区。 ##### 线程共享区 - **堆**:是所有线程共享的内存区域,在这里存放着对象实例...

    读书笔记:周志明老师《深入理解Java虚拟机》第三版阅读笔记.zip

    读书笔记:周志明老师《深入理解Java虚拟机》第三版阅读笔记

    读书笔记:《深入理解Java虚拟机 Jvm高级特性与最佳实践第三版》阅读笔记.zip

    读书笔记:《深入理解Java虚拟机 Jvm高级特性与最佳实践第三版》阅读笔记

    深入java虚拟机笔记

    综上所述,《深入Java虚拟机》这本书覆盖了Java体系结构、平台无关性、安全性、网络移动性以及JVM内部运作等多方面的内容,对于想要深入了解Java虚拟机及其工作机制的读者来说是非常有价值的参考资料。

    虚拟机学习笔记--周志明老师第三版

    虚拟机学习笔记 Java 虚拟机(JVM)是 Java 语言的 runtime 环境,负责加载、验证、执行 Java 字节码。以下是 JVM 相关知识点的总结。 1. 运行时数据区域 JVM 的运行时数据区域主要包括: * 堆(Heap):...

    JVM:深入理解Java虚拟机 - 学习笔记

    《JVM:深入理解Java虚拟机》是一本深入解析Java虚拟机工作原理和技术细节的经典书籍。这份学习笔记将涵盖JVM的关键概念、架构以及它如何影响Java程序的性能。我们将探讨以下几个方面: 1. **JVM概述** Java虚拟机...

    Java虚拟机讲解笔记.docx

    Java虚拟机(JVM)是运行Java字节码的虚拟环境,它位于操作系统之上,硬件之下,提供了一层软件抽象,使得Java程序可以在多种平台上运行而无需重新编译。JVM的核心功能包括内存管理、垃圾收集、安全性和平台独立性。...

    高级java笔试题-understanding-the-jvm:《深入理解Java虚拟机》阅读笔记

    的第三部分。第四部分对应于原书的第四部分,程序编译与代码优化,不过仅对 Java 的运行期优化,也就是 JIT 时进行的优化进行了总结,编译器优化部分尚未进行深入研究。 阅读方法: 本 repo 的 README.md 从头读到尾...

    java虚拟机源码学习-UnderstandingTheJVM:深入理解Java虚拟机(周志明)源码及学习笔记

    《深入理解Java虚拟机》是Java开发者们深入探讨Java运行机制的经典之作,作者周志明以其深入浅出的讲解方式,揭示了Java虚拟机(JVM)的工作原理。本资源包含该书第三版的源码分析及学习笔记,旨在帮助读者更透彻地...

    UnderstandingTheJVM:《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记

    本repository为《深入理解Java虚拟机 - Jvm高级特性与最佳实践(第三版)》阅读笔记,因为第一章主要讲的是Java的发展历史,这里就不做笔记,直接从第2章的"Java内存区域与内存溢出异常"讲起。 第二部分 自动内存...

    大佬的java笔记

    作为笔记的作者,被称为“专业第一”,意味着笔记内容会覆盖Java的基础语法、面向对象的深入理解和高级特性。 2. 面向对象编程:在Java中,一切皆为对象,这是Java最重要的编程范式之一。面向对象编程的基本概念...

    java第一章笔记

    6. **跨平台性**:Java的一个重要特性就是“编写一次,到处运行”(Write Once Run Anywhere, WORA),这得益于Java的运行机制——Java程序被编译成字节码(Bytecode),然后由Java虚拟机(JVM)解释执行。...

    毕向东Java笔记

    ### 毕向东Java笔记知识点总结 #### 第一章:编程基础 1. **Java的特性和优势**: - **简单性**:Java的设计哲学是“使编程变得简单”。 - **面向对象**:Java完全支持面向对象编程概念如封装、继承和多态。 - ...

    韩顺平编写的java学习笔记(全)

    3. **运行程序**:通过Java虚拟机(`java.exe`)执行编译后的`.class`文件。 #### 注释 - **单行注释**:使用`//`标记。 - **多行注释**:使用`/* */`包裹注释内容。 #### Java编程方向 - **Java SE (J2SE)**:...

    Java 基础 第1阶段:基本语法-尚硅谷学习笔记(含面试题) 2023年

    2023年的"Java 基础 第1阶段:基本语法——尚硅谷学习笔记(含面试题)"涵盖了从环境搭建到程序设计的基本要素,旨在帮助学习者系统地理解并应用Java语言。 一、Java环境搭建 在开始Java编程之前,你需要安装Java ...

    java面向对象和第一章整理笔记

    它的设计目标是“一次编写,到处运行”(Write Once, Run Anywhere, WORA),通过Java虚拟机(JVM)实现了这一目标,可以在不同操作系统上运行Java程序。 2. **与.NET框架的区别**: - 平台独立性:Java代码编译成...

    Java入门第一季笔记

    ### Java入门第一季笔记 #### Java基本概念及发展概述 - **Java简介**:Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems公司于1995年发布,现归Oracle公司所有。Java的设计目标是高可靠性、安全性、...

Global site tag (gtag.js) - Google Analytics