cve-2012-4681的分析记录
一、简介
cve-2012-4681是去年8月份爆出的java沙盒的漏洞。
漏洞是利用java的特性,从受限制的沙盒代码中调用系统信任的代码,间接修改了java.beans.Statement类的参数
二、poc
该漏洞的poc如下:
于是这个问题就化简成两点:1、获取sun.awt.SunToolkit实例。 2、调用该实例的getField方法。(跟doPrivileged没啥关系)
"reflection with a trusted immediate caller",这个java特性帮我们解决了这两个问题。
http://www.oracle.com/technetwork/java/seccodeguide-139067.html 这篇文章的9-8解释了这个问题。
http://security.stackexchange.com/questions/19565/why-do-some-java-apis-bypass-standard-securitymanager-checks/37920#37920
这篇提问的答案则解释了为什么会有"reflection with a trusted immediate caller"这个特性
四、修补方式
查看源码可以知道修补方式
http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/rev/2c58f14f60c7
--- a/src/share/classes/com/sun/beans/finder/MethodFinder.java Mon Aug 13 14:20:05 2012 -0700+++ b/src/share/classes/com/sun/beans/finder/MethodFinder.java Tue Jun 19 20:06:56 2012 +0400@@ -1,5 +1,5 @@ /*- * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved.+ * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it@@ -33,6 +33,8 @@ import java.lang.reflect.Type; import java.lang.reflect.Type; import java.util.Arrays; +import static sun.reflect.misc.ReflectUtil.isPackageAccessible;+ /** * This utility class provides {@code static} methods * to find a public method with specified name and parameter types@@ -120,7 +122,7 @@ public final class MethodFinder extends */ public static Method findAccessibleMethod(Method method) throws NoSuchMethodException { Class<?> type = method.getDeclaringClass();- if (Modifier.isPublic(type.getModifiers())) {+ if (Modifier.isPublic(type.getModifiers()) && isPackageAccessible(type)) { return method; } if (Modifier.isStatic(method.getModifiers())) {
添加了isPackageAccessible(type)这个校验,这样就没有办法在低权限的代码中调用高权限的方法了。
五、其他
该漏洞的补丁其实只补了ConstructorFinder/FieldFinder/MethodFinder三个类,但是并没有涉及到ClassFinder,有意思的是下一次更改就修补了ClassFinder(http://hg.openjdk.java.net/jdk7u/jdk7u/jdk/rev/dfffff29f870),修补说明是XMLDecoder security issue via ClassFinder.
这个漏洞被定义为CVE-2012-1682,目前为止我还没有找到poc.。