当前位置: 首页 > 知识库问答 >
问题:

是否可以仅对Runnable进行沙盒

宇文鸿振
2023-03-14

是否可以在 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);

共有1个答案

鲍宁
2023-03-14

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

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

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

 类似资料:
  • 我目前正在开发一个嵌入JCEF用于前端交互的IDEA扩展。一旦用户单击按钮,将执行中实现的方法,并执行一项耗时的任务。 这个耗时的任务是在一个方法中实现的(在主线程以外的线程上异步执行,以防UI被冻结),并以如下形式包装

  • 嗨,Dynamodb社区, 因此,所讨论的表是MLA_USER_AUTH。正如您所看到的,它有As分区键和As排序键。我希望能够使用用户id和电子邮件查询数据库。 有时我需要查找与电子邮件关联的用户,有时还需要查找用户ID。电子邮件和用户ID属性对于每个访问者都是唯一的。有什么办法可以做到吗? 这是我目前的查询。这显然行不通。当它抛出错误时:ValidationExc0019:查询条件错过了关键架

  • 问题内容: 我有一个vpn连接,当我运行python -m SimpleHTTPServer时,它在0.0.0.0:8000上提供服务,这意味着可以通过本地主机 和 我的真实IP访问它。我不想让机器人扫描我,并且对仅通过本地主机访问服务器感兴趣。 可能吗? 也欢迎任何其他可以使用命令行立即执行的简单http服务器。 问题答案: 如果您阅读了源代码,您将看到只能在命令行上覆盖端口。如果你想改变它在服

  • 问题内容: 我有一个Java应用程序正在泄漏内存。我知道在垃圾回收期间哪些对象没有被释放,但是我无法确定引用它们的对象。 JVM内部保存的对象图是否具有某种可见性? 否则就有可能找出哪些对象引用了另一个对象? 问题答案: 在真正的基础上,您可以使用命令jhat和jmap从正在运行的Java进程中读取堆文件,然后对其进行处理- 它在本地端口上启动小型Web服务器。它并不是很容易阅读,但是您不必购买分

  • 我使用OpenSSL创建了一个自签名证书,如下所示: 然后,我在C#.NET4.0中编写了以下代码: 使用一些文章和答案中的解决方案,我有类,我试图在其中实现和注册签名描述: 我已经验证了hash的长度为字节,它返回一个。但是如果我使用var(20字节长),尽管中指定的算法是,但它可以工作,并使用算法对哈希进行签名。 另外,如果我打印,它的值是http://www.w3.org/2000/09/x

  • 我正在编写一个带有事务回滚的简单json数据库。我需要向一个文件追加一行文本,然后根据追加是否成功,将成功或失败记录到另一个文件。如果需要,第二个文件用于回滚。因此,在继续之前,我需要确定写操作是否成功。 我使用stream.write追加我的文本行,其中包括一个回调,应该验证写操作的成功或失败。 然后我在下面的URL上的NodeJS文档中读到了这个不幸的消息https://nodejs.org/

  • 问题内容: 我是否可以制作仅适用于字符串的Array扩展? 问题答案: 从Swift 2开始,这可以通过 协议扩展 来实现,该 协议扩展 为符合类型的类型(可选地受其他约束限制)提供方法和属性实现。 一个简单的例子:为所有符合(例如)的类型定义一个方法,其中sequence元素为: 不能直接为扩展方法定义扩展方法,而只能为符合某种协议(带有可选约束)的所有类型定义扩展方法。因此,必须找到一种协议,

  • 问题内容: 我是C ++中静态元编程的迷。我知道Java现在有了泛型。这是否意味着在Java中可以进行静态元编程(即,编译时程序执行)?如果是这样,任何人都可以推荐任何好的资源,以便在其中可以了解更多的信息? 问题答案: 这个问题已经有10多年的历史了,但是我仍然缺少一个答案。这是: 是的 ,但不是 因为 泛型,并且注释与C ++完全相同。 从Java 6开始,我们具有可插入注释处理api。静态元