jvm_sec.jpg

目前个人理解,绕过 Java 安全沙箱一般有这些方式:

  • 利用有缺陷的 API (较常见)

    • 能够任意获取构造函数对象、方法对象、域对象、类对象
    • 可以被直接或间接地调用
    • 优点:稳定,容易利用
    • 代表:CVE-2012-4681、CVE-2012-0507、CVE-2012-5076
  • 缓冲区溢出

因为我对二进制并不熟,所以接下来说的都是 API 缺陷导致的漏洞。
绕过沙箱最重要的就是将 SecurityManager 设为 null,而更改 SecurityManager 也有几种方式:

  • 获得一个高权限的 ClassLoader,然后加载提权类,在提权类中关闭 SecurityManager

  • 获得一个有 AllPermission 的 AccessControlContext 对象,执行 setSecurityManager(null) 操作

其中 Java 的反射机制经常用到,如 CVE-2012-0507 里经典的类混淆。

一些资料:

空虚浪子心的 Java 安全文章
Java 沙箱安全总结
JVM 逃逸:分析、利用与防御
Hacking_java_sandbox_on_cloud_appEngine.ppt
简单谈谈Java Exploit.doc
Java 安全演进.docx
java 漏洞调试科普.docx
Security-Vulnerabilitie- in-Java-SE-2012-01-report.pdf
Security-Vulnerabilitie- in-Java-SE-2014-02-report.pdf

待续