网络安全

位置:IT落伍者 >> 网络安全 >> 浏览文章

JAVA的安全结构


发布日期:2023年02月23日
 
JAVA的安全结构

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

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

对硬盘进行读写

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

创建个新过程

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

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

沙盒模型

沙盒安全模型是内建于JAVA结构的它主要由以下几部分构成

内建于JAVA虚拟机和语言的安全特性

类的载入结构

类文件校验器

安全管理器和JAVA API

下面分别进行阐述

内建于JAVA虚拟机和语言的安全特性

JAVA语言有一些机制使得JAVA程序很稳健这些机制也是JAVA虚拟机(JVM)的特点它们是

安全的类型转换在CC++中可以通过指针进行任意的类型转换但常常带来不安全性而在JAVA中运行时系统对对象的处理要进行类型相容性检查以防止不安全的转换

没有指针指针是C和C++中最灵活也最容易产生错误的数据类型由指针所进行的内存地址操作常会造成不可预知的错误同时通过指针对某个内存地址进行显示类型转换后可以访问个C++中的私有成员从而破坏安全性造成系统的崩溃而JAVA对指针进行完全的控制程序员不能直接进行任何指针操作

自动的垃圾收集在C中程序员通过库函数malloc()和free()来分配和释放内存C++中则通过运算符new和delete来分配和释放内存再次释放已释放的内存块或未被分配的内存块会造成系统的崩溃同样忘记释放不再使用的内存块也会逐渐耗尽系统资源而在JAVA中所有的数据结构都是对象通过运算符new为它们分配内存堆通过new得到对象的处理权而实际分配给对象的内存可能随程序运行而改变JAVA对此自动进行管理并且进行垃圾收集有效地防止了由于程序员的误操作而导致的错误并且更好地利用了系统资源

数组界限检查若程序中有数组访问JVM就会检查数组访问是否越界从而防止了由数组越界引起的错误

检查null引用若使用的引用为nullJVM就会抛出个例外

类载入器结构

类载入器结构在沙盒模型中起了重要作用在虚拟机中类载入器负责引入定义运行程序的类和接口的二进制数据在虚拟机中可能有不止个类载入器

个JAVA程序能使用种类型的类载入器原始的类载入器和类载入器对象原始的类载入器是JVM实现的部分它通常从本地硬盘载入安全的类包括JAVA API的类运行时JAVA应用程序安装类载入器对象类载入器对象使用JAVA语言编写编译成类文件后载入到虚拟机像其他的对象一样初始化类载入器对象用于以自定义的方式载入类例如通过网络下载类文件JVM把通过原始的类载入器载入的任何类都视为安全的无论这个类是否是JAVA API的部分而将通过类载入器对象载入的类视为可怀疑的缺省情况下视为不安全的

JAVA的结构可以在个应用程序中创建多个命名空间命名空间是由个特定的类载入器载入的类名的集合JVM为每个类载入器维持个命名空间这个命名空间里有由那个类载入器载入的所有类的名字由不同类载入器载入的类在不同的命名空间里没有程序的直接允许这些类不能彼此访问编写程序时可以将来源不同的类放在不同的命名空间里用这种方式就可以使用JAVA的类载入器结构控制来源不同的代码间的相互作用就可以防止不安全代码访问破坏安全代码对于Applet也是同样的道理通过将来源不同的Applet类文件放在不同的命名空间防止不安全代码破坏安全代码

沙盒结构中类载入器结构是防止不安全代码的第一道围墙它的作用主要有方面

防止不安全代码访问破坏安全代码

防止不安全代码冒充安全的类

方面作用是通过下述方法实现的

将代码分放在多个命名空间中并在不同命名空间的代码之间设置屏障类载入器结构是通过命名空间来防止不安全代码访问破坏安全代码命名空间在载入到不同命名空间中的类之间设置了屏障在JVM中同一命名空间中的类可以直接相互作用不同命名空间中的类甚至不能检测到对方的存在除非程序允许它们相互作用

保护可信任类库(像JAVA API)的边界如果类载入器载入个类这个类用它的名字来冒充是JAVA API的部分(例如类名为javalangvirus)类载入器就传递请求给原始类载入器如果原始类载入器不能载入这个类类载入器就抛出安全例外并拒绝载入这个类

类文件校验器

每一个JVM都有个类文件校验器用来保证载入的类文件具有正确的内部结构如果类文件校验器发现类文件有错误它就抛出个例外

类文件校验器能帮助检查出类使用起来是否安全因为类文件是由二进制数据构成的JVM不知道这个类文件是否是由黑客产生的是否有可能破坏虚拟机的完整性所以虚拟机对引入的字节码进行校验是很重要的类文件校验器校验的过程可以分为个阶段阶段发生在类刚载入以后类文件校验器检查类文件的内部结构包括校验所含的字节码的完整性阶段发生在字节码执行的时候字节码校验器确定符号引用的类域和方法是否存在

内部检查

在阶段类文件校验器检查类文件是否正确组成内部是否一致是否遵循JAVA编程语言的限制含有的字节码是否能由JVM安全执行如果类文件校验器检查出错误它就会抛出个错误类文件就不再被程序使用

检查格式和内部一致性

在阶段校验器除了检查字节码的完整性还要检查类文件的格式和内部一致性例如每一个类文件都必须以同样的字节数字xCAFEBASE开头这样类文件校验器可能检查的第一件事就是引入的文件是否以xCAFEBASE开头

类文件校验器还要校验类文件的长度是否与类文件中所记录的长度一致也即校验类文件是否完整是否被截去一部分或者被添加类文件校验器还要检查类是否遵循Java语言的规定如除了Object类所有的类都必须有个父类等

字节码校验

一旦类文件校验器成功地完成格式和内部一致性的检查就开始对字节码进行校验通过对代表类方法的字节码流进行数据流分析进行操作码是否有效及操作码是否有有效的操作数等的检查以验证字节码流是否可以由虚拟机安全执行

符号引用的校验

符号引用是给出了引用项的名字和其它信息的字符串这些信息足以用来区分类域或方法符号引用的校验用来验证引用是否有效如果引用无效(例如如果类不能载入或者类存在但不含有要引用的域或方法)类文件校验器就会抛出个错误

安全管理器和JAVA API

安全管理器定义了沙盒的外部边界安全管理器是类javalangSecurityManager的子类它是自定义的

JAVA API类在采取一些行动时通常需要安全管理器检查这个行动是否安全这些行动包括

接受来自于特定主机的socket连接

修改线程(改变线程优先级结束线程等)

开放对于特定主机的socket连接

创建个新的类载入器

删除特定的文件

创建新的过程

程序退出

调用含有本地方法的动态库

等待连接

从特定的包载入类

给特定的包中添加个新类

访问或修改系统特性

访问特定的系统特性

读文件

写文件

由于在执行上述动作前需要安全管理器进行检查JAVA API不执行安全管理器建立的安全措施所禁止的任何动作

JAVA API执行个可能不安全活动的过程通常分为首先JAVA API代码检查安全管理器是否已安装如果没有安装就无法进行第步的检查则直接执行可能不安全的代码如果安装了就继续执行第步的检查调用安全管理器中合适的检查方法对动作进行检查如果动作被禁止检查方法就

上一篇:Java系统线程组如何才能安全组建

下一篇:Java Swing开发中的线程安全