我需要创建一个从不受信任的类文件中加载的类的新实例。 现在我做以下操作:
classLoader.loadClass(UNSTRUSTED_CLASS).newInstance()
问题在于,如果我启用了安全管理器,它将不允许调用newInstance方法,但是如果禁用了安全管理器,则可以将恶意代码放入初始化块中,并且可以毫无问题地执行。
如何创建不受信任类的新实例?
我需要创建一个从不受信任的类文件中加载的类的新实例。 现在我做以下操作:
classLoader.loadClass(UNSTRUSTED_CLASS).newInstance()
问题在于,如果我启用了安全管理器,它将不允许调用newInstance方法,但是如果禁用了安全管理器,则可以将恶意代码放入初始化块中,并且可以毫无问题地执行。
如何创建不受信任类的新实例?
类的静态初始化程序和构造函数将始终与该类一起在堆栈上执行,因此在AccessControlContext
中适当的ProtectionDomain
。这并不是说可能存在其他问题,例如从父类加载器获取类,从而允许访问当前Thread
/ThreadGroup
/AppContext
/ThreadLocal
。
除此之外,三个参数的Class.forName
允许加载一个类而不进行初始化。但是,使用父类加载器中的代码加载类可能更典型。
好的,我使用了自定义类加载器从特定位置加载不受信任的代码。我可以在策略文件中为我的可信代码定义代码库,并授予其使用反射的权限。因此,来自另一个代码库的不受信任的代码将没有这个权限。
grant codeBase "file:/C:/path/to/trusted/code/classes" {
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
使用此策略文件,从除了 codeBase 指定的位置加载的所有代码都将没有任何权限。
ProtectionDomain
就可以通过Policy
或ClassLoader
获得必要的实例化特权,而后者仍然受到(严格)访问控制的限制吗? - Uux