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