[英]Safety of Class.forName in java
假设我有以下内容:
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”可以包含所需的代码。
可能可以修改.class文件,以将字符串池中的字符串"java.lang.Integer"
替换为"com.something.MaliciousClass"
。 此类将被加载,并且其静态初始化程序将被执行。 即使构造函数参数不匹配。
但是,如果可以修改.class文件,则可以在其中放置任何种类的恶意代码,仅替换一个String是没有意义的。
如果您的字符串是在编译时分配的,则可能是安全的,如果从某个地方读取它,请确保它包含您期望的内容,即可以实例化的类的白名单名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.