Java 扩展URLClassLoader和重写getPermissions不起作用
当我试图在一个插件式的环境中实现一个沙盒时,我遇到了一个问题,这似乎正是我想要的,但是我无法让它工作,我做错了什么 我有以下设置:Java 扩展URLClassLoader和重写getPermissions不起作用,java,security,Java,Security,当我试图在一个插件式的环境中实现一个沙盒时,我遇到了一个问题,这似乎正是我想要的,但是我无法让它工作,我做错了什么 我有以下设置: final class ModURLClassLoader extends URLClassLoader { ModURLClassLoader(final URL[] urls) { super(urls); } ModURLClassLoader(final URL[] urls, final ClassLoader p
final class ModURLClassLoader extends URLClassLoader {
ModURLClassLoader(final URL[] urls) {
super(urls);
}
ModURLClassLoader(final URL[] urls, final ClassLoader parent) {
super(urls, parent);
}
ModURLClassLoader(final URL[] urls, final ClassLoader parent, final URLStreamHandlerFactory factory) {
super(urls, parent, factory);
}
@Override
protected PermissionCollection getPermissions(final CodeSource codesource) {
PermissionCollection permissionCollection = super.getPermissions(codesource);
//give no permissions to the codesource
return permissionCollection;
}
@Override
protected Class<?> loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
SecurityManager sm = System.getSecurityManager();
if (sm != null) {
int i = name.lastIndexOf('.');
if (i != -1) {
sm.checkPackageAccess(name.substring(0, i));
}
}
return super.loadClass(name, resolve);
}
}
它加载一个不受信任的JAR,该JAR有一个实现ECSMod
的类,我已经确认clazz
和ECSMod
都属于ModURLClassLoader
的实例
然后,恶意代码:
public final class UntrustedEvilMod implements ECSMod {
@Override
public void setupGame(final ECSGame game) {
System.exit(0);
}
}
其中ECSMod
和ECSGame
是属于插件(也称为mod)API并驻留在原始类加载器中的类
我在没有安全经理的情况下运行这个,因为我相信在这种情况下这是不必要的?由于ModURLClassLoader
定义了安全性
为什么这不起作用,这意味着它仍然会导致程序退出,而我本来想要一个
AccessControlException
?系统。exit
将调用SecurityManager
,调用方式与loadClass
方法类似。因此,当getSecurityManager
为null
时,权限将不会被检查。@TomHawtin tackline在提供默认安全管理器并授予所有权限时,权限不起作用,或者关键的错误是?仅将所有权限授予游戏,而不授予mod code?/我想,我尝试调试的第一个地方是在getPermissions
中使用System.err.println(permissionCollection.implies)(新的运行时权限(“exitVM.0”));
@TomHawtin-tackline打印为false,这意味着该类加载器没有执行此类代码的权限……但是我现在已经用安全策略文件实现了它,对于这个用例来说,这些文件似乎工作得很好。
public final class UntrustedEvilMod implements ECSMod {
@Override
public void setupGame(final ECSGame game) {
System.exit(0);
}
}