Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展URLClassLoader和重写getPermissions不起作用_Java_Security - Fatal编程技术网

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);
    }
}