Java沙箱。使用SecurityManager重定向I / O访问

时间:2010-12-01 08:59:14

标签: java sandbox securitymanager

目前我正在尝试编写Sandbox来运行不受信任的Java代码。我们的想法是将Java应用程序与访问文件系统或网络套接字隔离开来。我现在的解决方案是重写了SecurityManager,禁止对IO或网络的任何访问。

现在我不想禁止,而是将调用重定向到文件系统,即如果应用程序想要写入“/ home / user / application.txt”,文件的路径应该是替换为“/ temp / trusted_folder / application.txt”之类的东西。所以基本上我想允许应用程序仅在某个特定文件夹中访问文件系统,并将所有其他调用重定向到此文件夹。

所以这是来自 FileOutputStream 类的方法,其中询问SM,是否有权写入给定路径。

 public FileOutputStream(File file, boolean append)
    throws FileNotFoundException
{
    String name = (file != null ? file.getPath() : null);
    SecurityManager security = System.getSecurityManager();
    if (security != null) {
        security.checkWrite(name);
    }
    if (name == null) {
        throw new NullPointerException();
    }
    fd = new FileDescriptor();
    fd.incrementAndGetUseCount();
    this.append = append;
    if (append) {
        openAppend(name);
    } else {
        open(name);
    }
}

显然,SM无法访问FileOutputStream并且无法更改方法中的内部变量(如 name file )或以某种方式影响执行顺序,除非抛出SecurityException。我明白,访问内部字段违反了面向对象的原则,我明白,局部变量是可见的,只存在于声明它们的方法中。

所以我的问题是:有没有办法让Security Manager替换对文件系统的调用?如果没有,是否还有其他方法可以用来做到这一点?

我希望我足够清楚。

4 个答案:

答案 0 :(得分:6)

现在Java是开源的,您可以将源代码下载到FileOutputStream,修改其源代码以强制执行您希望的任何约束,重新编译它,将其添加到jar中,并将该JAR添加到JVM的bootloader classpath:

java -Xbootclasspath/p:myModifiedJavaClasses.jar sandbox.Main -run untrusted.Main

JVM现在将使用java.io.FileOutputStream的实现而不是通常的实现。对需要特殊沙盒重定向逻辑的所有JSE类进行冲洗和重复。

它不是最便携或易于部署的解决方案,因为它需要“在VM之外”修改启动参数,但在某些情况下,此解决方案可能是可接受且有效的。

答案 1 :(得分:5)

SecurityManager不能这样做,它只能说是或否。

我可以想到两个选择:

  1. 使用文件系统在操作系统级别执行某些操作。有chroot jails之类的东西。这对应用程序来说是透明的,但需要在Java之外工作。

  2. 为应用程序提供API,为其打开FileOutputStream。 API层可以决定文件的来源,并且具有特权(在安全管理器术语中)可以从任何地方打开文件。当然,这要求沙盒应用程序直接使用您的API而不是java.io.File。但它也更加灵活,在某些时候,应用程序可能需要了解沙箱并使用沙箱API,就像在Java WebStart for example上一样。

答案 2 :(得分:0)

我不认为可以做到。 安全管理器旨在拒绝访问特定操作,而不是重定向IO或执行其他类似操作。

即使有可能通过一些严肃的反思hackery,它可能无法在不同的jvm供应商之间移植,甚至不同的操作系统运行相同的jvm。 (那是因为你需要操作OS特定的类)。

你应该在较低的层次上尝试做什么,参见chroot for linux和其他更重的虚拟化技术。

答案 3 :(得分:0)

我认为你想要做的事情已经由Wealthfront的工程师实施了 这是他们关于它的博客文章:http://eng.wealthfront.com/2010/11/less-io-for-your-java-unit-tests.html