如何在Java中启用SecurityManager创建newInstance

时间:2017-07-11 18:37:37

标签: java security securitymanager

我需要创建从不受信任的类文件加载的类的新实例。 现在我做以下事情:

classLoader.loadClass(UNSTRUSTED_CLASS).newInstance()

问题在于,如果我启用安全管理器,它不允许调用newInstance,但是如果我禁用了安全管理器,则可以将恶意代码放入初始化块中,并且它可以毫无问题地执行。

如何完成创建不受信任的类的新实例?

2 个答案:

答案 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/ThreadLocals.

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.