我需要创建从不受信任的类文件加载的类的新实例。 现在我做以下事情:
classLoader.loadClass(UNSTRUSTED_CLASS).newInstance()
问题在于,如果我启用安全管理器,它不允许调用newInstance,但是如果我禁用了安全管理器,则可以将恶意代码放入初始化块中,并且它可以毫无问题地执行。
如何完成创建不受信任的类的新实例?
答案 0 :(得分:0)
嗯,我用的是什么。 至于我有自定义类加载器从特定位置加载不受信任的代码,我可以在策略文件中为我的可信代码定义代码库,我授予了使用反射的权限。因此,来自其他代码库的不受信任的代码没有此权限。 即。
grant codeBase "file:/C:/path/to/trusted/code/classes" {
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
使用此策略文件,从codeBase中指定的其他位置加载的所有代码都没有任何权限。
答案 1 :(得分:0)
The static initialiser and constructors of a class will always execute with that class on the stack, and hence the appropriate ProtectionDomain
in the AccessControlContext
. That's not to say there may be other issues with, for instance, actually getting a class from a parent class loader, giving access to the current Thread
/ThreadGroup
/AppContext
/ThreadLocal
s.
Other than that, the three-arg Class.forName
allows loading a class without initialisation. However, it's probably more typical to load the class using code in a parent class loader.