java虚拟机安全性

1.安全性
java虚拟机安全性不是阻止程序运行而是限制程序运行权限实现的,即java允许程序运行,但是程序不能进行相关的权限,比如:将不可靠程序放置在沙箱中,沙箱限制程序不能做以下操作:对本地硬盘读写,不能连接提供applet的源主机,创建新的进程和装载新的动态链接库

2.沙箱组成
2.1类装载器
2.2class文件检验器
2.3内置于jvm的安全特性
2.4安全管理器及java API
其中类装载器,安全管理器可由用户自己定义,由于两者比较复杂,容易出现安全漏洞。

3.类装载器的安全作用:
3.1防止恶意代码干涉善意代码
3.2守护被信任类库的边界
3.3将代码归入某类,该类确定代码可以执行哪些操作
类装载器3.1的作用,是通过为加载入类装载器的类创建不同的命名空间实现的,不同命名空间的类不能相互访问。
类装载3.2的作用,是双亲委派机制和3.1机理实现的,当然也可以简单通过拒绝装载某个包或者类保护边界

4.类装载器机制
自定义类加载器:使用双亲委派模式,当特定类装载器视图装载类型以前,会先默认将装载任务委派给它的双亲装载这个类型,双亲装载器再委派给它的双亲,一直到最后一个类装载器,如果某个双亲可以装载这个类型,则返回这个类型,否则,由最初的装载器装载这个类型。自定义类加载器负责加载源程序class文件,安装或下载的标准扩展class文件以及类路径中的类库class文件等等。
启动类加载器:负责装载核心class文件,而class文件负责“启动”java虚拟机class文件,因此得名。

5.class文件检验器
class文件检验器在执行前对class文件进行四次校验:
第一次(装载时):装载时校验class文件的内部结构,以保证其可以正常编译;
第二次(连接时):类型数据语义检查:检查方法描述符、超类、final类等是否符合java语法
第三次(连接时):字节码验证
第四次(解析时):校验符号引用的类、字段和方法存在,采用延迟加载策略,只有真正使用其他引用时才进行装载,如果未找到,则抛出异常,其中:对于类的引用必须给出类的全名,对字段的引用必须给出类名,字段名和字段描述符,对于方法的引用必须给出类名,方法名和方法描述符

6.二进制兼容
时机:在第四次文件检验时,检查相互引用之间的类是否兼容

7.内置于java虚拟机的安全特性:
7.1类型安全的引用转换
7.2结构化的内存访问(无指针运算)
7.3自动垃圾收集
7.4数组边界检查
7.5空引用检查
关于结构化的内存访问:在class文件中未指明运行时数据区在内存中的存储空间,运行时数据区:java栈(一个线程一个),存储字节码的方法区,垃圾收集堆,

9.安全管理器和java API
作用:保护虚拟机外部资源不被虚拟机内部恶意代码侵犯,定义沙箱外部边界,可定制的
检查内容:
1.创建新的类加载器
2.退出虚拟机
3.使用反射访问另一个类成员
4.访问本地文件
5.打开socket连接
6.启动打印作业
7.访问系统剪贴板
8.访问AWT事件队列
9.打开顶层窗口
检查顺序:
第一步:检查是否安装了安全管理器,若未安装,跳过第二步继续执行
第二步:调用check方法,若动作被禁止,则抛出异常

猜你喜欢

转载自blog.csdn.net/weixin_43638314/article/details/91352263