组成Java沙箱的基本组件如下:
·类加载体系结构
·class文件检验器
·内置于Java虚拟机(及语言)的安全特性
·安全管理器及Java API
Java安全模型的前三个部分——类加载体系结构、class文件检验器、Java虚拟机(及语言)的安全特性一
起达到一个共同的目的:保持Java虚拟机的实例和它正在运行的应用程序的内部完整性,使得它们不被下载的恶意代码或有漏洞的代码侵犯。相反,这个安全模
型的第四个组成部分是安全管理器,它主要用于保护虚拟机的外部资源不被虚拟机内运行的恶意或有漏洞的代码侵犯。这个安全管理器是一个单独的对象,在运行的
Java虚拟机中,它在对于外部资源的访问控制起中枢作用。
类加载体系结构
类加载器要加载一个类,它首先检查此类是否已被加载,
然后再委托双亲加载器加载此类,它的双亲加载器再委托它的双亲,这样一直委托到启动加载器,启动加载器在从核心API查找此类,如果有就返回此类,否则就
他的子加载器就查找此类,如果都没有就抛出ClassNotFound的异常。如下图所示:
这种委托双亲的模式好处是:启动类加载器可以抢在标准扩展类装载器之前去装载类,而标准扩展类装载器可以抢在类路径加载器之前去装载那个类,类路径
装载器又可以抢在自定义类加载器之前去加载它。所以Java虚拟机先从最可信的Java核心API查找类型,这是为了防止不可靠的类扮演被信任的类,试想
一下,网络上有个名叫java.lang.Integer的类,它是某个黑客为了想混进java.lang包所起的名字,实际上里面含有恶意代码,但是这
种伎俩在双亲模式加载体系结构下是行不通的,因为网络类加载器在加载它的时候,它首先调用双亲类加载器,这样一直向上委托,直到启动类加载器,而启动类加
载器在核心Java
API里发现了这个名字的类,所以它就直接加载Java核心API的java.lang.Integer类,然后将这个类返回,所以自始自终网络上的
java.lang.Integer的类是不会被加载的。
但是如果这个移动代码不是去试图替换一个被信任的类(就是前面说的那种情况),而是想在一个被信任的包中插入一个全新的类型,情况会怎样呢?比如一
个名为java.lang.Virus的类,经过双亲委托模式,最终类装载器试图从网络上下载这个类,因为网络类装载器的双亲们都没有这个类(当然没有
了,因为是病毒嘛)。假设成功下载了这个类,那你肯定会想,Virus和lang下的其他类痛在java.lang包下,暗示这个类是Java
API的一部分,那么是不是也拥有修改Java.lang包中数据的权限呢?答案当然不是,因为要取得访问和修改java.lang包中的权
限,java.lang.Virus和java.lang下其他类必须是属于同一个运行时包的,什么是运行时包?运行时包是指由同一个类装载器装载的、属
于同一个包的、多个类型的集合。考虑一下,java.lang.Virus和java.lang其他类是同一个类装载器装载的吗?不是
的!java.lang.Virus是由网络类装载器装载的!
class文件校验器,通过四趟扫描,保证了class文件正确
第一趟是,检查class文件的结构是否正确。比较典型的就是,检查class文件是否以魔数OxCAFEBABE打头。
通过这趟检查,可以过滤掉大部分可能损坏的,或者压根就不是class的文件,来冒充装载。
第二趟是,检查它是否符合java语言特性里的编译规则。比如发现一个类的超类不是Object,就抛出异常。
第三趟是,检查字节码是否能被JVM安全的执行,而不会导致JVM崩溃。这里提到了一个停机的问题。内容是这样的,“即不可能写出一个程序,用它来判定作为其输入而读入的某个程序,是否会停机”。意思是,不可能写一个程序,让它告诉你,另外一个程序会不会中断或崩溃。
第四趟是,符号引用验证。一个类文件,它会包含它引用的其他类的全名和描述符,并跟他们建立符号引用(一种虚拟的,非物理连接的方式)。当程序第一次执行到需要符号引用的位置时,jvm会检查这个符号链接的正确性,然后建立真正的物理引用(直接引用)。
内置于Java虚拟机(及语言)的安全特性
这些都是基础的java语言特性,他们降低了java程序出现内存混乱,崩溃的几率。
·结构化内存访问(不使用指针,一定程度上让黑客无法篡改内存数据)
·自动垃圾收集
·数组边界检查
·空引用检查
·数据类型安全
安全管理器及Java API
这是安全沙箱中,离我们程序员最接近的一环。
securityMananger,是一个api级别的,可自定义的安全策略管理器,它深入到java api中,在各处都可以见到它的身影。比如SecurityClassLoader。
默认情况下,java应用程序是不设置 securityManager 实例的(意味着不会起到安全检查),这个实例需要我们在程序启动时通过 System.setSecurityManager 来设置。
一般情况下,检查权限是,通过 SecurityManager.checkPermission(Permission perm) 来完成的。外部程序通过,创建Permission实例,传递给前面的check。
Permission是一个抽象类,需要继承它实现不同的权限验证,比如 FilePermission,代表对某个文件的读写权限。
new FilePermission("test.txt", "read")
你可以将这个实例,扔给 SecurityManager,检查是否可读text.txt这个文件
相关推荐
身份认证和访问控制:Java安全包括用户身份认证和授权机制,以确保只有经过验证的用户可以访问受限资源。常见的身份认证方式包括用户名密码验证、令牌(Token)验证和双因素认证等。 数据加密和传输安全:Java提供...
在Java EE中,沙箱机制主要体现在容器对应用程序的管理和控制上。容器是Java EE平台的核心组成部分,它负责加载、配置、运行和管理Java EE组件,如Servlet、EJB(Enterprise JavaBeans)、JMS(Java Message Service...
Java的安全沙箱机制是确保Java应用程序能够在不损害系统安全的前提下运行的重要保障。本文将详细介绍Java沙箱模型的核心组成部分,并深入探讨类装载器、类文件校验器的作用及其在Java安全体系中的地位。 #### Java...
5. 安全性和可靠性:Java通过沙箱模型和严格的类型检查,确保程序的安全性,同时通过异常处理机制提高了程序的可靠性。 Java与C++之间的区别在于: 1. 跨平台性:Java通过JVM实现跨平台,而C++依赖于特定的编译器和...
本文基于给定的文件信息,深入探讨Java安全机制的关键组成部分及其运作原理。 ### Java安全机制的体系结构 Java安全架构的核心在于其设计时就充分考虑了安全因素,而不是后期添加的。这一设计思路主要体现在以下三...
综上所述,Java的安全机制通过多层防护,包括代码签名、权限控制、安全管理器和证书机制,为开发者和用户提供了一个相对安全的运行环境。这些特性使得Java成为开发网络应用和安全敏感系统的理想选择。通过深入理解和...
Java安全性机制是Java编程语言的核心特性之一,它旨在保护系统免受恶意代码的攻击,确保应用程序在执行时的安全性。本资料"Java安全性机制的形式分析与证明"深入探讨了这一主题,通过形式化方法对Java的安全特性进行...
在IT行业中,安全沙箱是一种重要的安全机制,用于限制应用程序的权限,防止它们对系统造成潜在的危害。在 Flash 技术中,安全沙箱的概念尤为关键,因为它允许 Flash 内容在网页上运行,同时限制了其对用户计算机的...
6. **安全性考虑**:在Java和JavaScript之间进行互操作时,安全问题不容忽视。书中会讨论如何设置沙箱环境,限制JavaScript代码的权限,防止恶意脚本对系统造成破坏。 7. **实际应用案例**:为了更好地理解和应用...
4. 沙箱机制:Java的沙箱机制是一种严格的运行环境,它限制了未经验证的代码(如来自网络的Applet)的运行权限。沙箱内的代码只能访问特定的资源,防止恶意代码对系统造成破坏。 5. 类与对象的访问控制:Java的访问...
Java安全性编程指南主要聚焦于如何在Java平台上编写安全的代码,以防止潜在的攻击和漏洞。PDG(Programmer's Defense Guide)格式文件通常是一种技术文档,为开发者提供详细的指导和最佳实践。以下是对Java安全性...
安全沙箱是Flash Player为了防止恶意代码对用户的系统造成危害而实施的一种安全机制。它将Flash内容分为不同的沙箱,如本地沙箱、网络沙箱等,限制了不同沙箱之间的交互。对于Socket通信,AS中的Socket类只能连接到...
安全管理器是Java安全模型的核心组件,它可以根据策略文件定义的规则,决定代码是否具有执行特定操作的权限。 9. **安全编程实践**: 除了语言级别的安全特性,良好的编程习惯也至关重要,如避免使用不安全的API...