java虚拟机内置的安全特性
java虚拟机在执行字节码时还进行其他一些内置的安全机制的操作。
1.类型安全的引用转换
2.结构化的内存访问(无指针算法)
3.自动化垃圾收集(不必显式地释放被分配的内存)
4.数组边界检查
5.空引用检查
java程序只能使用类型安全,结构化的方法去访问内存
这样可以避免黑客知道一个类装载器在内存中的位置,赋予一个指针指向那块内存,从而对类装载器的数据进行操作,而达到破坏安全系统的目的。
未指明运行时数据空间在java虚拟机内部是怎样分布的
运行时数据空间是指一些java虚拟机用来存储一个运行时java程序所需的内存空间。包括:java栈(每个线程一个),一个存储字节码的方法区,以及一个垃圾收集堆(用来存储由运行的程序创建的对象)。java虚拟机规范并未决定使用什么数据结构来表示运行时的数据空间,并且存放在内存中的哪个位置。这样,黑客就不能够凭借class文件中的内容,知道内存中数据的内存布局。这样,即使能够突破java虚拟机的内存访问限制,也会无法找到他们想找到的内容。但是可以使用本地方法来达到破坏内存的目的。
异常的结构化错误处理
当一个违反安全的行为发生时,java虚拟机会做一些异常的结构化处理,java虚拟机将抛出一个异常或者错误,而不是崩溃。这个异常或者错误将导致这个线程死亡,而不是整个系统陷入瘫痪。异常机制使程序能够将控制从发生异常的地方转到处理这个异常的情况。
安全管理器和java api
java安全模型的前三个组成部分-类装载器体系结构,class文件检验器和java内置的安全特性一起达到一个共同的目的:
保持java虚拟机实例和它正在运行的应用程序的内部完整性,使得它们不受恶意或者有漏洞的代码侵犯。
java安全模型的第四部分:安全管理器:主要用于保护虚拟机的外部资源不被虚拟机内运行的文件或者有漏洞的代码侵犯。
安全管理器是一个单独的对象,在运行的java虚拟机中,它在访问控制–对于外部资源的访问控制–中起中枢作用。
安全管理器负责两个方面的工作:
1)说明一个安全策略
2)执行这个安全策略
java安全模型的不足
无法阻止恶意移动代码不断分配内存直到内存耗尽
无法阻止恶意代码不断生成线程
其实不仅是恶意代码,我们自己写代码的时候也要避免不断分配内存和不断生成线程的现象的产生。