1.概述

本文介绍了JAVA虚拟机一些安全基础,第四节介绍了两个非常著名的JAVA 0day,分析了cve-2012-0507 漏洞原理和jdk1.70day漏洞,这两个漏洞被广泛应用于浏览器挂马。第五节介绍了java大牛lxlzx对新浪云平台SAE的五次绕过。

Java从JDK 1.0开始实现了一套沙箱环境,主要应用于Applet,使远程的非可信代码只能在受限的环境下执行。Java沙箱 安全建立在 Java 运行时环境的三个基本方面的基础上:ByteCode Verifier(字节码验证器)、Security Manager(安全管理器)以及 ClassLoader(类装入器)。

ByteCode Verifier 确保所下载的代码被恰当地格式化,字节码(“Java 虚拟机”指令)没有违反这种语言或虚拟机的安全限制(无非法数据转换),没有执行指针寻址,内部堆栈不能溢出或下溢,以及字节码指令将拥有正确的类型参数。

Security Manager 在尝试执行文件 I/O 和网络 I/O、创建新的ClassLoader、操作线程或线程组、启动底层平台(操作系统)上的进程、终止“Java 虚拟机”、将非 Java 库(本机代码)装入到 JVM、完成某种类型的窗口系统操作以及将某种类型的类装入到 JVM 中时发起运行时访问控制。

Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader。当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程。

2. SecurityManager

安全管理器为JAVA沙箱安全最核心的部分,SecurityManager类包含了大量访问控制的方法。开启安全管理器意味着程序将在沙箱环境下运行,命令行下运行java程序可通过如下选项来启动安全管理器。

java  -Djava.security.manager classname

2.1 Policy

策略是指某些代码对某些资源具有某些操作权限,策略放在策略文件中,策略文件包含了将代码来源映射为权限的指令。下面是一个典型的策略文件:

grant codeBase “http://lanz.sinaapp.com”{
permission java.io.FilePermission “/tmp/*”, “read,write”;
};
该文件给所有下载自http://lanz.sinaapp.com的代码授予在/tmp目录下读取和写入文件的权限。