`
yefeng_laixi
  • 浏览: 16291 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

深入java虚拟机读书笔记——第三章 安全

阅读更多

1.       组成Java沙箱的基本组件如下

A类加载体系结构

Bclass文件检验器

C内置于Java虚拟机(及语言)的安全特性

D安全管理器及Java API

Java安全模型的前三个部分——类加载体系结构、class文件检验器、Java虚拟机(及语言)的安全特性一起达到一个共同的目的:保持Java虚拟机的实例和它正在运行的应用程序的内部完整性,使得它们不被下载的恶意代码或有漏洞的代码侵犯。相反,这个安全模型的第四个组成部分是安全管理器,它主要用于保护虚拟机的外部资源不被虚拟机内运行的恶意或有漏洞的代码侵犯。这个安全管理器是一个单独的对象,在运行的Java虚拟机中,它在对于外部资源的访问控制起中枢作用。

 

2.       类装载器体系结构

类装载器体系结构在三个方面对java的沙箱起作用:

        1):它防止恶意代码去干涉善意的代码。

        2):它守护了被信任的类库的边界。

        3):它将代码归入某类(称为保护域),该类确定了代码可以进行哪些操作。

在某个特定的类装载器试图装在一个类时,它会先默认将这个任务委派给它的双亲类装载器来装在这个类,这个双亲再依次将请求委派给它的双亲,这个委派过程一直到启动类装载器,如果启动类装载器无法装载,再依次给它的子孙装载,直到某个类装载器可以装载,再向下依次返回装载的那个类,如果都不能装载,则抛出异常。

 

 

这种委托双亲的模式好处是:启动类加载器可以抢在标准扩展类装载器之前去装载类,而标准扩展类装载器可以抢在类路径加载器之前去装载那个类,类路径装载器又可以抢在自定义类加载器之前去加载它。所以Java虚拟机先从最可信的Java核心API查找类型,这是为了防止不可靠的类扮演被信任的类,试想一下,网络上有个名叫java.lang.Integer的类,它是某个黑客为了想混进java.lang包所起的名字,实际上里面含有恶意代码,但是这种伎俩在双亲模式加载体系结构下是行不通的,因为网络类加载器在加载它的时候,它首先调用双亲类加载器,这样一直向上委托,直到启动类加载器,而启动类加载器在核心Java API里发现了这个名字的类,所以它就直接加载Java核心APIjava.lang.Integer类,然后将这个类返回,所以自始自终网络上的java.lang.Integer的类是不会被加载的。

图片来源于:http://fhz1980.blog.163.com/blog/static/35528771201010961835141/

但是如果这个移动代码不是去试图替换一个被信任的类(就是前面说的那种情况),而是想在一个被信任的包中插入一个全新的类型,情况会怎样呢?比如一个名为java.lang.Virus的类,经过双亲委托模式,最终类装载器试图从网络上下载这个类,因为网络类装载器的双亲们都没有这个类(当然没有了,因为是病毒嘛)。假设成功下载了这个类,那你肯定会想,Viruslang下的其他类痛在java.lang包下,暗示这个类是Java API的一部分,那么是不是也拥有修改Java.lang包中数据的权限呢?答案当然不是,因为要取得访问和修改java.lang包中的权限,java.lang.Virusjava.lang下其他类必须是属于同一个运行时包的,什么是运行时包?运行时包是指由同一个类装载器装载的、属于同一个包的、多个类型的集合。考虑一下,java.lang.Virusjava.lang其他类是同一个类装载器装载的吗?不是的!java.lang.Virus是由网络类装载器装载的!

 

 在有双亲委派模式的情况下,启动类装载器可以抢先在用户自定义的类装载器之前去装载类,总之,越上层的类装载器越值得信任,而越上层的类装载器越早装载类。

虚拟机不但要确定两个类型是否属于同一个包,还必须确定它们属于同一个运行时包,即它们必须是由同一个类装载器装载的。

 

3.   class文件校验器,通过四趟扫描,保证了class文件正确

第一趟是,检查class文件的结构是否正确。比较典型的就是,检查class文件是否以魔数OxCAFEBABE打头。

通过这趟检查,可以过滤掉大部分可能损坏的,或者压根就不是class的文件,来冒充装载。

 

第二趟是,检查它是否符合java语言特性里的编译规则。比如发现一个类的超类不是Object,就抛出异常。

 

第三趟是,检查字节码是否能被JVM安全的执行,而不会导致JVM崩溃。这里提到了一个停机的问题。内容是这样的,即不可能写出一个程序,用它来判定作为其输入而读入的某个程序,是否会停机。意思是,不可能写一个程序,让它告诉你,另外一个程序会不会中断或崩溃。

 

第四趟是,符号引用验证。一个类文件,它会包含它引用的其他类的全名和描述符,并跟他们建立符号引用(一种虚拟的,非物理连接的方式)。当程序第一次执行到需要符号引用的位置时,jvm会检查这个符号链接的正确性,然后建立真正的物理引用(直接引用)

 

4.       内置于java虚拟机(及语言)的安全特性

     1)类型安全的引用转换

     2)结构化的内存访问

     3)自动垃圾收集

     4)数组边界检查

     5)空引用检查

    虽然字节码指令集没有向用户提供不安全的、非结构化的内存访问方法,但是可以绕过字节码,即调用本地方法。当调用本地方法时,java安全沙箱完全不起作用。一旦某个线程进入一个本地方法,不管java虚拟机内置了何种安全策略,只要这个线程运行这个本地方法,安全策略将不再对这个线程适用。

    为了保证安全而内置于java虚拟机的最后一个机制,就是异常的结构化错误处理,从而使某个异常或错误导致这个错误线程的死亡,而不是使整个系统陷入瘫痪。

5.       安全管理器及java API

     安全管理器定义了沙箱的外部边界,因为它是课定制的,所以它允许为程序建立自定义的安全策略。当java API进行任何可能不安全的操作时,它都会向安全管理器请求许可,从而强制执行自定义的安全策略。要向安全管理器请求许可,java API将调用安全管理器对象的"check"方法,如checkReadcheckWirte

大家有兴趣可以看下这篇java沙箱实现的实例:

http://blog.csdn.net/flyingpig204/archive/2009/11/25/4871968.aspx

分享到:
评论

相关推荐

    Java JDK 6学习笔记——ppt简体版

    JDK(Java Development Kit)是用于开发Java应用程序的工具包,包含了Java编译器、JVM(Java虚拟机)和各种开发工具。 2. **安装与配置JDK**:学习Java的第一步是正确安装JDK,并设置好环境变量JAVA_HOME、PATH和...

    java第一章笔记

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

    ubuntu安装笔记——part1

    1. **解决关机不正常的问题**:如果遇到关机不正常的问题,可以尝试禁用ACPI功能,或者检查是否有第三方驱动冲突。 2. **解决蓝牙连接问题**:确保蓝牙硬件正常工作,检查蓝牙服务是否已启动,必要时重启蓝牙服务。 ...

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

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

    (完整版)Java笔记总结.pdf

    JVM —— Java 虚拟机,相当于一个虚拟的操作系统,负责运行 javac.exe 生成的 字节码(二进制)文件。java.exe 执行”.class ”,就是 java.exe 启动 JVM 运行”.class” 文件。 标识符命名规则包括包名所有字母...

    Java_第一章

    【Java_第一章】是关于Java编程语言入门的学习资料,涵盖了计算机基础知识、Java语言的基本概念、JDK的获取与安装,以及编写第一个Java程序——“Hello, World!”的实践。这一章的学习是Java开发者必备的起点,对...

    java学习笔记-基础

    ### Java学习笔记——基础知识详解 #### 一、Java开发环境(JDK)与运行环境(JRE) Java技术的核心在于其强大的跨平台能力,这主要得益于Java的两大环境:JDK(Java Development Kit)和JRE(Java Runtime ...

    Java期末考试复习笔记

    ### Java期末考试复习笔记 #### 第一章:Java入门 - **Java的特点**: - **面向对象**:Java的设计原则之一就是支持面向对象编程(OOP),这使得它非常适合于构建复杂的、可维护的应用程序。 - **与平台无关**:...

    达内JAVA培训笔记重点

    这一特性主要得益于Java字节码和Java虚拟机(JVM)的存在。Java源代码被编译成字节码,然后由JVM解释执行,从而实现跨平台性。 3. **简单**:相比C++等其他语言,Java简化了许多复杂的编程概念,如取消了指针、运算符...

    JAVA面向对象编程(孙卫琴)学习笔记

    "是初学者的入门标志,它涉及到Java环境的搭建,源代码的编写,以及如何通过JVM(Java虚拟机)执行程序。理解这个过程有助于建立对Java语言运行机制的基本认知。 "JAVA面向对象编程(孙卫琴)_2java数据类型与变量....

    java学习笔记

    Java程序的运行依赖于Java虚拟机(JVM),这意味着只要目标系统安装了相应的JVM,Java程序就能在其上运行。这种特性确保了Java“一次编写,到处运行”的跨平台性。 - **开发步骤**: 1. **编写源文件**:使用`.java`...

    java并发编程笔记

    通常情况下,一个进程至少包含一个线程,而Java虚拟机默认有两个线程:主线程`main`和垃圾回收线程`GC`。 #### 二、并发与并行 - **并发**:指在同一时间段内,有多个程序(任务)同时处于已启动到未完成的状态。...

    jdk6.0学习笔记

    - 名称由来:Java 的名字来源于 James Gosling 观察到的一棵橡树(Oak),但由于 Oak 已被注册为商标,最终选择了咖啡的产地国——Java(爪哇岛)作为该语言的名字。 - 全球信息网的兴起促进了 Java Applet 的发展...

    51CTO下载-韩顺平java从入门到精通视频教程(全94讲)学习笔记整理(齐全)

    3. **在虚拟机上运行**:通过 Java 虚拟机 (JVM) 执行编译后的 `.class` 文件。 ### Java 注释 Java 支持三种类型的注释: - **单行注释**:使用 `//` 符号。 - **多行注释**:使用 `/* ... */` 符号。 - **文档...

    android学习笔记最新版(1-4)

    第三部分《Android开发教程&笔记三--环境搭建与解析.rar》详细阐述了Android开发环境的搭建,包括安装Android Studio、设置SDK、AVD Manager虚拟设备的创建以及Gradle构建系统的理解和使用。这部分对于初学者来说至...

    技术学习分享,技术学习分享

    10. **JVM和内存管理**:理解Java虚拟机(JVM)的工作原理,包括类加载机制、内存区域(堆、栈、方法区等)以及垃圾收集,可以帮助优化程序性能。 11. **设计模式**:学习并应用如单例、工厂、观察者等经典设计模式...

    c#学习笔记.txt

    c#学习笔记(1) 51099在线学习网发布 文章来源:网络收集 发布时间:2006-05-25 字体: [大 中 小] 51099在线学习网 http://www.51099.com 1, 结构(struct) 与 类(class) [attributes] [modifiers] struct ...

Global site tag (gtag.js) - Google Analytics