Java中Class.forName的安全性

时间:2019-02-28 19:58:53

标签: java security reflection

假设我有以下内容:

public class ForNameTest {
    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException {
        final String s = "java.lang.Integer";
        Object test = Class.forName(s).getConstructors()[0].newInstance(222);
        System.err.println(test);
    }
}

在此代码中,我从String制作了一个对象,该对象的值在编译时已知,因此,我相信此代码可以保证没有漏洞。是否有“ s”可以采用的值来执行任意代码?如果需要,“ s”可以包含所需的代码。

1 个答案:

答案 0 :(得分:0)

一个人可能可以修改.class文件,用"java.lang.Integer"替换字符串池中的字符串"com.something.MaliciousClass"。此类将被加载,并且其静态初始化程序将被执行。即使构造函数参数不匹配

但是,如果可以修改.class文件,则可以在其中放置任何类型的恶意代码,仅替换一个String是没有意义的。

如果您的字符串是在编译时分配的,则可能是安全的,如果您从某个地方读取它,请确保它包含您期望的内容,即可以实例化的类的白名单名称。