java - 是否可以仅对 Runnable 进行沙箱处理

标签 java sandbox java-security-manager

是否可以在 Java 中对我的 Runnable 进行沙箱处理?给定一个 Runnable,我希望其中的代码(以及它生成的任何线程)在沙箱中运行,该沙箱只允许代码访问文件系统上的特定路径。一旦 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);

最佳答案

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

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

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

关于java - 是否可以仅对 Runnable 进行沙箱处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53657891/

相关文章:

java - 如何判断用户的java代码是否编译成功?

c# - 从 Unity3D 发出测试请求

azure - 'concierge subscription' 的订阅在云 'AzureCloud' 中有不止一场匹配

java - 当值不在环境文件中时 spring 属性文件的行为

java - 从 Java 执行命令行程序

java - 从 JSON 输出 jersey moxy 中删除 "type"

java - 如何在没有 SecurityManager 的情况下创建 java RMI 程序,因为它已被弃用?

java - StAX Cursor API 和 Iterator API 有什么区别?

java - VM 初始化期间发生错误,无法为对象堆保留足够的空间 - Spring Tool Suite?