如何在 Java 中创建启用了 SecurityManager 的新实例
How to create newInstance with enabled SecurityManager in Java
我需要创建从不受信任的 class 文件加载的 class 的新实例。
现在我执行以下操作:
classLoader.loadClass(UNSTRUSTED_CLASS).newInstance()
问题是,如果我启用安全管理器,它不允许调用 newInstance,但如果我禁用安全管理器,就可以将恶意代码放入初始化块,并且它可以毫无问题地执行。
如何完成创建不受信任的新实例class?
嗯,我用的什么。
至于我有自定义 class 加载程序,它从特定位置加载不受信任的代码,我可以在策略文件中为我的受信任代码定义代码库,我授予使用反射的权限。因此,来自另一个代码库的不受信任的代码没有此权限。
即
grant codeBase "file:/C:/path/to/trusted/code/classes" {
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
使用此策略文件,所有从 codeBase 中指定位置以外的其他位置加载的代码将没有任何权限。
class 的静态初始化程序和构造函数将始终与堆栈上的 class 一起执行,因此 AccessControlContext
中的适当 ProtectionDomain
。这并不是说可能存在其他问题,例如,实际上从父 class 加载程序获取 class,从而可以访问当前的 Thread
/ThreadGroup
/AppContext
/ThreadLocal
s.
除此之外,三参数 Class.forName
允许加载 class 而无需初始化。但是,使用父 class 加载程序中的代码加载 class 可能更典型。
我需要创建从不受信任的 class 文件加载的 class 的新实例。 现在我执行以下操作:
classLoader.loadClass(UNSTRUSTED_CLASS).newInstance()
问题是,如果我启用安全管理器,它不允许调用 newInstance,但如果我禁用安全管理器,就可以将恶意代码放入初始化块,并且它可以毫无问题地执行。
如何完成创建不受信任的新实例class?
嗯,我用的什么。 至于我有自定义 class 加载程序,它从特定位置加载不受信任的代码,我可以在策略文件中为我的受信任代码定义代码库,我授予使用反射的权限。因此,来自另一个代码库的不受信任的代码没有此权限。 即
grant codeBase "file:/C:/path/to/trusted/code/classes" {
permission java.lang.reflect.ReflectPermission "suppressAccessChecks";
};
使用此策略文件,所有从 codeBase 中指定位置以外的其他位置加载的代码将没有任何权限。
class 的静态初始化程序和构造函数将始终与堆栈上的 class 一起执行,因此 AccessControlContext
中的适当 ProtectionDomain
。这并不是说可能存在其他问题,例如,实际上从父 class 加载程序获取 class,从而可以访问当前的 Thread
/ThreadGroup
/AppContext
/ThreadLocal
s.
除此之外,三参数 Class.forName
允许加载 class 而无需初始化。但是,使用父 class 加载程序中的代码加载 class 可能更典型。