`
wezly
  • 浏览: 484630 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java的沙盒机制

阅读更多

JAVA 的安全模型不同于传统的安全方法,传统的安全方法中,大多数操作系统允 许应用程序充分访问系统资源,在操作系统不提供安全保护的机器里,运行环境不能被信任。为了弥补这个缺陷,安全策略经常要求在应用程序执行之前对应用程序 建立信任,例如要求程序员在执行从网上获得的应用程序前,先检查病毒和源代码中不安全的代码。这种方法有2 个问题:(1) 确定程序是否安全的检查很复杂很 浪费时间,很少有程序员愿意花时间读程序的源代码,然后再将它编译成本地机器码以保证程序是安全的。(2) 病毒检查要不断维护以保证有效性。

JAVA 的安全模型是不同的,为了防止用户系统受到通过网络下载的不安全程序的破坏,JAVA 提供了1 个自定义的可以在里面运行JAVA 程序的 沙 盒 。JAVA 的安全模型使得JAVA 成为适合于网络环境的技术。JAVA 的安全性允许用户从Internet 或Intranet 上引入或运行 applet ,applet 的行动被限制于它的 沙盒 ,applet 可以在沙盒里做任何事情,但不能读或修改沙盒外的任何数据,沙盒可以禁止不安全程序 的很多活动,如:

1. 对硬盘进行读写。

2. 和别的主机( 不包括程序所在的主机) 进行网络连接。

3. 创建1 个新过程。

4. 载入1 个新的动态库并直接调用本地方法。

 沙盒 模型的思想是在信任的环境中运行不信任的代码,这样即使用户不小心引入了不安全的applet ,applet 也不会对系统造成破坏。

1   沙盒 模型

   沙盒 安全模型是内建于JAVA 结构的,它主要由以下几部分构成:
  1. 内建于JAVA 虚拟机和语言的安全特性。
  2. 类的载入结构。
  3. 类文件校验器。
  4. 安全管理器和JAVA API 。
  下面分别进行阐述。

1.1  内建于JAVA 虚拟机和语言的安全特性
  JAVA 语言有一些机制使得JAVA 程序很稳健,这些机制也是JAVA 虚拟机(JVM) 的特点,它们是:
  1. 安全的类型转换。在C 、C++ 中,可以通过指针进行任意的类型转换,但常常带来不安全性,而在JAVA 中,运行时系统对对象的处理要进行类型相容性检查,以防止不安全的转换。
  2. 没有指针。指针是C 和C++ 中最灵活、也最容易产生错误的数据类型。由指针所进行的内存地址操作常会造成不可预知的错误,同时通过指针对某个内存 地址进行显示类型转换后,可以访问1 个C++ 中的私有成员,从而破坏安全性,造成系统的崩溃。而JAVA 对指针进行完全的控制,程序员不能直接进行任何指 针操作。
  3. 自动的垃圾收集。在C 中,程序员通过库函数malloc() 和free() 来分配和释放内存,C++ 中则通过运算符new 和delete 来分配和 释放内存。再次释放已释放的内存块或未被分配的内存块,会造成系统的崩溃;同样,忘记释放不再使用的内存块也会逐渐耗尽系统资源。而在JAVA 中,所有的 数据结构都是对象,通过运算符new 为它们分配内存堆。通过new 得到对象的处理权,而实际分配给对象的内存可能随程序运行而改变,JAVA 对此自动进行 管理并且进行垃圾收集,有效地防止了由于程序员的误操作而导致的错误,并且更好地利用了系统资源。
  4. 数组界限检查。若程序中有数组访问,JVM 就会检查数组访问是否越界,从而防止了由数组越界引起的错误。
  5. 检查null 引用。若使用的引用为null ,JVM 就会抛出1 个例外。

1.2  类载入器结构
  类载入器结构在沙盒模型中起了重要作用。在虚拟机中,类载入器负责引入、定义运行程序的类和接口的二进制数据。在虚拟机中可能有不止1 个类载入器。
  1 个JAVA 程序能使用2 种类型的类载入器:原始的类载入器和类载入器对象。原始的类载入器是JVM 实现的1 部分,它通常从本地硬盘载入安全的类,包 括JAVA API 的类。运行时,JAVA 应用程序安装类载入器对象,类载入器对象使用JAVA 语言编写,编译成类文件后,载入到虚拟机,像其他的对象一样初始化。类 载入器对象用于以自定义的方式载入类,例如通过网络下载类文件。JVM 把通过原始的类载入器载入的任何类都视为安全的,无论这个类是否是JAVA API 的1 部分。而将通过类载入器对象载入的类视为可怀疑的,缺省情况下视为不安全的。
  JAVA 的结构可以在1 个应用程序中创建多个命名空间,命名空间是由1 个特定的类载入器载入的类名的集合。JVM 为每1 个类载入器维持1 个命名空间, 这个命名空间里有由那个类载入器载入的所有类的名字。由不同类载入器载入的类在不同的命名空间里,没有程序的直接允许,这些类不能彼此访问。编写程序时, 可以将来源不同的类放在不同的命名空间里,用这种方式,就可以使用JAVA 的类载入器结构控制来源不同的代码间的相互作用,就可以防止不安全代码访问、破 坏安全代码。对于Applet ,也是同样的道理,通过将来源不同的Applet 类文件放在不同的命名空间,防止不安全代码破坏安全代码。
  在 沙盒 结构中,类载入器结构是防止不安全代码的第一道围墙,它的作用主要有2 方面:
  1. 防止不安全代码访问、破坏安全代码。
  2. 防止不安全代码冒充安全的类。
  这2 方面作用是通过下述方法实现的:
  1. 将代码分放在多个命名空间中,并在不同命名空间的代码之间设置 屏障 。类载入器结构是通过命名空间来防止不安全代码访问、破坏安全代码。命名空 间在载入到不同命名空间中的类之间设置了1 个 屏障 。在JVM 中,同一命名空间中的类可以直接相互作用,不同命名空间中的类甚至不能检测到对方的存在, 除非程序允许它们相互作用。
  2. 保护可信任类库( 像JAVA API) 的边界。如果类载入器载入1 个类,这个类用它的名字来冒充是JAVA API 的1 部分( 例如,类名为java.lang.virus) ,类载入器就传递请求给原始类载入器,如果原始类载入器不能载入这个类,类载入器就抛出安 全例外,并拒绝载入这个类。

1.3  类文件校验器
  每一个JVM 都有1 个类文件校验器,用来保证载入的类文件具有正确的内部结构。如果类文件校验器发现类文件有错误,它就抛出1个例外。
  类文件校验器能帮助检查出类使用起来是否安全。因为类文件是由二进制数据构成的,JVM 不知道这个类文件是否是由黑客产生的,是否有可能破坏虚拟机的 完整性,所以虚拟机对引入的字节码进行校验是很重要的。类文件校验器校验的过程可以分为2 个阶段:阶段1 发生在类刚载入以后,类文件校验器检查类文件的内 部结构,包括校验所含的字节码的完整性;阶段2 发生在字节码执行的时候,字节码校验器确定符号引用的类、域和方法是否存在。
1.3.1
 内部检查
  在阶段1 ,类文件校验器检查类文件是否正确组成、内部是否一致、是否遵循JAVA 编程语言的限制、含有的字节码是否能由JVM 安全执行,如果类文件校验器检查出错误,它就会抛出1 个错误,类文件就不再被程序使用。
  1. 检查格式和内部一致性
  在阶段1 ,校验器除了检查字节码的完整性,还要检查类文件的格式和内部一致性。例如,每一个类文件都必须以同样的4 字节数字0xCAFEBASE 开头,这样类文件校验器可能检查的第一件事就是引入的文件是否以0xCAFEBASE 开头。
  类文件校验器还要校验类文件的长度是否与类文件中所记录的长度一致,也即校验类文件是否完整,是否被截去一部分或者被添加。类文件校验器还要检查类是否遵循Java 语言的规定,如除了Object 类,所有的类都必须有1 个父类等。
  2. 字节码校验
  一旦类文件校验器成功地完成格式和内部一致性的检查,就开始对字节码进行校验。通过对代表类方法的字节码流进行数据流分析,进行操作码是否有效及操作码是否有有效的操作数等的检查,以验证字节码流是否可以由虚拟机安全执行。
1.3.2
 符号引用的校验
  符号引用是给出了引用项的名字和其它信息的字符串,这些信息足以用来区分类、域或方法。符号引用的校验用来验证引用是否有效,如果引用无效( 例如,如果类不能载入,或者类存在但不含有要引用的域或方法) ,类文件校验器就会抛出1 个错误。

1.4  安全管理器和JAVA API
  安全管理器定义了 沙盒 的外部边界。安全管理器是类java.lang.SecurityManager 的子类,它是自定义的。
  JAVA API 类在采取一些行动时,通常需要安全管理器检查这个行动是否安全,这些行动包括:
  1. 接受来自于特定主机的socket 连接。
  2. 修改线程( 改变线程优先级,结束线程等) 。
  3. 开放对于特定主机的socket 连接。
  4. 创建1 个新的类载入器。
  5. 删除特定的文件。
  6. 创建新的过程。
  7. 程序退出。
  8. 调用含有本地方法的动态库。
  9. 等待连接。
  10. 从特定的包载入类。
  11. 给特定的包中添加1 个新类。
  12. 访问或修改系统特性。
  13. 访问特定的系统特性。
  14. 读文件。
  15. 写文件。
  由于在执行上述动作前需要安全管理器进行检查,JAVA API 不执行安全管理器建立的安全措施所禁止的任何动作。
  JAVA API 执行1 个可能不安全活动的过程,通常分为2 步:首先,JAVA API 代码检查安全管理器是否已安装。如果没有安装,就无法进行第2 步的检查,则直接执行可能不安全的代码;如果安装了,就继续执行第2 步的检查,调用安 全管理器中合适的检查方法对动作进行检查,如果动作被禁止,检查方法就抛出1 个安全例外,不再执行不安全的活动;如果动作被允许,检查方法返回,JAVA API 方法继续执行动作。

2  结束语

安全的可靠性是和代价成正比的,安全的可靠性越高,为安全付出的代价也越高,因此安全的可靠性也并不是越高越好,应该与被保护的信息的价值相 当。计算机或网络的安全策略应该是多方面的,仅仅有1 个运行下载的JAVA 代码的 沙盒 是不够的,还应包括人员、机器等本身的安全,例如机器是否设置有 口令、雇员是否是商业间谍等。但是JAVA 安全模型的好处在于一旦建立,就可以为程序员做很多事情,程序员不必担心程序是否安全,JAVA 的安全结构已经 对程序是否安全进行了确定,如果代码不安全,利用 沙盒 结构就可以保护信息免受破坏。

分享到:
评论

相关推荐

    PaaS沙盒机制原理分析.pdf

    PaaS(Platform as a Service)沙盒机制是云计算平台中的一种关键安全措施,它为运行在云端的应用程序提供了一个受限的执行环境,确保应用程序在使用资源时不会超出预设的限制,同时保护平台免受恶意代码的攻击。...

    百宝箱业务应用程序开发规范-JAVA分册

    - **安全性**:Java沙盒机制确保应用程序之间的隔离,提高系统安全性。 - **资源消耗低**:针对移动设备的资源限制进行了优化,占用较少的内存和CPU资源。 #### 四、系统结构 系统结构部分详细描述了Java业务的...

    JDK13-java-scripting-programmers-guide.pdf

    *沙盒机制:Java脚本引擎提供了沙盒机制,限制了脚本的执行环境。 * 加密机制:Java脚本引擎提供了加密机制,保护了脚本的传输和存储。 Java脚本引擎应用场景 Java脚本引擎广泛应用于各个领域,包括: * Web开发...

    java_JAVA_WEB基本教程

    - **安全性**:Java在设计时考虑了安全问题,通过沙盒机制、权限控制等方式提供安全保障。 - **动态性**:Java的类库支持动态加载,允许程序在运行时加载和链接新的代码。 #### 三、Java编译与执行过程 Java源代码...

    java语言基础培训教程

    它的沙盒机制限制了Java程序对系统资源的访问,确保用户在使用Java小程序时的安全性。 2. 可移植性: - 源代码可移植性:Java程序在任何平台上编译都将产生相同的结果。 - CPU可移植性:Java编译后的字节码是针对...

    薄荷引擎,基础Java的3D游戏引擎。创建方块沙盒游戏,创建渲染.zip

    "薄荷引擎"是一款基于Java开发的3D游戏引擎,主要目标是帮助开发者构建方块沙盒类游戏。这类游戏通常以像素化的图形风格、开放世界和高度的玩家交互性为特点,例如知名的《我的世界》。使用Java作为编程语言,薄荷...

    sandbox

    在名为`sandbox-master`的压缩包中,很可能包含了一个Java沙盒环境的示例项目或者一个用于测试和学习沙盒机制的代码库。这个项目可能包括了如何设置安全策略、创建自定义类加载器以及如何处理权限的示例代码。通过...

    Java语言规范:基于Java SE 8 文前

    - **安全性**:Java通过严格的类型检查和异常处理机制确保代码的安全性,同时,Java沙盒模型也限制了恶意代码的执行。 - **多线程**:Java内置了对多线程的支持,使得开发者能够轻松编写高效并发的应用程序。 #### ...

    c#和java基础的资料试题一览

    2. **Java的安全性**:Java通过严格的沙盒机制保障安全性。Applet在执行前需要用户的许可,并限制对本地系统资源的访问。Java的安全模型包括类文件检查器、字节码验证器和SecurityManager,用于防止恶意代码的执行。...

    Dynamic Monitor Allocation in the Java Virtual Machine

    随着Java语言及其沙盒环境的流行,提高这些环境的性能并降低内存占用的需求日益迫切。本文档《动态监测器分配在Java虚拟机中》由Marcel Dombrowski等人撰写,主要探讨了如何在IBM Java虚拟机中实现动态监测器分配,...

    Java基础入门教程

    - **视频游戏开发**: 如知名的沙盒游戏《我的世界》即采用Java开发。 - **Android应用开发**: Android操作系统的主要开发语言。 - **桌面GUI应用程序**: 开发图形用户界面的桌面应用。 - **软件开发**: 包括Web应用...

    Java基础知识面试必备

    - **机制**: Java提供了一系列内置安全措施,如沙盒机制、访问控制等。 - **特点**: 沙盒机制限制了程序对系统资源的访问权限,有效防止恶意代码的破坏。 - **应用**: 特别适用于互联网应用程序和企业级应用,确保...

    Minecraft飞行机制的大修_Java_下载.zip

    《Minecraft飞行机制大修:Java版深度解析与下载指南》 Minecraft,这款深受全球玩家喜爱的沙盒游戏,以其无限的创造性和独特的游戏体验赢得了无数拥趸。其中,飞行作为玩家探索广阔世界的重要手段,一直备受关注。...

    Java软件开发实战 Java基础与案例开发详解 5-9 包 package 共15页.pdf

    - **安全性**:Java提供了沙盒安全机制,能够有效地防止恶意代码的执行。 - **平台无关性**:Java代码被编译成字节码后,可以在任何支持Java虚拟机(JVM)的平台上运行。 #### 1.3 Java平台的体系结构 Java平台主要...

    Minecraft的更多机制_Java_下载.zip

    Minecraft,这个由Mojang Studios开发的沙盒建造游戏,以其无限的创造性和独特的游戏机制吸引了全球无数玩家。在Java版中,游戏提供了丰富的可扩展性和自定义性,使得开发者和玩家能够通过各种方式来改变和增强游戏...

    Mindustry,沙盒塔防御游戏.zip

    《Mindustry:沙盒塔防御游戏》是一款由Java编程语言构建的开源项目,它将塔防游戏的策略元素与沙盒建造的自由度完美融合,为玩家提供了无尽的创造和挑战可能性。在这个游戏中,玩家不仅可以建造防御工事来抵御一...

    沙盒

    在Java领域,沙盒通常涉及到JVM(Java虚拟机)的安全机制,如类加载器和安全管理器。这些机制允许限制代码的执行权限,防止恶意代码破坏系统。例如,当你运行一个来自不可信来源的Java程序时,可以在沙盒环境中运行...

Global site tag (gtag.js) - Google Analytics