说明,本文部分内容转自:http://galaxystar.iteye.com/blog/225615
参考书籍:《Inside the Java Virtual Machine,Second Edition》
组成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的安全沙箱机制是确保Java应用程序能够在不损害系统安全的前提下运行的重要保障。本文将详细介绍Java沙箱模型的核心组成部分,并深入探讨类装载器、类文件校验器的作用及其在Java安全体系中的地位。 #### Java...
书中会讲解如何利用Java安全沙箱机制来限制代码的权限,防止恶意代码执行。Java的类加载器和安全策略文件是控制代码访问权限的关键组件。开发者需要理解如何配置和管理这些安全策略,以确保应用程序只能访问其应有的...
本文基于给定的文件信息,深入探讨Java安全机制的关键组成部分及其运作原理。 ### Java安全机制的体系结构 Java安全架构的核心在于其设计时就充分考虑了安全因素,而不是后期添加的。这一设计思路主要体现在以下三...
在IT行业中,安全沙箱是一种重要的安全机制,用于限制应用程序的权限,防止它们对系统造成潜在的危害。在 Flash 技术中,安全沙箱的概念尤为关键,因为它允许 Flash 内容在网页上运行,同时限制了其对用户计算机的...
安全沙箱是Flash Player为了防止恶意代码对用户的系统造成危害而实施的一种安全机制。它将Flash内容分为不同的沙箱,如本地沙箱、网络沙箱等,限制了不同沙箱之间的交互。对于Socket通信,AS中的Socket类只能连接到...
身份认证和访问控制:Java安全包括用户身份认证和授权机制,以确保只有经过验证的用户可以访问受限资源。常见的身份认证方式包括用户名密码验证、令牌(Token)验证和双因素认证等。 数据加密和传输安全:Java提供...
本文主要讨论的是一个关于SAE(Sina App Engine)云服务中的安全问题,涉及Java安全沙箱的绕过。SAE是新浪提供的一个云服务平台,为用户提供PHP和JAVA等环境来构建网站。为了保护云上的用户免受恶意攻击,如DDoS...
### Java安全机制的研究 #### 一、引言 随着计算机技术特别是互联网技术的快速发展,网络安全问题变得越来越重要。Java作为一种跨平台的语言,由于其强大的功能和广泛的适用性,在金融、在线商务、网络数据库等...
Java安全性机制是Java编程语言的核心特性之一,它旨在保护系统免受恶意代码的攻击,确保应用程序在执行时的安全性。本资料"Java安全性机制的形式分析与证明"深入探讨了这一主题,通过形式化方法对Java的安全特性进行...
4. **安全策略配置不当**:Java安全策略文件定义了哪些操作是允许的。如果配置不当,攻击者可能发现并利用这些弱点,获取超出预期的权限。 5. **Web应用防火墙**:作为防御手段,Web应用防火墙(WAF)可以检测和...
- **安全性保障**:通过沙箱机制等手段,JVM提供了强大的安全保护措施,防止恶意代码对系统的破坏。 #### 3. 类加载器(ClassLoader) 类加载器是JVM的重要组成部分之一,它负责将Java类加载到内存中,并对其进行...
12. **Java的沙箱机制**:理解Java Applet和Java Web Start的沙箱限制,以及如何为不受信任的代码设置适当的权限边界。 13. **安全框架**:利用现有的安全框架,如Spring Security或Apache Shiro,可以简化安全实现...
Java安全性编程实例主要涵盖的是Java平台上的安全机制和实践,这对于任何希望构建可靠、安全的Java应用程序的开发者来说都是至关重要的。Java作为一种跨平台的编程语言,其安全性是其核心特性之一,它提供了多种机制...
1. **Java安全模型**:Java的安全模型基于沙箱机制,它限制了代码(尤其是来自不可信源的代码)的执行权限,以防止恶意行为。理解这个模型是确保代码安全的基础。 2. **类加载器与权限**:Java中的类加载器负责加载...
Java沙箱逃逸攻击是指恶意代码试图突破Java安全模型的限制,获取系统级权限或执行非授权操作的行为。为了防止这种攻击,开发者可以利用Java字节码插桩和方法挂钩技术来增强应用的安全性。本文将深入探讨这两种技术...
"Java安全技术" Java 安全技术是指在 Java 平台上实现安全的各种机制和技术。 Java 安全技术的主要内容包括安全基本知识、Java 安全模型和 Java 密码学结构。 安全基本知识包括攻击、保护、密码学、机密性、认证、...
Java安全性编程是现代Java开发中不可或缺的一部分,尤其是在网络应用、移动设备和企业级系统中,保护用户数据和系统安全显得尤为重要。本指南旨在提供全面的Java安全编程实践和策略,帮助开发者构建更安全的Java应用...
Flex安全沙箱问题是一个在开发基于...总的来说,解决Flex安全沙箱问题需要深入理解沙箱机制、跨域策略和`crossdomain.xml`文件的配置,同时关注服务器端的实现细节,以确保应用程序既能正常运行,又能保障用户的安全。
Java安全性编程是网络信息安全的重要组成部分,它涉及到保护代码、数据以及网络资源免受恶意攻击或未经授权的访问。在Java平台上,安全编程是一个关键的实践领域,因为它提供了丰富的API和机制来确保应用程序的安全...
首先,Java安全模型是Java平台的核心组成部分,它提供了一种沙箱环境,限制了代码(特别是来自不可信来源的网络代码)对系统资源的访问。这个模型由类加载器、安全管理器和安全策略组成。类加载器负责加载类,而安全...