java—是否可以对一个可运行的

ecr0jaav  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(294)

是否可以在java中沙盒我的runnable?给定一个runnable,我希望其中的代码(以及它产生的任何线程)在一个沙盒中运行,该沙盒只允许代码访问filesystem上的特定路径。一旦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);
6ovsh4lw

6ovsh4lw1#

这个 doPrivileged 限制权限的技术只适用于不滥用其位置的受信任代码(例如,通过调用 doPrivileged 本身)。例如,作为一个防止xml包含的层非常有用,但不是不受信任的插件。
您可以在运行时使用自定义命令加载具有特定权限的代码 ClassLoader ,但如果需要权限,则必须重新加载代码。
对象能力模型提供了一个“纯”动态解决方案。容器向插件传递一个能够执行特权操作的对象。在内部,对象的方法可以是由 doPrivileged . 关键的是,这些操作只能通过一个示例使用,不允许非特权代码示例化它。这类似于, FileOpenService 在jnlp/webstart中,如果忽略 ServiceMangaer . 在jdk内部,您可能会看到 Unsafe 以及 SharedSecrets ,尽管这更多的是为了避免重复的安全检查。

相关问题