是否有可能将一个Runnable沙箱化

问题描述 投票:3回答:1

是否可以在Java中将我的Runnable沙箱化?给定一个Runnable,我希望其中的代码(以及它产生的任何线程)在沙箱中运行,该沙箱仅允许代码访问fileystem上的特定路径。一旦Runnable完成,线程应返回到它具有的任何普通权限,而所有其他产生的线程仍将应用文件系统限制。

我想在运行时执行此操作。这意味着我要避免创建策略文件并将自定义参数传递给JVM。到目前为止,我已经能够将沙箱应用到我的整个应用程序中,但是我还没有找到一种方法来将其限定为仅在当前线程中运行的Runnable ...

if (System.getSecurityManager() == null) {
    System.setSecurityManager(new SecurityManager());
}

CodeSource nullSource = new CodeSource(null, (CodeSigner[]) null);

PermissionCollection perms = new Permissions();
perms.add(new FilePermission(path.toAbsolutePath().toString() + "/*", "read"));

ProtectionDomain domain = new ProtectionDomain(nullSource, perms);
AccessControlContext safeContext = new AccessControlContext(
        new ProtectionDomain[]{domain});

AccessController.doPrivileged((PrivilegedAction) () -> {
    try {
        r.run();
    } catch (Exception e) {
        throw new IllegalStateException(e);
    }
    return null;
}, safeContext);
java sandbox java-security-manager
1个回答
1
投票

doPrivileged限制权限的技术仅适用于不滥用其位置的可信代码(例如,通过调用doPrivileged本身)。例如,作为防止XML包含的层非常有用,但对于不受信任的插件却非常有用。

您可以使用自定义ClassLoader在运行时以特定的权限加载代码,但如果需要这些权限,则必须重新加载代码。

Object Capability Model提供了“纯”动态解决方案。容器传递了能够执行特权操作的插件一个对象。在内部,对象的方法可以只是doPrivileged包围的动作。至关重要的是,这些操作仅可通过实例使用,并且不允许特权代码实例化它。如果忽略FileOpenService,则类似于JNLP / WebStart中的ServiceMangaer。在JDK内部,您可能会看到UnsafeSharedSecrets之类的内容,尽管它们更多地是关于避免重复进行安全检查。

© www.soinside.com 2019 - 2024. All rights reserved.