`
diecui1202
  • 浏览: 98454 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java虚拟机学习笔记(二)安全

阅读更多
一、基本沙箱
  1. 组成沙箱的基本组件有:
    • 类装载器结构;
    • class文件校验器;
    • 内置于Java虚拟机(及语言)的安全特性;
    • 安全管理器及Java API;
  2. Java的沙箱安全模型,最重要的优点之一就是这些组件中的类装载器和安全管理器是可以由用户定制的;
二、类装载器体系结构
  1. 类装载器体系结构是Java沙箱中的第一道防线;
  2. 类装载器体系结构在三个方面对Java的沙箱起作用:
    • 它防止恶意代码去干涉善意的代码,这是通过为由不同的类装载器装入的类提供不同的命名空间来实现的;在Java虚拟机中,同一个命名空间内的类可以直接进行交互,而不同的命名空间中的类甚至不能察觉彼此的存在,除非显示地提供了允许它们进行交互的机制;如下图所示,类装载器1装载了Class1和Class2,方法区中存放了Class1和Class2的类型数据,但类装载器2装载了Class1和Class3,因此方法区中存放了Class1和Class3的类型数据;此时命名空间1中的Class1与命名空间2中的Class1关联到方法区中的类型数据有两份;
    • 它守护了信任类库的边界,这是通过分别使用不同的类装载器装载可靠的包和不可靠的包来实现的;在版本1.2中,类装载器请求另一个类装载器来装载类型的过程被形式化,称为"双亲委派模式",如果一个类装载器的双亲类装载器有能力来装载这个类型,则这个类装载器返回这个类型,否则这个类装载器试图自己来装载这个类型。
      类装载器的双亲委派模式如下:
      1. 启动(Bootstrap)类装载器:启动类装载器是用本地代码实现的类装载器,它负责将 <Java_Runtime_Home>/lib 下面的类库加载到内存中。由于启动类装载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类装载器的引用,所以不允许直接通过引用进行操作。
      2. 标准扩展(Extension)类装载器:标准扩展类装载器是由 Sun 的 ExtClassLoader(sun.misc.Launcher$ExtClassLoader) 实现的。它负责将 < Java_Runtime_Home >/lib/ext 或者由系统变量 java.ext.dir 指定位置中的类库加载到内存中。开发者可以直接使用标准扩展类装载器。
      3. 类路径(ClassPath)类装载器:类路径类装载器是由 Sun 的 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。它负责将系统类路径(CLASSPATH)中指定的类库加载到内存中。开发者可以直接使用系统类加载器。
      4. 在有双亲委派模式的情况下,启动类装载器可以抢在标准扩展类装载器之前去装载类,而标准扩展类装载器可以抢在类路径类装载器之前去装载那个类,类路径类装载器又可以抢在用户自定义类装载器之前去装载它,用这种方法,类装载器的体系结构就可以防止不可靠的代码用它们自己的版本来替代可信任的类。
    • 它将代码归入某类(称为保护域),该类确定了代码可以进行哪些操作;
三、class文件检验器
  1. 和类装载器一起,class文件检验器保证装载的class文件内容有正确的内部结构,并且这些class文件相互协调一致。
  2. class文件检验器要进行四趟独立的扫描来完成它的操作:
    • class文件的结构检查:在类被装载时进行的,它必须遵从Java的class文件的固定格式,这样它才能被正确编译成在方法区中的内部数据结构;以下三趟扫描均在方法区中数据结构上进行;
    • 类型数据的语义检查:查看方法区中的数据结构中的每个组成部分,确认每个方法描述符都是符合特定语法的、格式正确的字符串;
    • 字节码验证:对字节流进行数据流分析,这些字节流代表的是类的方法,它是由被称为操作码的单字节指令组成的序列,每一个操作码后都跟一个或多个操作数;执行字节码时,依次执行每个操作码,这就在Java虚拟机内构成了执行的线程。字节码验证确保采用任何路径在字节码流中都得到一个确定的操作码,确保操作数栈总是包含正确的数值以及正确的类型;
    • 符号引用的验证:在动态链接的过程中,如果包含在一个class文件中的符号引用被解析时,class文件检验器将进行符号引用的检查;动态链接是一个将符号引用解析为直接引用的过程。当Java虚拟机执行字节码时,如果它遇到一个操作码,这个操作码第一次使用一个指向别一个类的符号引用,那到JVM就必须解析这个符号引用。在解析时,JVM执行两个基本任务:
      1. 查找被引用的类,如果必要的话,装载它;
      2. 将符号引用替换为直接引用;
四、内置于Java虚拟机(及语言)的安全特性

Java虚拟机装载了一个类,并且对它进行了每一到第三趟的class文件检查,这些字节码就可以被运行了。除了对符号引用的检验,Java虚拟机在执行字节码时还进行了其他一些内置的安全机制的操作:

  1. 类型安全的引用转换;
  2. 结构化的内存访问;
  3. 自动垃圾收集;
  4. 数组边界检查;
  5. 空引用检查;
五、安全管理器及API
  1. Java模型的前三个部分(类装载器体系结构、class文件检验器以及Java中内置的安全特性),保持Java虚拟机的实例和它正在运行的应用程序的内部完整性,使得它们不被下载的恶意或有漏洞的代码侵犯;而安全管理器它主要是保护虚拟机的外部资源不被虚拟机内运行的恶意或有漏洞的代码侵犯;
  2. 当Java API进行任何可能不安全的操作时,它都会向安全管理器请求许可,从而强制执行自定义的安全策略;
1
0
分享到:
评论

相关推荐

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

    Java 虚拟机(JVM)自动内存管理机制 Java 虚拟机(JVM)自动内存管理机制是 Java 语言的一大特色,它使得 Java 程序员无需手动管理内存,从而提高了开发效率和程序稳定性。JVM 自动内存管理机制主要通过 JVM 的...

    Java 虚拟机学习笔记:Java 内存区域,垃圾收集,内存分配与回收策略,JVM 调优,文件结构,类加载机制,Java 程序

    Java 虚拟机学习笔记: Java 内存区域, 垃圾收集, 内存分配与回收策略, JVM 调优, 文件结构, 类加载机制, Java 程序 Java是一种面向对象的编程语言,由Sun Microsystems于1995年推出。它是一种跨平台的语言,...

    java学习笔记3(java虚拟机)

    java学习笔记3(java虚拟机)java学习笔记3(java虚拟机)

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

    通过阅读《深入理解Java虚拟机》第三章,开发者不仅可以深入理解Java的安全机制,还能学习到如何在实际项目中实施这些安全策略,提升应用的安全性。对于想要从事Java开发或者对系统安全有深入了解需求的人来说,这一...

    java虚拟机学习笔记进阶篇

    Java虚拟机(JVM)是Java程序的核心组成部分,它负责执行字节码并管理程序的内存。本篇文章将深入探讨Java虚拟机中的垃圾收集器(GC)及其对内存管理的影响。 1. 垃圾收集器的由来与作用 垃圾收集器的引入主要是...

    读书笔记:学习周志明先生的深入理解Java虚拟机的笔记.zip

    读书笔记:学习周志明先生的深入理解Java虚拟机的笔记

    学习笔记:深入浅出 Java 虚拟机.docx

    Java 虚拟机(JVM)是Java编程语言的核心组成部分,它允许Java代码在不同的操作系统上运行,实现了“一次编写,到处运行”的目标。JVM 是一个虚拟计算机,能够执行字节码(.class文件),这些字节码是Java源代码经过...

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

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

    学习笔记之java虚拟机

    ### 学习笔记之Java虚拟机详解 #### 运行时数据区域概览 Java虚拟机(JVM)运行时数据区域主要包括以下几部分:程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区以及运行时常量池。 1. **程序计数器**: -...

    深入Java虚拟机读书笔记1

    深入理解Java虚拟机,首先我们要明白Java虚拟机(JVM)的核心功能:它负责装载类文件,执行字节码,并管理内存。Java虚拟机的结构复杂且高效,主要由类装载器、执行引擎、内存管理和类库等组件构成。 类装载器是JVM...

    java学习笔记4(java虚拟机)

    java学习笔记4(java多线程)java学习笔记4(java多线程)

    java学习笔记markdown

    9. **JVM内部机制**:简述Java虚拟机的工作原理,包括类加载、内存管理、垃圾回收机制,有助于优化代码性能。 10. **泛型**:讨论Java泛型的使用,如何编写类型安全的代码,并理解其类型擦除的原理。 11. **枚举与...

    深入Java虚拟机JVM类加载学习笔记

    ### 深入Java虚拟机JVM类加载学习笔记 #### 一、Classloader机制解析 在Java虚拟机(JVM)中,类加载器(ClassLoader)是负责将类的`.class`文件加载到内存中的重要组件。理解类加载器的工作原理对于深入掌握JVM以及...

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

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

    Java学习笔记——良葛格

    Java以其“一次编写,到处运行”的特性赢得了全球程序员的喜爱,它的跨平台能力得益于Java虚拟机(JVM)。 接着,笔记会深入讲解Java的语法基础,如变量、数据类型、运算符、流程控制语句(如if、for、while)以及...

    清华大学java学习笔记

    "清华大学java学习笔记" 本资源是一个详细的 Java学习笔记,由清华大学编写,涵盖了 Java 语言的概述、发展史、工作原理、特点等多方面的知识点。 Java 语言概述 Java 语言是一种面向对象的编程语言,具有安全、...

    尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机)学习笔记_NOTE_JVM.zip

    尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机)学习笔记_NOTE_JVM

    JVM 学习笔记(Java虚拟机)

    **JVM学习笔记(Java虚拟机)** Java虚拟机(JVM)是Java语言的核心组成部分,它是Java程序运行的平台,负责解释和执行字节码。深入理解JVM对于优化Java应用程序性能至关重要。本笔记将从以下几个方面详细介绍JVM:...

    读书笔记:深入理解Java虚拟机(周志明)源码及学习笔记.zip

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

Global site tag (gtag.js) - Google Analytics