Java安全模型的核心就是Java沙箱(sandbox), 什么是沙箱?
沙箱是一个 限制程序运行的环境。沙箱机制就是将Java代码限定在虚拟机(JVM)
特定的运行范围中,并且严格限制代码对本地系统资源访问,通过这样的措施来保证
对代码的 有效隔离,防止对本地系统造成破坏。 沙箱主要限制系统资源访问,那系统资源包括什么?
CPU、内存、文件系统、网络、不同级别的沙箱对这些资源访问的限制也可以不一样。
所有的JAVA程序 运行都可以指定沙箱,可以定制安全策略。
在Java中将执行程序分为本地代码和远程代码两种,本地代码默认视为可信任的,而远程代码则被看作是不受信的。对于授信的本地代码,可以访问一切本地资源,而对于非授信的远程代码,在早期的java实现中,完成依赖于沙箱机制(Sandbox)机制。
如下图所示JDK1.0安全模型
但,如此严格的安全机制也给程序的功能扩展带来障碍,比如当用户希望远程代码访问本地系统的文件时候,就无法实现。因此在后续的Java1.1版本中,针对安全机制做了改进,增加了安全策略,允许用户指定代码对本地资源的访问权限,如下图所示JDK1.1安全模式
在 Java1.2版本中,再次改进了安全机制,增加了 代码签名。不论本地代码或是远程代码,都会按照用户的安全策略设定,由类加载器加载到虚拟机中权限不同的运行空间,来实现差异化的代码执行权限控制,如下图所示JDK1.2安全模型
当前最新的安全机制实现,则引入了域(Domain)的概念,虚拟机会把所有代码加载到不同的系统域和 应用域,系统域部分专门负责与关键资源进行交互,而各个应用域部分则通过系统域的部分代理来对各种需要的资源进行访问。虚拟机中不同的受保护域(Protected Domain),对应不一样的权限(Premission). 存在于不同域中的类文件就具有了当前域的全部权限
如下图所示 ,最新的安全模型jdk1.6
例如:root权限最高
组成沙箱的基本组件:
Ⅰ:字节码校验器(bytecode verifier) : 确保java类文件 遵循java语言规范,这样可以帮助java程序实现内存保护、但并不是所有类文件都会经过字节码校验,比如核心类
Ⅱ:类加载器(Class Loader): 其中 类装载器在3个方面 对java沙箱起作用
1、它防止恶意代码去干涉 善意的代码 //双亲委派机制
2、它守护了被信任的类库边界
3、它将代码归入保护域,确定了代码可以进行哪些操作
虚拟机为不同的类加载器 载入的类提供了不同的命名空间,命名空间由一系列唯一的名称组成,每一个被装载的类将有一个名字,这个命名空间是由Java虚拟机为每一个类装载器维护的,他们互相之间甚至不可见。
类装载器采用的机制是 双亲委派模式
1、从最内层JVM自带类加载器开始加载,外层恶意同名类得不到加载从而无法使用
2、由于严格通过包来区分了访问域,外层恶意的类通过内置代码也无法获得权限访问到内层类,破坏代码就自然无法生效。
①:存取控制器(access controller) : 存取控制器可以控制核心API对操作系统的存取权限,而这个控制的策略设定,可以由用户指定
②:安全管理器(security manager): 是核心API和操作系统之间的主要接口。实现权限控制,比存取控制器的优先级高
③:安全软件包(security package): java.security下的类和扩展包下的类,允许用户为自己的应用增加新的安全特性,包括
1、安全提供者
2、消息提供者
3、数字签名
4、加密
5、鉴别